diff --git a/.github/workflows/run-viewer-tests.yml b/.github/workflows/run-viewer-tests.yml new file mode 100644 index 00000000..46da2b15 --- /dev/null +++ b/.github/workflows/run-viewer-tests.yml @@ -0,0 +1,43 @@ +name: Run Viewer Tests + +on: + push: + branches: [ master ] + paths: + - 'xircuits-graph-viewer/**' + pull_request: + branches: [ "*" ] + paths: + - 'xircuits-graph-viewer/**' + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Install dependencies + working-directory: xircuits-graph-viewer + run: pnpm install + + - name: Build core + working-directory: xircuits-graph-viewer/packages/core + run: pnpm build + + - name: Run tests + working-directory: xircuits-graph-viewer + run: node_modules/.bin/vitest run diff --git a/xircuits-graph-viewer/.gitignore b/xircuits-graph-viewer/.gitignore new file mode 100644 index 00000000..b9470778 --- /dev/null +++ b/xircuits-graph-viewer/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/xircuits-graph-viewer/README.md b/xircuits-graph-viewer/README.md new file mode 100644 index 00000000..87329a77 --- /dev/null +++ b/xircuits-graph-viewer/README.md @@ -0,0 +1,220 @@ +# xircuits-graph-viewer + +Pure SVG renderer for `.xircuits` workflow files. Parses the JSON format and produces self-contained SVG that visually matches the Xircuits editor. + +![HelloXircuits rendered](./xircuits-hello.png) + +## Packages + +| Package | npm | Purpose | +|---------|-----|---------| +| `@xpressai/xircuits-viewer` | [![npm](https://img.shields.io/npm/v/@xpressai/xircuits-viewer)](https://www.npmjs.com/package/@xpressai/xircuits-viewer) | Parser + SVG renderer. Zero runtime deps. | +| `@xpressai/xircuits-viewer-react` | [![npm](https://img.shields.io/npm/v/@xpressai/xircuits-viewer-react)](https://www.npmjs.com/package/@xpressai/xircuits-viewer-react) | React components (interactive + SSR-safe). | +| `docusaurus-plugin-xircuits` | *coming soon* | Docusaurus plugin — drop-in `` for docs. | + +## Quick Start + +### React + +```bash +npm install @xpressai/xircuits-viewer @xpressai/xircuits-viewer-react +``` + +**Point it at a `.xircuits` file** — that's it: + +```tsx +import { XircuitsGraph } from '@xpressai/xircuits-viewer-react'; + +// src accepts any URL: uploaded file path, API endpoint, static asset, etc. + +``` + +With options: + +```tsx + console.log(node.name)} +/> +``` + +**Static rendering** (SSR-safe, no client JS needed): + +```tsx +import { XircuitsGraphStatic } from '@xpressai/xircuits-viewer-react'; + + +``` + +You can also pass pre-loaded JSON via `data` instead of `src`: + +```tsx +import workflow from './MyWorkflow.xircuits'; + + +``` + +**Live component preview** — render a single xircuits component from its Python source. The drop-in version needs two lines; bring your own editor (CodeMirror, Monaco, etc.) via the `editor` prop. See [the react package README](./packages/react/README.md#live-component-preview-python--node) for examples. + +```tsx +import { ComponentPreview } from '@xpressai/xircuits-viewer-react'; + + +``` + +### Core (framework-agnostic) + +Works with Svelte, Vue, plain HTML, Node.js — anything. + +```bash +npm install @xpressai/xircuits-viewer +``` + +**From a URL** (browser): + +```js +import { renderFromUrl } from '@xpressai/xircuits-viewer'; + +const svg = await renderFromUrl('/workflows/MyWorkflow.xircuits', { theme: 'dark' }); +document.getElementById('viewer').innerHTML = svg; +``` + +**From JSON data**: + +```js +import { renderXircuits } from '@xpressai/xircuits-viewer'; + +const svg = renderXircuits(workflowJson, { theme: 'dark' }); +``` + +**With pan/zoom**: + +```js +import { parse, renderToElement } from '@xpressai/xircuits-viewer'; +import { attachPanZoom } from '@xpressai/xircuits-viewer/interaction'; + +const res = await fetch('/workflows/MyWorkflow.xircuits'); +const svg = renderToElement(parse(await res.json()), { theme: 'dark' }); +document.body.appendChild(svg); +const { destroy } = attachPanZoom(svg); +``` + +### Docusaurus + +A dedicated plugin is in progress (`docusaurus-plugin-xircuits`) that will provide a drop-in `` component with loading states, floating zoom controls, and automatic theme sync. + +In the meantime, see `docs/` for a working Docusaurus integration using the core + react packages directly. + +## API + +### Core + +| Function | Description | +|----------|-------------| +| `renderFromUrl(url, options?)` | Fetch a `.xircuits` URL and return SVG string. Browser only. | +| `renderXircuits(json, options?)` | One-shot: parse JSON + render to SVG string. | +| `parse(json)` | Parse `.xircuits` JSON into `XGraph`. | +| `parsePythonComponent(src, options?)` | Parse Python component source into `{ graph, error, warnings }`. | +| `renderToString(graph, options?)` | Render `XGraph` to SVG string. Works in Node.js and browsers. | +| `renderToElement(graph, options?)` | Render `XGraph` to DOM `SVGSVGElement`. Browser only. | +| `validate(json)` | Validate a `.xircuits` file without parsing. | +| `attachPanZoom(svg, options?)` | Add mouse/touch pan and zoom to rendered SVG. | + +### React + +| Component | Props | Description | +|-----------|-------|-------------| +| `` | `src` \| `data` \| `graph`, `theme`, `interactive`, `height`, ... | Interactive viewer with pan/zoom. | +| `` | `src` or `data`, `theme`, `height`, ... | Static SVG output, SSR-safe. | +| `` | `value`, `onChange`, `editor?`, `theme`, ... | Live preview of a single xircuits component from Python source. | + +### `RenderOptions` + +```ts +{ + theme?: 'dark' | 'light'; // default: 'dark' + width?: number; // SVG width + height?: number; // SVG height + padding?: number; // viewport padding (default: 40) + fitView?: boolean; // auto-fit viewBox (default: true) + className?: string; // root SVG class + nodeClassFn?: (node) => string; // custom per-node CSS classes + edgeClassFn?: (edge) => string; // custom per-edge CSS classes +} +``` + +## Development + +```bash +pnpm install + +# Build core +cd packages/core && pnpm build + +# Run tests (24 tests) +cd ../.. +node_modules/.bin/vitest run +``` + +### Running the demos + +**Upload demo** (drag-and-drop .xircuits viewer): + +```bash +cd upload-demo +npm install +npm run dev +# Opens at http://localhost:5173 +``` + +**Docusaurus docs** (workflow documentation site): + +```bash +cd docs +npm install +npm start +# Opens at http://localhost:3000 +``` + +### Project Structure + +``` +xircuits-graph-viewer/ +├── packages/ +│ ├── core/src/ # @xpressai/xircuits-viewer (zero runtime deps) +│ │ ├── types.ts # XGraph, XNode, XEdge, XPort +│ │ ├── parser/ # .xircuits JSON → XGraph +│ │ ├── layout/ # Node metrics, viewBox computation +│ │ ├── render/ # SVG generation (nodes, ports, edges, defs) +│ │ ├── svg/ # Builder utilities, bezier curves +│ │ └── interaction/ # Pan/zoom (browser-only) +│ └── react/src/ # @xpressai/xircuits-viewer-react +│ ├── XircuitsGraph.tsx # Interactive (client-side) +│ └── XircuitsGraphStatic.tsx # SSR-safe (string output) +├── upload-demo/ # Standalone drag-and-drop viewer +├── docs/ # Docusaurus documentation site +├── __tests__/ # Parser + render tests +└── vitest.config.ts +``` + +## Publishing to npm + +```bash +# Build both packages +cd packages/core && pnpm build +cd ../react && pnpm build + +# Update workspace:* → actual version in react/package.json +# "@xpressai/xircuits-viewer": "workspace:*" → "@xpressai/xircuits-viewer": "^0.1.0" + +# Publish (core first, react depends on it) +cd ../core && npm publish --access public +cd ../react && npm publish --access public +``` + +## License + +MIT diff --git a/xircuits-graph-viewer/__tests__/fixtures/HelloXircuits.xircuits b/xircuits-graph-viewer/__tests__/fixtures/HelloXircuits.xircuits new file mode 100644 index 00000000..4a2aa53e --- /dev/null +++ b/xircuits-graph-viewer/__tests__/fixtures/HelloXircuits.xircuits @@ -0,0 +1,623 @@ +{ + "id": "11b9d835-f7c3-4b78-a927-bec01ae39956", + "offsetX": 138.70289808530393, + "offsetY": 112.11086262472926, + "zoom": 62.96296034657244, + "gridSize": 0, + "layers": [ + { + "id": "e8c7e3ab-cc6d-4d15-8c15-25b3b24cacd0", + "type": "diagram-links", + "isSvg": true, + "transformed": true, + "models": { + "0c51cfd5-b730-488b-a722-a7a93528866e": { + "id": "0c51cfd5-b730-488b-a722-a7a93528866e", + "type": "triangle-link", + "selected": false, + "source": "15df3e50-91c2-47a1-9c48-59f040abc728", + "sourcePort": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "points": [ + { + "id": "0ddd19f6-a0da-440f-a802-3932fb342c9a", + "type": "point", + "x": 193.281, + "y": 118.015 + }, + { + "id": "22ff1dfd-b7f5-4ce9-b642-296b831d0fdf", + "type": "point", + "x": 353.929, + "y": 196.811 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "901eb298-883a-4803-9fca-d3ed4f926688": { + "id": "901eb298-883a-4803-9fca-d3ed4f926688", + "type": "triangle-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "e4118ad4-6463-45d0-acfe-278473f33171", + "points": [ + { + "id": "c3b6116d-aaf4-459e-9c1d-2eac10f71110", + "type": "point", + "x": 454.253, + "y": 196.811 + }, + { + "id": "7640dc8e-dddc-4cd2-ac4f-e800452a3f2b", + "type": "point", + "x": 708.119, + "y": 276.568 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "11ae19ab-0615-4e3f-ba1d-6dea826154b3": { + "id": "11ae19ab-0615-4e3f-ba1d-6dea826154b3", + "type": "triangle-link", + "selected": false, + "source": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "sourcePort": "8d80f536-fec5-41ca-a82a-23972097d32f", + "target": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "targetPort": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "points": [ + { + "id": "e8436c2a-9c79-41f5-ae34-5c6c90852abe", + "type": "point", + "x": 800.006, + "y": 276.568 + }, + { + "id": "f692f0e3-1d03-4ebf-9e2f-c5eaa5c2152b", + "type": "point", + "x": 927.448, + "y": 408.385 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "9d08656b-7508-4eae-a449-f50a3a125289": { + "id": "9d08656b-7508-4eae-a449-f50a3a125289", + "type": "parameter-link", + "selected": false, + "source": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "sourcePort": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "points": [ + { + "id": "16128708-cec8-4c5c-aa18-eccc1d8aae67", + "type": "point", + "x": 201.892, + "y": 495.92 + }, + { + "id": "c6baf25d-ff3d-40c2-b43e-0430d3a05514", + "type": "point", + "x": 353.929, + "y": 228.779 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "14625014-44cf-4966-b34f-7b5d2023afe6": { + "id": "14625014-44cf-4966-b34f-7b5d2023afe6", + "type": "parameter-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "points": [ + { + "id": "b92a9e9d-47ca-45df-b50b-2725a1077ab2", + "type": "point", + "x": 454.253, + "y": 212.795 + }, + { + "id": "1d373617-9c69-4839-aea5-ec027d58b4d3", + "type": "point", + "x": 708.119, + "y": 292.552 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f": { + "id": "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f", + "type": "parameter-link", + "selected": false, + "source": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "sourcePort": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "points": [ + { + "id": "86e6c64b-d0b2-40e3-b746-dc56b9c2e56b", + "type": "point", + "x": 200.295, + "y": 422.066 + }, + { + "id": "fd5a730e-8422-4d27-95fb-b954065393ca", + "type": "point", + "x": 353.929, + "y": 212.795 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + } + } + }, + { + "id": "b1e2c329-efb4-4370-8927-38e61e23c5d2", + "type": "diagram-nodes", + "isSvg": false, + "transformed": true, + "models": { + "15df3e50-91c2-47a1-9c48-59f040abc728": { + "id": "15df3e50-91c2-47a1-9c48-59f040abc728", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Start", + "borderColor": "rgb(0,192,255)" + }, + "x": 155.159, + "y": 86.223, + "ports": [ + { + "id": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "type": "default", + "extras": {}, + "x": 185.787, + "y": 110.521, + "name": "out-0", + "alignment": "right", + "parentNode": "15df3e50-91c2-47a1-9c48-59f040abc728", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Start", + "color": "rgb(255,102,102)", + "portsInOrder": [], + "portsOutOrder": [ + "1bfb241e-2860-4cd8-887c-ace64dc6b9da" + ] + }, + "4f6b8a78-d1a9-4510-b31e-131531a3ce23": { + "id": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Finish", + "borderColor": "rgb(0,192,255)" + }, + "x": 918.478, + "y": 376.596, + "ports": [ + { + "id": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "type": "default", + "extras": {}, + "x": 919.954, + "y": 400.891, + "name": "in-0", + "alignment": "left", + "parentNode": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Finish", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "738f2d81-79ca-414f-a6c3-43ebcdc825b4" + ], + "portsOutOrder": [] + }, + "7affbe5e-678b-4a5c-ad27-c5c4a12fc733": { + "id": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 133.861, + "y": 464.122, + "ports": [ + { + "id": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "type": "default", + "extras": {}, + "x": 194.398, + "y": 488.426, + "name": "out-0", + "alignment": "right", + "parentNode": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": false, + "label": "Xircuits!", + "varName": "Xircuits!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "bef4edd7-d310-463f-8ac3-dba1fb71e80e" + ] + }, + "bd066e96-970a-4477-86c7-fdc2dc88c4a1": { + "id": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 134.61, + "y": 390.271, + "ports": [ + { + "id": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "type": "default", + "extras": {}, + "x": 192.801, + "y": 414.572, + "name": "out-0", + "alignment": "right", + "parentNode": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": false, + "label": "Hello ", + "varName": "Hello ", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "d9cf851b-f1de-4ab8-9244-9e8b24399ffd" + ] + }, + "16949768-609b-4f49-9637-1362acd39ebe": { + "id": "16949768-609b-4f49-9637-1362acd39ebe", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 16, + "end_lineno": 22 + } + ] + }, + "x": 344.958, + "y": 165.014, + "ports": [ + { + "id": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 189.317, + "name": "in-0", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 205.301, + "name": "parameter-string-a", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": true, + "label": "a", + "varName": "a", + "portType": "", + "dataType": "string" + }, + { + "id": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 221.285, + "name": "parameter-string-b", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": true, + "label": "b", + "varName": "b", + "portType": "", + "dataType": "string" + }, + { + "id": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 189.317, + "name": "out-0", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 205.301, + "name": "parameter-out-string-out", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": false, + "label": "out", + "varName": "out", + "portType": "", + "dataType": "" + } + ], + "name": "ConcatString", + "color": "rgb(153,51,204)", + "portsInOrder": [ + "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "d487a5cd-ffe5-4fba-800f-4651634f1ff5" + ], + "portsOutOrder": [ + "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "625956f7-cee1-4476-a9e7-ea34af1805d2" + ] + }, + "c67603e4-dfda-4c58-b6ab-0952eba75254": { + "id": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ] + }, + "x": 699.144, + "y": 244.771, + "ports": [ + { + "id": "e4118ad4-6463-45d0-acfe-278473f33171", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 269.074, + "name": "in-0", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 285.058, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "8d80f536-fec5-41ca-a82a-23972097d32f", + "type": "default", + "extras": {}, + "x": 792.512, + "y": 269.074, + "name": "out-0", + "alignment": "right", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(102,51,102)", + "portsInOrder": [ + "e4118ad4-6463-45d0-acfe-278473f33171", + "57336bb8-dbbf-48d2-88ac-2de9f15d6df6" + ], + "portsOutOrder": [ + "8d80f536-fec5-41ca-a82a-23972097d32f" + ] + }, + "35a75ed7-cd63-45d0-83a8-82b6f2a1e295": { + "id": "35a75ed7-cd63-45d0-83a8-82b6f2a1e295", + "type": "custom-node", + "selected": true, + "extras": { + "type": "comment", + "commentInput": "[1] Xircuits workflows are designed around \n the concept of linking nodes and configuring \n them with specific parameters." + }, + "x": -2.913, + "y": -76.821, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce": { + "id": "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[2] The blue flowing link connecting ▶ ports\n represent the sequence of execution." + }, + "x": 339.679, + "y": 51.942, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "ef86f386-48c9-456c-9b3c-7af11c9c4575": { + "id": "ef86f386-48c9-456c-9b3c-7af11c9c4575", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[4] You can also pass parameters \n from one component node to another." + }, + "x": 381.006, + "y": 339.556, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "f2c978ce-51d3-4327-a01b-2490500dffb4": { + "id": "f2c978ce-51d3-4327-a01b-2490500dffb4", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[3] Literals are one way of supplying parameters\n to your component node.\n You can double click literals to edit their value." + }, + "x": -143.813, + "y": 231.319, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84": { + "id": "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[5] Once you're done, you can compile \n and execute the workflow." + }, + "x": 824.994, + "y": 456.905, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + } + } + } + ] +} \ No newline at end of file diff --git a/xircuits-graph-viewer/__tests__/minify.test.ts b/xircuits-graph-viewer/__tests__/minify.test.ts new file mode 100644 index 00000000..bb7b9c05 --- /dev/null +++ b/xircuits-graph-viewer/__tests__/minify.test.ts @@ -0,0 +1,166 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { parse } from '../packages/core/src/parser/parse.js'; +import { + minify, + minifyWithStats, +} from '../packages/core/src/minifier/index.js'; + +const fixtureDir = resolve(__dirname, 'fixtures'); + +function loadFixture(name: string): unknown { + return JSON.parse(readFileSync(resolve(fixtureDir, name), 'utf-8')); +} + +function collectIds(obj: unknown, out: Set = new Set()): Set { + if (obj && typeof obj === 'object') { + if (!Array.isArray(obj)) { + const o = obj as Record; + if (typeof o.id === 'string') out.add(o.id); + for (const v of Object.values(o)) collectIds(v, out); + } else { + for (const v of obj) collectIds(v, out); + } + } + return out; +} + +describe('minify (safe mode)', () => { + const input = loadFixture('HelloXircuits.xircuits'); + + it('produces valid .xircuits JSON that parse() accepts', () => { + const out = minify(input); + const reparsed = JSON.parse(out); + expect(() => parse(reparsed)).not.toThrow(); + }); + + it('preserves every original ID byte-for-byte', () => { + const out = minify(input); + const reparsed = JSON.parse(out); + const originalIds = collectIds(input); + const outputIds = collectIds(reparsed); + for (const id of originalIds) { + expect(outputIds.has(id)).toBe(true); + } + }); + + it('strips selected and locked keys throughout', () => { + const out = minify(input); + expect(out).not.toMatch(/"selected":/); + expect(out).not.toMatch(/"locked":/); + }); + + it('rounds coordinates to the requested precision', () => { + const out = minify(input, { precision: 0 }); + const reparsed = JSON.parse(out) as Record; + const layers = reparsed.layers as Array>; + const nodeLayer = layers.find(l => l.type === 'diagram-nodes')!; + for (const node of Object.values(nodeLayer.models as Record>)) { + expect(Number.isInteger(node.x)).toBe(true); + expect(Number.isInteger(node.y)).toBe(true); + } + }); + + it('honors non-zero precision', () => { + const out = minify(input, { precision: 1 }); + const reparsed = JSON.parse(out) as Record; + const layers = reparsed.layers as Array>; + const nodeLayer = layers.find(l => l.type === 'diagram-nodes')!; + for (const node of Object.values(nodeLayer.models as Record>)) { + const x = node.x as number; + expect(Math.abs(x * 10 - Math.round(x * 10))).toBeLessThan(1e-9); + } + }); + + it('reports consistent stats', () => { + const { output, stats } = minifyWithStats(input); + expect(stats.outputBytes).toBe(new TextEncoder().encode(output).length); + expect(stats.mode).toBe('safe'); + expect(stats.nodes).toBeGreaterThan(0); + expect(stats.edges).toBeGreaterThan(0); + expect(stats.ports).toBeGreaterThan(0); + }); +}); + +describe('minify (aggressive mode)', () => { + const input = loadFixture('HelloXircuits.xircuits'); + + it('produces valid .xircuits JSON that parse() accepts', () => { + const out = minify(input, { aggressive: true }); + const reparsed = JSON.parse(out); + expect(() => parse(reparsed)).not.toThrow(); + }); + + it('replaces every original ID with a short form', () => { + const out = minify(input, { aggressive: true }); + const reparsed = JSON.parse(out); + const originalIds = collectIds(input); + const outputIds = collectIds(reparsed); + for (const id of originalIds) { + expect(outputIds.has(id)).toBe(false); + } + for (const id of outputIds) { + expect(id === 'g' || /^[nep]\d+$/.test(id)).toBe(true); + } + }); + + it('still resolves every link endpoint to a real node + port', () => { + const out = minify(input, { aggressive: true }); + const graph = parse(JSON.parse(out)); + const nodeIds = new Set(graph.nodes.map(n => n.id)); + const portIds = new Set(graph.nodes.flatMap(n => [...n.portsIn, ...n.portsOut]).map(p => p.id)); + + for (const edge of graph.edges) { + expect(nodeIds.has(edge.sourceNodeId)).toBe(true); + expect(nodeIds.has(edge.targetNodeId)).toBe(true); + expect(portIds.has(edge.sourcePortId)).toBe(true); + expect(portIds.has(edge.targetPortId)).toBe(true); + } + }); + + it('preserves port ordering after rename', () => { + const src = input as Record; + const origLayers = src.layers as Array>; + const origNodeLayer = origLayers.find(l => l.type === 'diagram-nodes')!; + const origModels = origNodeLayer.models as Record>; + + const out = minify(input, { aggressive: true }); + const reparsed = JSON.parse(out) as Record; + const newLayers = reparsed.layers as Array>; + const newNodeLayer = newLayers.find(l => l.type === 'diagram-nodes')!; + const newModels = newNodeLayer.models as Record>; + + const origNodes = Object.values(origModels); + const newNodes = Object.values(newModels); + expect(newNodes.length).toBe(origNodes.length); + + for (let i = 0; i < origNodes.length; i++) { + const origInCount = (origNodes[i].portsInOrder as string[]).length; + const origOutCount = (origNodes[i].portsOutOrder as string[]).length; + expect((newNodes[i].portsInOrder as string[]).length).toBe(origInCount); + expect((newNodes[i].portsOutOrder as string[]).length).toBe(origOutCount); + } + }); + + it('strips viewer-unused fields', () => { + const out = minify(input, { aggressive: true }); + expect(out).not.toMatch(/"curvyness":/); + expect(out).not.toMatch(/"selectedColor":/); + expect(out).not.toMatch(/"isSvg":/); + expect(out).not.toMatch(/"transformed":/); + expect(out).not.toMatch(/"alignment":/); + expect(out).not.toMatch(/"parentNode":/); + }); + + it('beats safe mode on size', () => { + const safe = minify(input, { aggressive: false }); + const aggr = minify(input, { aggressive: true }); + expect(aggr.length).toBeLessThan(safe.length); + }); + + it('tags stats as aggressive', () => { + const { stats } = minifyWithStats(input, { aggressive: true }); + expect(stats.mode).toBe('aggressive'); + }); +}); diff --git a/xircuits-graph-viewer/__tests__/parsePythonComponent.test.ts b/xircuits-graph-viewer/__tests__/parsePythonComponent.test.ts new file mode 100644 index 00000000..47603eb3 --- /dev/null +++ b/xircuits-graph-viewer/__tests__/parsePythonComponent.test.ts @@ -0,0 +1,155 @@ +import { describe, it, expect } from 'vitest'; +import { parsePythonComponent } from '../packages/core/src/parsePythonComponent.js'; + +describe('parsePythonComponent', () => { + it('returns an error on empty input', () => { + const r = parsePythonComponent(''); + expect(r.graph).toBeNull(); + expect(r.error).toBeTruthy(); + }); + + it('returns an error when no class is present', () => { + const r = parsePythonComponent('# just a comment\nx = 1\n'); + expect(r.graph).toBeNull(); + expect(r.error).toMatch(/class/i); + }); + + it('parses class name and default color when decorator missing', () => { + const r = parsePythonComponent(`class MyComp(Component):\n pass\n`); + expect(r.graph).not.toBeNull(); + expect(r.graph!.nodes[0].name).toBe('MyComp'); + expect(r.graph!.nodes[0].color).toBe('rgb(153,51,204)'); + expect(r.warnings.some(w => /decorator/i.test(w))).toBe(true); + }); + + it('extracts color from @xai_component decorator', () => { + const src = ` +@xai_component(color="green") +class Greeter(Component): + pass +`; + const r = parsePythonComponent(src); + expect(r.graph!.nodes[0].color).toBe('green'); + }); + + it('extracts InArg, InCompArg, OutArg, and BaseComponent ports', () => { + const src = ` +@xai_component(color="blue") +class Demo(Component): + name: InArg[str] + count: InCompArg[int] + out: OutArg[float] + body: BaseComponent +`; + const r = parsePythonComponent(src); + const node = r.graph!.nodes[0]; + + // Input params: name, count (plus auto flow-in ▶) + const paramIn = node.portsIn.filter(p => p.kind === 'parameter'); + expect(paramIn.map(p => p.varName)).toEqual(['name', 'count']); + expect(paramIn[0].dataType).toBe('string'); // str → string + expect(paramIn[1].dataType).toBe('int'); + + // Output params: out (plus auto flow-out ▶ and body flow) + const paramOut = node.portsOut.filter(p => p.kind === 'parameter'); + expect(paramOut.map(p => p.varName)).toEqual(['out']); + expect(paramOut[0].dataType).toBe('float'); + + // Flow ports: auto in ▶, auto out ▶, body (BaseComponent treated as flow-out) + expect(node.portsIn.some(p => p.kind === 'flow' && p.label === '▶')).toBe(true); + const outFlows = node.portsOut.filter(p => p.kind === 'flow'); + expect(outFlows.map(p => p.varName)).toEqual(['out-0', 'body']); + }); + + it('ignores docstring lines when scanning fields', () => { + const src = ` +@xai_component +class Demo(Component): + """This is a docstring. + + message: OutArg[str] + """ + real_in: InArg[str] +`; + const r = parsePythonComponent(src); + const names = r.graph!.nodes[0].portsIn + .filter(p => p.kind === 'parameter').map(p => p.varName); + expect(names).toEqual(['real_in']); + expect(r.graph!.nodes[0].portsOut.some(p => p.varName === 'message')).toBe(false); + }); + + it('stops scanning at def execute()', () => { + const src = ` +@xai_component +class Demo(Component): + real_in: InArg[str] + + def execute(self, ctx): + phantom: InArg[int] +`; + const r = parsePythonComponent(src); + const names = r.graph!.nodes[0].portsIn + .filter(p => p.kind === 'parameter').map(p => p.varName); + expect(names).toEqual(['real_in']); + }); + + it('handles missing generic type as null dataType', () => { + const src = ` +@xai_component +class Demo(Component): + body: BaseComponent +`; + const r = parsePythonComponent(src); + const body = r.graph!.nodes[0].portsOut.find(p => p.varName === 'body'); + expect(body).toBeDefined(); + expect(body!.dataType).toBeNull(); + }); + + it('normalises Python types to xircuits type names', () => { + const src = ` +@xai_component +class Demo(Component): + s: InArg[str] + b: InArg[bool] + lst: InArg[List[str]] + d: InArg[dict] + out: OutArg[Any] +`; + const r = parsePythonComponent(src); + const types = Object.fromEntries( + [...r.graph!.nodes[0].portsIn, ...r.graph!.nodes[0].portsOut] + .filter(p => p.kind === 'parameter') + .map(p => [p.varName, p.dataType]) + ); + expect(types).toMatchObject({ + s: 'string', + b: 'boolean', + lst: 'list', + d: 'dict', + out: 'any', + }); + }); + + it('can skip flow-in/flow-out injection via options', () => { + const src = ` +class Demo(Component): + pass +`; + const r = parsePythonComponent(src, { includeFlowIn: false, includeFlowOut: false }); + const node = r.graph!.nodes[0]; + expect(node.portsIn).toEqual([]); + expect(node.portsOut).toEqual([]); + }); + + it('tolerates non-xircuits python without crashing', () => { + const src = ` +def hello(): + return "world" + +print(hello()) +`; + const r = parsePythonComponent(src); + expect(r.graph).toBeNull(); + expect(r.error).toBeTruthy(); + }); +}); diff --git a/xircuits-graph-viewer/__tests__/parser.test.ts b/xircuits-graph-viewer/__tests__/parser.test.ts new file mode 100644 index 00000000..01d502f0 --- /dev/null +++ b/xircuits-graph-viewer/__tests__/parser.test.ts @@ -0,0 +1,116 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { parse } from '../packages/core/src/parser/parse.js'; +import { validate } from '../packages/core/src/parser/validate.js'; + +const fixtureDir = resolve(__dirname, 'fixtures'); + +function loadFixture(name: string) { + return JSON.parse(readFileSync(resolve(fixtureDir, name), 'utf-8')); +} + +describe('validate', () => { + it('validates a correct .xircuits file', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const result = validate(json); + expect(result.valid).toBe(true); + expect(result.errors).toHaveLength(0); + }); + + it('rejects non-object input', () => { + const result = validate('not an object'); + expect(result.valid).toBe(false); + }); + + it('rejects missing layers', () => { + const result = validate({ id: 'test' }); + expect(result.valid).toBe(false); + expect(result.errors).toContain('Missing or invalid "layers" array'); + }); +}); + +describe('parse', () => { + it('parses HelloXircuits correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + expect(graph.id).toBe('11b9d835-f7c3-4b78-a927-bec01ae39956'); + expect(graph.nodes.length).toBeGreaterThan(0); + expect(graph.edges.length).toBeGreaterThan(0); + }); + + it('classifies Start node correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const start = graph.nodes.find(n => n.name === 'Start'); + expect(start).toBeDefined(); + expect(start!.kind).toBe('start'); + expect(start!.color).toBe('rgb(255,102,102)'); + }); + + it('classifies Finish node correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const finish = graph.nodes.find(n => n.name === 'Finish'); + expect(finish).toBeDefined(); + expect(finish!.kind).toBe('finish'); + }); + + it('classifies Literal nodes correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const literals = graph.nodes.filter(n => n.kind === 'literal'); + expect(literals.length).toBe(2); // Two "Literal String" nodes + }); + + it('classifies Comment nodes correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const comments = graph.nodes.filter(n => n.kind === 'comment'); + expect(comments.length).toBe(5); + expect(comments[0].extras.commentInput).toBeDefined(); + }); + + it('classifies component nodes correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const concat = graph.nodes.find(n => n.name === 'ConcatString'); + expect(concat).toBeDefined(); + expect(concat!.kind).toBe('component'); + }); + + it('parses ports correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const concat = graph.nodes.find(n => n.name === 'ConcatString')!; + expect(concat.portsIn.length).toBe(3); // flow + a + b + expect(concat.portsOut.length).toBe(2); // flow + out + + const flowIn = concat.portsIn.find(p => p.kind === 'flow'); + expect(flowIn).toBeDefined(); + expect(flowIn!.label).toBe('▶'); + + const paramA = concat.portsIn.find(p => p.label === 'a'); + expect(paramA).toBeDefined(); + expect(paramA!.kind).toBe('parameter'); + expect(paramA!.dataType).toBe('string'); + }); + + it('parses edges correctly', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + + const flowEdges = graph.edges.filter(e => e.kind === 'flow'); + const dataEdges = graph.edges.filter(e => e.kind === 'data'); + + expect(flowEdges.length).toBe(3); // Start→Concat→Print→Finish + expect(dataEdges.length).toBe(3); // Two literals→Concat, Concat→Print + }); +}); diff --git a/xircuits-graph-viewer/__tests__/render.test.ts b/xircuits-graph-viewer/__tests__/render.test.ts new file mode 100644 index 00000000..9e5757c2 --- /dev/null +++ b/xircuits-graph-viewer/__tests__/render.test.ts @@ -0,0 +1,146 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { parse } from '../packages/core/src/parser/parse.js'; +import { renderToString } from '../packages/core/src/render/renderGraph.js'; +import { computeNodeMetrics } from '../packages/core/src/layout/metrics.js'; + +const fixtureDir = resolve(__dirname, 'fixtures'); + +function loadFixture(name: string) { + return JSON.parse(readFileSync(resolve(fixtureDir, name), 'utf-8')); +} + +describe('renderToString', () => { + it('renders HelloXircuits as valid SVG', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + const svg = renderToString(graph, { theme: 'dark' }); + + expect(svg).toContain(''); + }); + + it('includes node elements', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + const svg = renderToString(graph); + + expect(svg).toContain('xg-node--start'); + expect(svg).toContain('xg-node--finish'); + expect(svg).toContain('xg-node--component'); + expect(svg).toContain('xg-node--literal'); + expect(svg).toContain('xg-node--comment'); + }); + + it('includes edge elements', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + const svg = renderToString(graph); + + expect(svg).toContain('xg-edge--flow'); + expect(svg).toContain('xg-edge--data'); + }); + + it('includes gradient definitions', () => { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + const svg = renderToString(graph); + + expect(svg).toContain(' { + const json = loadFixture('HelloXircuits.xircuits'); + const graph = parse(json); + const svg = renderToString(graph); + + expect(svg).toContain(' + + +
+ + + diff --git a/xircuits-graph-viewer/demo/package.json b/xircuits-graph-viewer/demo/package.json new file mode 100644 index 00000000..6e471a60 --- /dev/null +++ b/xircuits-graph-viewer/demo/package.json @@ -0,0 +1,22 @@ +{ + "name": "xircuits-graph-viewer-demo", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "@xpressai/xircuits-viewer": "workspace:*", + "@xpressai/xircuits-viewer-react": "workspace:*" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.8.3", + "vite": "^6.3.1" + } +} diff --git a/xircuits-graph-viewer/demo/src/App.tsx b/xircuits-graph-viewer/demo/src/App.tsx new file mode 100644 index 00000000..c52a4442 --- /dev/null +++ b/xircuits-graph-viewer/demo/src/App.tsx @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; +import { parse, renderToString } from '@xpressai/xircuits-viewer'; +import helloXircuits from './fixtures/HelloXircuits.xircuits'; + +export function App() { + const [theme, setTheme] = useState<'dark' | 'light'>('dark'); + + const graph = parse(helloXircuits); + const svgString = renderToString(graph, { theme, fitView: true, padding: 40 }); + + return ( +
+

Xircuits Graph Viewer Demo

+
+
+ +
+
+
+
+ ); +} diff --git a/xircuits-graph-viewer/demo/src/fixtures/HelloXircuits.xircuits b/xircuits-graph-viewer/demo/src/fixtures/HelloXircuits.xircuits new file mode 100644 index 00000000..4a2aa53e --- /dev/null +++ b/xircuits-graph-viewer/demo/src/fixtures/HelloXircuits.xircuits @@ -0,0 +1,623 @@ +{ + "id": "11b9d835-f7c3-4b78-a927-bec01ae39956", + "offsetX": 138.70289808530393, + "offsetY": 112.11086262472926, + "zoom": 62.96296034657244, + "gridSize": 0, + "layers": [ + { + "id": "e8c7e3ab-cc6d-4d15-8c15-25b3b24cacd0", + "type": "diagram-links", + "isSvg": true, + "transformed": true, + "models": { + "0c51cfd5-b730-488b-a722-a7a93528866e": { + "id": "0c51cfd5-b730-488b-a722-a7a93528866e", + "type": "triangle-link", + "selected": false, + "source": "15df3e50-91c2-47a1-9c48-59f040abc728", + "sourcePort": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "points": [ + { + "id": "0ddd19f6-a0da-440f-a802-3932fb342c9a", + "type": "point", + "x": 193.281, + "y": 118.015 + }, + { + "id": "22ff1dfd-b7f5-4ce9-b642-296b831d0fdf", + "type": "point", + "x": 353.929, + "y": 196.811 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "901eb298-883a-4803-9fca-d3ed4f926688": { + "id": "901eb298-883a-4803-9fca-d3ed4f926688", + "type": "triangle-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "e4118ad4-6463-45d0-acfe-278473f33171", + "points": [ + { + "id": "c3b6116d-aaf4-459e-9c1d-2eac10f71110", + "type": "point", + "x": 454.253, + "y": 196.811 + }, + { + "id": "7640dc8e-dddc-4cd2-ac4f-e800452a3f2b", + "type": "point", + "x": 708.119, + "y": 276.568 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "11ae19ab-0615-4e3f-ba1d-6dea826154b3": { + "id": "11ae19ab-0615-4e3f-ba1d-6dea826154b3", + "type": "triangle-link", + "selected": false, + "source": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "sourcePort": "8d80f536-fec5-41ca-a82a-23972097d32f", + "target": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "targetPort": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "points": [ + { + "id": "e8436c2a-9c79-41f5-ae34-5c6c90852abe", + "type": "point", + "x": 800.006, + "y": 276.568 + }, + { + "id": "f692f0e3-1d03-4ebf-9e2f-c5eaa5c2152b", + "type": "point", + "x": 927.448, + "y": 408.385 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "9d08656b-7508-4eae-a449-f50a3a125289": { + "id": "9d08656b-7508-4eae-a449-f50a3a125289", + "type": "parameter-link", + "selected": false, + "source": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "sourcePort": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "points": [ + { + "id": "16128708-cec8-4c5c-aa18-eccc1d8aae67", + "type": "point", + "x": 201.892, + "y": 495.92 + }, + { + "id": "c6baf25d-ff3d-40c2-b43e-0430d3a05514", + "type": "point", + "x": 353.929, + "y": 228.779 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "14625014-44cf-4966-b34f-7b5d2023afe6": { + "id": "14625014-44cf-4966-b34f-7b5d2023afe6", + "type": "parameter-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "points": [ + { + "id": "b92a9e9d-47ca-45df-b50b-2725a1077ab2", + "type": "point", + "x": 454.253, + "y": 212.795 + }, + { + "id": "1d373617-9c69-4839-aea5-ec027d58b4d3", + "type": "point", + "x": 708.119, + "y": 292.552 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f": { + "id": "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f", + "type": "parameter-link", + "selected": false, + "source": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "sourcePort": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "points": [ + { + "id": "86e6c64b-d0b2-40e3-b746-dc56b9c2e56b", + "type": "point", + "x": 200.295, + "y": 422.066 + }, + { + "id": "fd5a730e-8422-4d27-95fb-b954065393ca", + "type": "point", + "x": 353.929, + "y": 212.795 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + } + } + }, + { + "id": "b1e2c329-efb4-4370-8927-38e61e23c5d2", + "type": "diagram-nodes", + "isSvg": false, + "transformed": true, + "models": { + "15df3e50-91c2-47a1-9c48-59f040abc728": { + "id": "15df3e50-91c2-47a1-9c48-59f040abc728", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Start", + "borderColor": "rgb(0,192,255)" + }, + "x": 155.159, + "y": 86.223, + "ports": [ + { + "id": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "type": "default", + "extras": {}, + "x": 185.787, + "y": 110.521, + "name": "out-0", + "alignment": "right", + "parentNode": "15df3e50-91c2-47a1-9c48-59f040abc728", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Start", + "color": "rgb(255,102,102)", + "portsInOrder": [], + "portsOutOrder": [ + "1bfb241e-2860-4cd8-887c-ace64dc6b9da" + ] + }, + "4f6b8a78-d1a9-4510-b31e-131531a3ce23": { + "id": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Finish", + "borderColor": "rgb(0,192,255)" + }, + "x": 918.478, + "y": 376.596, + "ports": [ + { + "id": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "type": "default", + "extras": {}, + "x": 919.954, + "y": 400.891, + "name": "in-0", + "alignment": "left", + "parentNode": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Finish", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "738f2d81-79ca-414f-a6c3-43ebcdc825b4" + ], + "portsOutOrder": [] + }, + "7affbe5e-678b-4a5c-ad27-c5c4a12fc733": { + "id": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 133.861, + "y": 464.122, + "ports": [ + { + "id": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "type": "default", + "extras": {}, + "x": 194.398, + "y": 488.426, + "name": "out-0", + "alignment": "right", + "parentNode": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": false, + "label": "Xircuits!", + "varName": "Xircuits!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "bef4edd7-d310-463f-8ac3-dba1fb71e80e" + ] + }, + "bd066e96-970a-4477-86c7-fdc2dc88c4a1": { + "id": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 134.61, + "y": 390.271, + "ports": [ + { + "id": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "type": "default", + "extras": {}, + "x": 192.801, + "y": 414.572, + "name": "out-0", + "alignment": "right", + "parentNode": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": false, + "label": "Hello ", + "varName": "Hello ", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "d9cf851b-f1de-4ab8-9244-9e8b24399ffd" + ] + }, + "16949768-609b-4f49-9637-1362acd39ebe": { + "id": "16949768-609b-4f49-9637-1362acd39ebe", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 16, + "end_lineno": 22 + } + ] + }, + "x": 344.958, + "y": 165.014, + "ports": [ + { + "id": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 189.317, + "name": "in-0", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 205.301, + "name": "parameter-string-a", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": true, + "label": "a", + "varName": "a", + "portType": "", + "dataType": "string" + }, + { + "id": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 221.285, + "name": "parameter-string-b", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": true, + "label": "b", + "varName": "b", + "portType": "", + "dataType": "string" + }, + { + "id": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 189.317, + "name": "out-0", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 205.301, + "name": "parameter-out-string-out", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": false, + "label": "out", + "varName": "out", + "portType": "", + "dataType": "" + } + ], + "name": "ConcatString", + "color": "rgb(153,51,204)", + "portsInOrder": [ + "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "d487a5cd-ffe5-4fba-800f-4651634f1ff5" + ], + "portsOutOrder": [ + "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "625956f7-cee1-4476-a9e7-ea34af1805d2" + ] + }, + "c67603e4-dfda-4c58-b6ab-0952eba75254": { + "id": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ] + }, + "x": 699.144, + "y": 244.771, + "ports": [ + { + "id": "e4118ad4-6463-45d0-acfe-278473f33171", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 269.074, + "name": "in-0", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 285.058, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "8d80f536-fec5-41ca-a82a-23972097d32f", + "type": "default", + "extras": {}, + "x": 792.512, + "y": 269.074, + "name": "out-0", + "alignment": "right", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(102,51,102)", + "portsInOrder": [ + "e4118ad4-6463-45d0-acfe-278473f33171", + "57336bb8-dbbf-48d2-88ac-2de9f15d6df6" + ], + "portsOutOrder": [ + "8d80f536-fec5-41ca-a82a-23972097d32f" + ] + }, + "35a75ed7-cd63-45d0-83a8-82b6f2a1e295": { + "id": "35a75ed7-cd63-45d0-83a8-82b6f2a1e295", + "type": "custom-node", + "selected": true, + "extras": { + "type": "comment", + "commentInput": "[1] Xircuits workflows are designed around \n the concept of linking nodes and configuring \n them with specific parameters." + }, + "x": -2.913, + "y": -76.821, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce": { + "id": "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[2] The blue flowing link connecting ▶ ports\n represent the sequence of execution." + }, + "x": 339.679, + "y": 51.942, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "ef86f386-48c9-456c-9b3c-7af11c9c4575": { + "id": "ef86f386-48c9-456c-9b3c-7af11c9c4575", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[4] You can also pass parameters \n from one component node to another." + }, + "x": 381.006, + "y": 339.556, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "f2c978ce-51d3-4327-a01b-2490500dffb4": { + "id": "f2c978ce-51d3-4327-a01b-2490500dffb4", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[3] Literals are one way of supplying parameters\n to your component node.\n You can double click literals to edit their value." + }, + "x": -143.813, + "y": 231.319, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84": { + "id": "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[5] Once you're done, you can compile \n and execute the workflow." + }, + "x": 824.994, + "y": 456.905, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + } + } + } + ] +} \ No newline at end of file diff --git a/xircuits-graph-viewer/demo/src/main.tsx b/xircuits-graph-viewer/demo/src/main.tsx new file mode 100644 index 00000000..e4e11c43 --- /dev/null +++ b/xircuits-graph-viewer/demo/src/main.tsx @@ -0,0 +1,5 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { App } from './App.js'; + +createRoot(document.getElementById('root')!).render(); diff --git a/xircuits-graph-viewer/demo/tsconfig.json b/xircuits-graph-viewer/demo/tsconfig.json new file mode 100644 index 00000000..30ea33ee --- /dev/null +++ b/xircuits-graph-viewer/demo/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "noEmit": true + }, + "include": ["src"] +} diff --git a/xircuits-graph-viewer/demo/vite.config.ts b/xircuits-graph-viewer/demo/vite.config.ts new file mode 100644 index 00000000..0466183a --- /dev/null +++ b/xircuits-graph-viewer/demo/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/xircuits-graph-viewer/docs/.gitignore b/xircuits-graph-viewer/docs/.gitignore new file mode 100644 index 00000000..b2d6de30 --- /dev/null +++ b/xircuits-graph-viewer/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/xircuits-graph-viewer/docs/docs/controlflow.mdx b/xircuits-graph-viewer/docs/docs/controlflow.mdx new file mode 100644 index 00000000..05e31e1c --- /dev/null +++ b/xircuits-graph-viewer/docs/docs/controlflow.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 2 +--- + +# Controlflow Example + +This workflow demonstrates branching and loop control flow in Xircuits. + +import WorkflowViewer from '@site/src/components/WorkflowViewer'; + + diff --git a/xircuits-graph-viewer/docs/docs/intro.mdx b/xircuits-graph-viewer/docs/docs/intro.mdx new file mode 100644 index 00000000..807102f9 --- /dev/null +++ b/xircuits-graph-viewer/docs/docs/intro.mdx @@ -0,0 +1,20 @@ +--- +sidebar_position: 1 +slug: / +--- + +# Xircuits Workflow Viewer + +Xircuits workflows rendered as interactive SVG diagrams. Pan and zoom with your mouse. + +## Hello Xircuits + +The classic getting-started workflow — connects **Start → ConcatString → Print → Finish** with two literal string inputs. + +import WorkflowViewer from '@site/src/components/WorkflowViewer'; + + + +:::tip +Use your **scroll wheel** to zoom and **click-drag** to pan around the diagram. +::: diff --git a/xircuits-graph-viewer/docs/docusaurus.config.js b/xircuits-graph-viewer/docs/docusaurus.config.js new file mode 100644 index 00000000..0fc357b7 --- /dev/null +++ b/xircuits-graph-viewer/docs/docusaurus.config.js @@ -0,0 +1,88 @@ +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Xircuits', + tagline: 'Visual programming for Python', + favicon: 'img/favicon.ico', + + future: { v4: true }, + + url: 'https://xircuits.io', + baseUrl: '/', + + onBrokenLinks: 'throw', + + i18n: { defaultLocale: 'en', locales: ['en'] }, + + // Allow .xircuits JSON files to be imported + plugins: [ + function xircuitsPlugin() { + return { + name: 'xircuits-json-loader', + configureWebpack() { + return { + module: { + rules: [ + { + test: /\.xircuits$/, + type: 'json', + }, + ], + }, + }; + }, + }; + }, + ], + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: './sidebars.js', + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + colorMode: { + respectPrefersColorScheme: true, + }, + navbar: { + title: 'Xircuits', + items: [ + { + type: 'docSidebar', + sidebarId: 'tutorialSidebar', + position: 'left', + label: 'Workflows', + }, + { + href: 'https://github.com/XpressAI/xircuits', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + copyright: `Copyright © ${new Date().getFullYear()} XpressAI. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/xircuits-graph-viewer/docs/package-lock.json b/xircuits-graph-viewer/docs/package-lock.json new file mode 100644 index 00000000..655113dc --- /dev/null +++ b/xircuits-graph-viewer/docs/package-lock.json @@ -0,0 +1,16070 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "0.0.0", + "dependencies": { + "@codemirror/lang-python": "^6.1.6", + "@docusaurus/core": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@mdx-js/react": "^3.0.0", + "@uiw/react-codemirror": "^4.23.7", + "@xpressai/xircuits-viewer": "file:../packages/core", + "@xpressai/xircuits-viewer-react": "file:../packages/react", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "engines": { + "node": ">=20.0" + } + }, + "../packages/core": { + "name": "@xpressai/xircuits-viewer", + "version": "0.2.0", + "bin": { + "xircuits-minify": "dist/minifier/cli.js" + }, + "devDependencies": { + "@types/node": "^25.6.0", + "typescript": "^5.8.3" + } + }, + "../packages/react": { + "name": "@xpressai/xircuits-viewer-react", + "version": "0.2.0", + "dependencies": { + "@xpressai/xircuits-viewer": "workspace:*" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "react": "^18.3.1", + "typescript": "^5.8.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.16.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.50.1", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.2", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.2", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.1", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-python": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.3.2", + "@codemirror/language": "^6.8.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/python": "^1.1.4" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.3", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.5", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.0", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.41.1", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.2", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.2", + "@docsearch/css": "4.6.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.2", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.1", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.1", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-print": "4.57.1", + "@jsonjoy.com/fs-snapshot": "4.57.1", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.1", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.1" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.1" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.1", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/python": { + "version": "1.1.18", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.2", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.9", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@codemirror/autocomplete": ">=6.0.0", + "@codemirror/commands": ">=6.0.0", + "@codemirror/language": ">=6.0.0", + "@codemirror/lint": ">=6.0.0", + "@codemirror/search": ">=6.0.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/view": ">=6.0.0" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.9", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@codemirror/commands": "^6.1.0", + "@codemirror/state": "^6.1.1", + "@codemirror/theme-one-dark": "^6.0.0", + "@uiw/codemirror-extensions-basic-setup": "4.25.9", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.11.0", + "@codemirror/state": ">=6.0.0", + "@codemirror/theme-one-dark": ">=6.0.0", + "@codemirror/view": ">=6.0.0", + "codemirror": ">=6.0.0", + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xpressai/xircuits-viewer": { + "resolved": "../packages/core", + "link": true + }, + "node_modules/@xpressai/xircuits-viewer-react": { + "resolved": "../packages/react", + "link": true + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.50.1", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.16.1", + "@algolia/client-abtesting": "5.50.1", + "@algolia/client-analytics": "5.50.1", + "@algolia/client-common": "5.50.1", + "@algolia/client-insights": "5.50.1", + "@algolia/client-personalization": "5.50.1", + "@algolia/client-query-suggestions": "5.50.1", + "@algolia/client-search": "5.50.1", + "@algolia/ingestion": "1.50.1", + "@algolia/monitoring": "1.50.1", + "@algolia/recommend": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.28.1", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.7", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.15", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001785", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.49.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.1", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.8.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.331", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.14.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.6", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.1", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.13.2", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.1", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.1", + "@jsonjoy.com/fs-fsa": "4.57.1", + "@jsonjoy.com/fs-node": "4.57.1", + "@jsonjoy.com/fs-node-builtins": "4.57.1", + "@jsonjoy.com/fs-node-to-fsa": "4.57.1", + "@jsonjoy.com/fs-node-utils": "4.57.1", + "@jsonjoy.com/fs-print": "4.57.1", + "@jsonjoy.com/fs-snapshot": "4.57.1", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.14.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.2", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.46.1", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.4.0", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.14.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.105.4", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.3", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.20.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.4", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/xircuits-graph-viewer/docs/package.json b/xircuits-graph-viewer/docs/package.json new file mode 100644 index 00000000..c67d4801 --- /dev/null +++ b/xircuits-graph-viewer/docs/package.json @@ -0,0 +1,48 @@ +{ + "name": "docs", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "@xpressai/xircuits-viewer": "file:../packages/core", + "@xpressai/xircuits-viewer-react": "file:../packages/react", + "@uiw/react-codemirror": "^4.23.7", + "@codemirror/lang-python": "^6.1.6" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=20.0" + } +} diff --git a/xircuits-graph-viewer/docs/sidebars.js b/xircuits-graph-viewer/docs/sidebars.js new file mode 100644 index 00000000..f77355c3 --- /dev/null +++ b/xircuits-graph-viewer/docs/sidebars.js @@ -0,0 +1,35 @@ +// @ts-check + +// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + + @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} + */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +export default sidebars; diff --git a/xircuits-graph-viewer/docs/src/components/HomeLivePreview.js b/xircuits-graph-viewer/docs/src/components/HomeLivePreview.js new file mode 100644 index 00000000..2e4deef5 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/HomeLivePreview.js @@ -0,0 +1,13 @@ +import React from 'react'; +import BrowserOnly from '@docusaurus/BrowserOnly'; + +export default function HomeLivePreview() { + return ( + }> + {() => { + const Inner = require('./HomeLivePreviewInner').default; + return ; + }} + + ); +} diff --git a/xircuits-graph-viewer/docs/src/components/HomeLivePreviewInner.js b/xircuits-graph-viewer/docs/src/components/HomeLivePreviewInner.js new file mode 100644 index 00000000..3692a737 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/HomeLivePreviewInner.js @@ -0,0 +1,200 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { XircuitsGraph, parsePythonComponent } from '@xpressai/xircuits-viewer-react'; +import CodeMirror from '@uiw/react-codemirror'; +import { python } from '@codemirror/lang-python'; +import { useColorMode } from '@docusaurus/theme-common'; + +const STARTER = `@xai_component(color="blue") +class GreetUser(Component): + """Greets a user by name.""" + + name: InArg[str] + times: InCompArg[int] + greeting: InArg[str] + + message: OutArg[str] + + body: BaseComponent + + def execute(self, ctx) -> None: + self.message.value = f"Hello, {self.name.value}!" +`; + +const DEBOUNCE_MS = 150; + +function EditorChrome({ theme }) { + const isDark = theme === 'dark'; + return ( +
+
+ + + +
+
+ + greet_user.py +
+
+ ); +} + +export default function HomeLivePreviewInner() { + const [code, setCode] = useState(STARTER); + const [debounced, setDebounced] = useState(STARTER); + const { colorMode } = useColorMode(); + const theme = colorMode === 'dark' ? 'dark' : 'light'; + const isDark = theme === 'dark'; + + useEffect(() => { + const id = setTimeout(() => setDebounced(code), DEBOUNCE_MS); + return () => clearTimeout(id); + }, [code]); + + const parsed = useMemo(() => parsePythonComponent(debounced), [debounced]); + const lastGoodRef = useRef(parsed.graph); + if (parsed.graph) lastGoodRef.current = parsed.graph; + const graph = lastGoodRef.current; + + const panelStyle = { + borderRadius: 14, + overflow: 'hidden', + border: isDark ? '1px solid #26262e' : '1px solid #e0e0e8', + background: isDark ? '#0d0d14' : '#ffffff', + boxShadow: isDark + ? '0 20px 40px -20px rgba(0, 0, 0, 0.6)' + : '0 10px 30px -15px rgba(0, 0, 0, 0.15)', + display: 'flex', + flexDirection: 'column', + minHeight: 0, + }; + + return ( +
+
+
+

+ Write Python, see the node. +

+

+ A xircuits component is just a Python class. Edit the code on the left; + the node preview on the right updates as you type. +

+
+ +
+ {/* Editor card */} +
+ +
+ +
+
+ + {/* Viewer card */} +
+
+ {graph && ( + + )} +
+
+
+
+ + +
+ ); +} diff --git a/xircuits-graph-viewer/docs/src/components/HomepageFeatures/index.js b/xircuits-graph-viewer/docs/src/components/HomepageFeatures/index.js new file mode 100644 index 00000000..acc76219 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/xircuits-graph-viewer/docs/src/components/HomepageFeatures/styles.module.css b/xircuits-graph-viewer/docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 00000000..b248eb2e --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/xircuits-graph-viewer/docs/src/components/WorkflowViewer.js b/xircuits-graph-viewer/docs/src/components/WorkflowViewer.js new file mode 100644 index 00000000..572272d0 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/WorkflowViewer.js @@ -0,0 +1,14 @@ +import React from 'react'; +import BrowserOnly from '@docusaurus/BrowserOnly'; +import { useColorMode } from '@docusaurus/theme-common'; + +export default function WorkflowViewer({ src, height = 500 }) { + return ( + + {() => { + const Viewer = require('./WorkflowViewerInner').default; + return ; + }} + + ); +} diff --git a/xircuits-graph-viewer/docs/src/components/WorkflowViewerInner.js b/xircuits-graph-viewer/docs/src/components/WorkflowViewerInner.js new file mode 100644 index 00000000..78c6a6e5 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/components/WorkflowViewerInner.js @@ -0,0 +1,145 @@ +import React, { useEffect, useRef, useState, useCallback } from 'react'; +import { parse, renderToElement, getCanvasStyle } from '@xpressai/xircuits-viewer'; +import { attachPanZoom } from '@xpressai/xircuits-viewer/interaction'; +import { useColorMode } from '@docusaurus/theme-common'; + +const ZoomInIcon = () => ( + + + +); +const ZoomOutIcon = () => ( + + + +); +const FitIcon = () => ( + + + + + +); + +export default function WorkflowViewerInner({ src, height = 500 }) { + const containerRef = useRef(null); + const panZoomRef = useRef(null); + const graphRef = useRef(null); + const { colorMode } = useColorMode(); + const theme = colorMode === 'dark' ? 'dark' : 'light'; + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + const [loaded, setLoaded] = useState(false); + const [visible, setVisible] = useState(false); + const hideTimer = useRef(null); + + const showControls = useCallback(() => { + setVisible(true); + clearTimeout(hideTimer.current); + hideTimer.current = setTimeout(() => setVisible(false), 2000); + }, []); + + // Fetch once + useEffect(() => { + if (!src) return; + let cancelled = false; + setLoading(true); + setError(null); + + fetch(src) + .then(res => { + if (!res.ok) throw new Error(`Failed to load ${src}: ${res.status}`); + return res.json(); + }) + .then(json => { + if (!cancelled) { + graphRef.current = parse(json); + setLoaded(true); + setLoading(false); + } + }) + .catch(err => { if (!cancelled) { setError(err.message); setLoading(false); } }); + + return () => { cancelled = true; }; + }, [src]); + + // Render when graph or theme changes + useEffect(() => { + if (!containerRef.current || !graphRef.current) return; + + // Save current viewBox before re-render + const prevSvg = containerRef.current.querySelector('svg'); + const savedVB = prevSvg?.getAttribute('viewBox'); + + if (panZoomRef.current) { + panZoomRef.current.destroy(); + panZoomRef.current = null; + } + + const svg = renderToElement(graphRef.current, { theme, fitView: true, padding: 40 }); + svg.style.width = '100%'; + svg.style.height = '100%'; + + if (savedVB) svg.setAttribute('viewBox', savedVB); + + containerRef.current.querySelectorAll('svg').forEach(el => el.remove()); + containerRef.current.prepend(svg); + panZoomRef.current = attachPanZoom(svg); + }, [loaded, theme]); + + const bgStyle = getCanvasStyle(theme); + const parsedBg = Object.fromEntries( + bgStyle.split(';').filter(Boolean).map(s => { + const [k, ...v] = s.split(':'); + return [k.trim().replace(/-([a-z])/g, (_, c) => c.toUpperCase()), v.join(':').trim()]; + }) + ); + + const btnStyle = { + width: 32, height: 32, + border: 'none', borderRadius: 6, + background: 'rgba(0,0,0,0.55)', + color: 'white', + cursor: 'pointer', + backdropFilter: 'blur(8px)', + display: 'flex', alignItems: 'center', justifyContent: 'center', + }; + + return ( +
+
+ {error &&

{error}

} + {loading && ( +
+ + + + Loading workflow... + +
+ )} +
+ +
+ + + +
+
+ ); +} diff --git a/xircuits-graph-viewer/docs/src/css/custom.css b/xircuits-graph-viewer/docs/src/css/custom.css new file mode 100644 index 00000000..2bc6a4cf --- /dev/null +++ b/xircuits-graph-viewer/docs/src/css/custom.css @@ -0,0 +1,30 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/xircuits-graph-viewer/docs/src/pages/index.js b/xircuits-graph-viewer/docs/src/pages/index.js new file mode 100644 index 00000000..911f462c --- /dev/null +++ b/xircuits-graph-viewer/docs/src/pages/index.js @@ -0,0 +1,45 @@ +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; +import HomeLivePreview from '@site/src/components/HomeLivePreview'; + +import Heading from '@theme/Heading'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+ + {siteConfig.title} + +

{siteConfig.tagline}

+
+ + View Xircuits Workflows + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); +} diff --git a/xircuits-graph-viewer/docs/src/pages/index.module.css b/xircuits-graph-viewer/docs/src/pages/index.module.css new file mode 100644 index 00000000..9f71a5da --- /dev/null +++ b/xircuits-graph-viewer/docs/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/xircuits-graph-viewer/docs/src/pages/markdown-page.md b/xircuits-graph-viewer/docs/src/pages/markdown-page.md new file mode 100644 index 00000000..9756c5b6 --- /dev/null +++ b/xircuits-graph-viewer/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/xircuits-graph-viewer/docs/static/.nojekyll b/xircuits-graph-viewer/docs/static/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/xircuits-graph-viewer/docs/static/img/docusaurus.png b/xircuits-graph-viewer/docs/static/img/docusaurus.png new file mode 100644 index 00000000..f458149e Binary files /dev/null and b/xircuits-graph-viewer/docs/static/img/docusaurus.png differ diff --git a/xircuits-graph-viewer/docs/static/img/favicon.ico b/xircuits-graph-viewer/docs/static/img/favicon.ico new file mode 100644 index 00000000..c01d54bc Binary files /dev/null and b/xircuits-graph-viewer/docs/static/img/favicon.ico differ diff --git a/xircuits-graph-viewer/docs/static/img/logo.svg b/xircuits-graph-viewer/docs/static/img/logo.svg new file mode 100644 index 00000000..9db6d0d0 --- /dev/null +++ b/xircuits-graph-viewer/docs/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/xircuits-graph-viewer/docs/static/workflows/ControlflowExample.xircuits b/xircuits-graph-viewer/docs/static/workflows/ControlflowExample.xircuits new file mode 100644 index 00000000..0ed24ede --- /dev/null +++ b/xircuits-graph-viewer/docs/static/workflows/ControlflowExample.xircuits @@ -0,0 +1,902 @@ +{ + "id": "bb487c34-1785-4bf1-b7cf-dd6ff80ac10d", + "offsetX": 123.88994214975773, + "offsetY": 238.283155021597, + "zoom": 82.96296505607548, + "gridSize": 0, + "layers": [ + { + "id": "827d8984-7e4b-4c82-8c77-bca1bca4538d", + "type": "diagram-links", + "isSvg": true, + "transformed": true, + "models": { + "8e14bedb-4925-45e0-9c16-008e36726d84": { + "id": "8e14bedb-4925-45e0-9c16-008e36726d84", + "type": "triangle-link", + "selected": false, + "source": "912ce164-3c9f-415e-b981-e334d0c1936a", + "sourcePort": "a1b94ed2-c63d-497f-9ebf-a16696db66c3", + "target": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "targetPort": "9aeb9ea8-af99-4528-a05d-df676958d7d7", + "points": [ + { + "id": "bd68e839-6432-431a-a524-959513eb0177", + "type": "point", + "x": -34.508, + "y": -46.233 + }, + { + "id": "3d9b1ce1-b439-409b-8f62-b171a6301fce", + "type": "point", + "x": 89.821, + "y": -38.466 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "02b61f41-cb12-4ae5-abc0-e795dfd311ff": { + "id": "02b61f41-cb12-4ae5-abc0-e795dfd311ff", + "type": "triangle-link", + "selected": false, + "source": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "sourcePort": "86ecf10e-6896-4963-93ec-bd4051686f97", + "target": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "targetPort": "f1bce6a3-a6d7-48de-91cd-57e74d76a600", + "points": [ + { + "id": "23ea006f-0287-498d-ab0c-4a91dfe6c037", + "type": "point", + "x": 263.605, + "y": -38.466 + }, + { + "id": "d1869104-643e-4289-9882-3b68677fa88c", + "type": "point", + "x": 514.381, + "y": -109.751 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "a073139c-99e8-44ca-884f-c25c5a6b47f8": { + "id": "a073139c-99e8-44ca-884f-c25c5a6b47f8", + "type": "triangle-link", + "selected": false, + "source": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "sourcePort": "a304e3f7-4951-4fc1-a3af-c98af87adce2", + "target": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "targetPort": "dba10cdb-c880-4752-9d51-64e509d735f1", + "points": [ + { + "id": "7abf5c2b-41d0-4273-94f4-0be558787150", + "type": "point", + "x": 263.605, + "y": -6.499 + }, + { + "id": "db510c07-f4c2-4ccf-95f9-b0704326c647", + "type": "point", + "x": 219.034, + "y": 133.432 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "165f2b52-b217-48ec-9a79-9b903dd8ede3": { + "id": "165f2b52-b217-48ec-9a79-9b903dd8ede3", + "type": "triangle-link", + "selected": false, + "source": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "sourcePort": "c7ea79b0-ce26-4e5a-bae3-12817dccc4d9", + "target": "248f9fce-76bd-494d-8080-7784f3aed238", + "targetPort": "c08bb8fa-bce4-444a-b1b6-aa58947a56ee", + "points": [ + { + "id": "a464b3a6-9f63-4663-bb53-34528b96d56c", + "type": "point", + "x": 606.267, + "y": -109.751 + }, + { + "id": "ebed74c4-6d01-4cc8-abd7-98b16c8a6d72", + "type": "point", + "x": 769.821, + "y": -83.895 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "52d7c6a0-b630-481f-ae54-13c302be4afa": { + "id": "52d7c6a0-b630-481f-ae54-13c302be4afa", + "type": "triangle-link", + "selected": false, + "source": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "sourcePort": "819341fd-b01a-4c99-b4b3-755c051d8ab9", + "target": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "targetPort": "a0a3fcc7-1126-4a02-9d2f-c916949858fb", + "points": [ + { + "id": "627d7c84-8c46-49db-a1c8-a3e4eb98d4b1", + "type": "point", + "x": 263.605, + "y": -22.483 + }, + { + "id": "cf1c9962-b02a-426d-a844-87a9ae497831", + "type": "point", + "x": 462.807, + "y": 122.865 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "b5102f00-b881-4321-8edc-74085d1401c3": { + "id": "b5102f00-b881-4321-8edc-74085d1401c3", + "type": "parameter-link", + "selected": false, + "source": "972dea3c-2f6a-4a06-a9f6-1c5c78b83f67", + "sourcePort": "ebb1ed28-1e41-4789-bbef-48a98fae40f4", + "target": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "targetPort": "feac004e-83ff-49e4-a82b-937618fe62e3", + "points": [ + { + "id": "9d661224-6f6a-4f7b-8885-e6a1f8a2acfb", + "type": "point", + "x": -6.811, + "y": 30.122 + }, + { + "id": "475c1fba-e718-4556-a52c-30fed4b0b33a", + "type": "point", + "x": 89.821, + "y": -22.483 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "9ba321f6-69e5-457c-b939-5e68c24a4cb0": { + "id": "9ba321f6-69e5-457c-b939-5e68c24a4cb0", + "type": "parameter-link", + "selected": false, + "source": "408266c4-3f7f-46cc-87e7-9aa8d2c13b71", + "sourcePort": "bc57bc5f-032f-4bf0-985d-fd47bc26fd5e", + "target": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "targetPort": "67968fee-a315-4d02-a80e-10be786bd4f7", + "points": [ + { + "id": "1ddba09e-99ca-4f9e-9737-d2e2e947b6ee", + "type": "point", + "x": 139.543, + "y": 128.872 + }, + { + "id": "1e5dcf35-23cf-4b7f-8170-4663e7d2c263", + "type": "point", + "x": 219.034, + "y": 149.416 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "017d89bd-4611-4399-93bf-97bb6fb91179": { + "id": "017d89bd-4611-4399-93bf-97bb6fb91179", + "type": "parameter-link", + "selected": false, + "source": "d06b3ef8-2fb0-4aa0-8084-3aa44772083c", + "sourcePort": "a9a6ae1c-e8fa-43b9-bf16-d71d2487519d", + "target": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "targetPort": "ce84d4f1-c073-4009-92b8-fc2ae7293e86", + "points": [ + { + "id": "91a0c1a5-2625-4d47-af3b-fefb290f697b", + "type": "point", + "x": 388.698, + "y": 246.024 + }, + { + "id": "e86ccd1d-e448-4913-bb2c-75d32f84be04", + "type": "point", + "x": 462.807, + "y": 138.848 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "a9aa5d24-f307-4558-959f-fafb42101011": { + "id": "a9aa5d24-f307-4558-959f-fafb42101011", + "type": "parameter-link", + "selected": false, + "source": "d344f75e-5ae6-4c13-b7ac-88a0f9e04c23", + "sourcePort": "49287324-16df-4968-a3cf-32d5d033d1b7", + "target": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "targetPort": "5891450f-19c0-48ea-b9ff-448c7289f483", + "points": [ + { + "id": "0f79ccbd-f056-4f09-be98-fe757842a89b", + "type": "point", + "x": 666.8, + "y": -8.362 + }, + { + "id": "fdb2142d-2115-488a-ae74-f0d370d47868", + "type": "point", + "x": 514.381, + "y": -93.767 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + } + } + }, + { + "id": "180123fb-e16a-41d4-a9f5-aebebcb99603", + "type": "diagram-nodes", + "isSvg": false, + "transformed": true, + "models": { + "912ce164-3c9f-415e-b981-e334d0c1936a": { + "id": "912ce164-3c9f-415e-b981-e334d0c1936a", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Start" + }, + "x": -72.643, + "y": -78.041, + "ports": [ + { + "id": "a1b94ed2-c63d-497f-9ebf-a16696db66c3", + "type": "default", + "extras": {}, + "x": -42.002, + "y": -53.727, + "name": "out-0", + "alignment": "right", + "parentNode": "912ce164-3c9f-415e-b981-e334d0c1936a", + "links": [ + "8e14bedb-4925-45e0-9c16-008e36726d84" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Start", + "color": "rgb(255,102,102)", + "portsInOrder": [], + "portsOutOrder": [ + "a1b94ed2-c63d-497f-9ebf-a16696db66c3" + ] + }, + "248f9fce-76bd-494d-8080-7784f3aed238": { + "id": "248f9fce-76bd-494d-8080-7784f3aed238", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Finish", + "borderColor": "rgb(0,192,255)" + }, + "x": 760.85, + "y": -115.697, + "ports": [ + { + "id": "c08bb8fa-bce4-444a-b1b6-aa58947a56ee", + "type": "default", + "extras": {}, + "x": 762.326, + "y": -91.389, + "name": "in-0", + "alignment": "left", + "parentNode": "248f9fce-76bd-494d-8080-7784f3aed238", + "links": [ + "165f2b52-b217-48ec-9a79-9b903dd8ede3" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Finish", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "c08bb8fa-bce4-444a-b1b6-aa58947a56ee" + ], + "portsOutOrder": [] + }, + "972dea3c-2f6a-4a06-a9f6-1c5c78b83f67": { + "id": "972dea3c-2f6a-4a06-a9f6-1c5c78b83f67", + "type": "custom-node", + "selected": false, + "extras": { + "type": "boolean" + }, + "x": -65.778, + "y": -1.687, + "ports": [ + { + "id": "ebb1ed28-1e41-4789-bbef-48a98fae40f4", + "type": "default", + "extras": {}, + "x": -14.306, + "y": 22.627, + "name": "out-0", + "alignment": "right", + "parentNode": "972dea3c-2f6a-4a06-a9f6-1c5c78b83f67", + "links": [ + "b5102f00-b881-4321-8edc-74085d1401c3" + ], + "in": false, + "label": "True", + "varName": "True", + "portType": "", + "dataType": "" + } + ], + "name": "Literal True", + "color": "red", + "portsInOrder": [], + "portsOutOrder": [ + "ebb1ed28-1e41-4789-bbef-48a98fae40f4" + ] + }, + "81b23b24-1bf5-45d9-b955-c0f309a52d1f": { + "id": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_controlflow/branches.py", + "description": null, + "lineNo": [ + { + "lineno": 4, + "end_lineno": 20 + } + ], + "finishNodeId": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "isBranchNode": true + }, + "x": 80.852, + "y": -70.268, + "ports": [ + { + "id": "9aeb9ea8-af99-4528-a05d-df676958d7d7", + "type": "default", + "extras": {}, + "x": 82.326, + "y": -45.961, + "name": "in-0", + "alignment": "left", + "parentNode": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "links": [ + "8e14bedb-4925-45e0-9c16-008e36726d84" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "feac004e-83ff-49e4-a82b-937618fe62e3", + "type": "default", + "extras": {}, + "x": 82.326, + "y": -29.977, + "name": "parameter-boolean-condition", + "alignment": "left", + "parentNode": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "links": [ + "b5102f00-b881-4321-8edc-74085d1401c3" + ], + "in": true, + "label": "condition", + "varName": "condition", + "portType": "", + "dataType": "boolean" + }, + { + "id": "86ecf10e-6896-4963-93ec-bd4051686f97", + "type": "default", + "extras": {}, + "x": 256.111, + "y": -45.961, + "name": "out-0", + "alignment": "right", + "parentNode": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "links": [ + "02b61f41-cb12-4ae5-abc0-e795dfd311ff" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "819341fd-b01a-4c99-b4b3-755c051d8ab9", + "type": "default", + "extras": {}, + "x": 256.111, + "y": -29.977, + "name": "out-flow-when_true", + "alignment": "right", + "parentNode": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "links": [ + "52d7c6a0-b630-481f-ae54-13c302be4afa" + ], + "in": false, + "label": "when_true ▶", + "varName": "when_true ▶", + "portType": "", + "dataType": "" + }, + { + "id": "a304e3f7-4951-4fc1-a3af-c98af87adce2", + "type": "default", + "extras": {}, + "x": 256.111, + "y": -13.993, + "name": "out-flow-when_false", + "alignment": "right", + "parentNode": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "links": [ + "a073139c-99e8-44ca-884f-c25c5a6b47f8" + ], + "in": false, + "label": "when_false ▶", + "varName": "when_false ▶", + "portType": "", + "dataType": "" + } + ], + "name": "BranchComponent", + "color": "rgb(102,102,102)", + "portsInOrder": [ + "9aeb9ea8-af99-4528-a05d-df676958d7d7", + "feac004e-83ff-49e4-a82b-937618fe62e3" + ], + "portsOutOrder": [ + "86ecf10e-6896-4963-93ec-bd4051686f97", + "819341fd-b01a-4c99-b4b3-755c051d8ab9", + "a304e3f7-4951-4fc1-a3af-c98af87adce2" + ] + }, + "4acc1826-cb0f-4ad0-b498-8211eeb8b86b": { + "id": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ], + "nextNode": "None" + }, + "x": 505.415, + "y": -141.559, + "ports": [ + { + "id": "f1bce6a3-a6d7-48de-91cd-57e74d76a600", + "type": "default", + "extras": {}, + "x": 506.887, + "y": -117.245, + "name": "in-0", + "alignment": "left", + "parentNode": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "links": [ + "02b61f41-cb12-4ae5-abc0-e795dfd311ff" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "5891450f-19c0-48ea-b9ff-448c7289f483", + "type": "default", + "extras": {}, + "x": 506.887, + "y": -101.262, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "links": [ + "a9aa5d24-f307-4558-959f-fafb42101011" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "c7ea79b0-ce26-4e5a-bae3-12817dccc4d9", + "type": "default", + "extras": {}, + "x": 598.773, + "y": -117.245, + "name": "out-0", + "alignment": "right", + "parentNode": "4acc1826-cb0f-4ad0-b498-8211eeb8b86b", + "links": [ + "165f2b52-b217-48ec-9a79-9b903dd8ede3" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "f1bce6a3-a6d7-48de-91cd-57e74d76a600", + "5891450f-19c0-48ea-b9ff-448c7289f483" + ], + "portsOutOrder": [ + "c7ea79b0-ce26-4e5a-bae3-12817dccc4d9" + ] + }, + "a78e6da4-5bc8-49f5-8d03-353678fb130e": { + "id": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ], + "sourceBranchId": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "portId": "a304e3f7-4951-4fc1-a3af-c98af87adce2", + "nextNode": "None" + }, + "x": 210.063, + "y": 101.636, + "ports": [ + { + "id": "dba10cdb-c880-4752-9d51-64e509d735f1", + "type": "default", + "extras": {}, + "x": 211.539, + "y": 125.937, + "name": "in-0", + "alignment": "left", + "parentNode": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "links": [ + "a073139c-99e8-44ca-884f-c25c5a6b47f8" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "67968fee-a315-4d02-a80e-10be786bd4f7", + "type": "default", + "extras": {}, + "x": 211.539, + "y": 141.921, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "links": [ + "9ba321f6-69e5-457c-b939-5e68c24a4cb0" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "626289b5-5d32-4117-bf2e-4231cc513d2d", + "type": "default", + "extras": {}, + "x": 303.426, + "y": 125.937, + "name": "out-0", + "alignment": "right", + "parentNode": "a78e6da4-5bc8-49f5-8d03-353678fb130e", + "links": [], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "dba10cdb-c880-4752-9d51-64e509d735f1", + "67968fee-a315-4d02-a80e-10be786bd4f7" + ], + "portsOutOrder": [ + "626289b5-5d32-4117-bf2e-4231cc513d2d" + ] + }, + "9691f88e-a4d4-481e-b911-b20f8757bb58": { + "id": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ], + "borderColor": "rgb(0,192,255)", + "sourceBranchId": "81b23b24-1bf5-45d9-b955-c0f309a52d1f", + "portId": "819341fd-b01a-4c99-b4b3-755c051d8ab9", + "nextNode": "None" + }, + "x": 453.835, + "y": 91.073, + "ports": [ + { + "id": "a0a3fcc7-1126-4a02-9d2f-c916949858fb", + "type": "default", + "extras": {}, + "x": 455.312, + "y": 115.37, + "name": "in-0", + "alignment": "left", + "parentNode": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "links": [ + "52d7c6a0-b630-481f-ae54-13c302be4afa" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "ce84d4f1-c073-4009-92b8-fc2ae7293e86", + "type": "default", + "extras": {}, + "x": 455.312, + "y": 131.354, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "links": [ + "017d89bd-4611-4399-93bf-97bb6fb91179" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "de703d56-8f67-476a-bcc4-3ba44c09bb6a", + "type": "default", + "extras": {}, + "x": 547.199, + "y": 115.37, + "name": "out-0", + "alignment": "right", + "parentNode": "9691f88e-a4d4-481e-b911-b20f8757bb58", + "links": [], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "a0a3fcc7-1126-4a02-9d2f-c916949858fb", + "ce84d4f1-c073-4009-92b8-fc2ae7293e86" + ], + "portsOutOrder": [ + "de703d56-8f67-476a-bcc4-3ba44c09bb6a" + ] + }, + "408266c4-3f7f-46cc-87e7-9aa8d2c13b71": { + "id": "408266c4-3f7f-46cc-87e7-9aa8d2c13b71", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": -94.705, + "y": 97.074, + "ports": [ + { + "id": "bc57bc5f-032f-4bf0-985d-fd47bc26fd5e", + "type": "default", + "extras": {}, + "x": 132.049, + "y": 121.377, + "name": "out-0", + "alignment": "right", + "parentNode": "408266c4-3f7f-46cc-87e7-9aa8d2c13b71", + "links": [ + "9ba321f6-69e5-457c-b939-5e68c24a4cb0" + ], + "in": false, + "label": "This will be printed if the condition is false!", + "varName": "This will be printed if the condition is false!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "bc57bc5f-032f-4bf0-985d-fd47bc26fd5e" + ] + }, + "d06b3ef8-2fb0-4aa0-8084-3aa44772083c": { + "id": "d06b3ef8-2fb0-4aa0-8084-3aa44772083c", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 158.743, + "y": 214.229, + "ports": [ + { + "id": "a9a6ae1c-e8fa-43b9-bf16-d71d2487519d", + "type": "default", + "extras": {}, + "x": 381.204, + "y": 238.53, + "name": "out-0", + "alignment": "right", + "parentNode": "d06b3ef8-2fb0-4aa0-8084-3aa44772083c", + "links": [ + "017d89bd-4611-4399-93bf-97bb6fb91179" + ], + "in": false, + "label": "This will be printed if the condition is true!", + "varName": "This will be printed if the condition is true!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "a9a6ae1c-e8fa-43b9-bf16-d71d2487519d" + ] + }, + "d344f75e-5ae6-4c13-b7ac-88a0f9e04c23": { + "id": "d344f75e-5ae6-4c13-b7ac-88a0f9e04c23", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 393.325, + "y": -44.524, + "ports": [ + { + "id": "49287324-16df-4968-a3cf-32d5d033d1b7", + "type": "default", + "extras": {}, + "x": 659.306, + "y": -15.856, + "name": "out-0", + "alignment": "right", + "parentNode": "d344f75e-5ae6-4c13-b7ac-88a0f9e04c23", + "links": [ + "a9aa5d24-f307-4558-959f-fafb42101011" + ], + "in": false, + "label": "This will always be executed at the end of the branch!", + "varName": "This will always be executed at the end of the branch!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "49287324-16df-4968-a3cf-32d5d033d1b7" + ] + }, + "0ba1f2f6-5137-4387-bdfb-fdf351bc2d45": { + "id": "0ba1f2f6-5137-4387-bdfb-fdf351bc2d45", + "type": "custom-node", + "selected": true, + "extras": { + "type": "comment", + "commentInput": "For more controlflow examples,\ncheck out the controlflow library!" + }, + "x": 534.814, + "y": 213.023, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "4f316462-ca7b-401f-b019-d8e943c98e69": { + "id": "4f316462-ca7b-401f-b019-d8e943c98e69", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "A controlflow component is a node\nthat has multiple out ▶ ports." + }, + "x": 80.394, + "y": -201.62, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + } + } + } + ] +} \ No newline at end of file diff --git a/xircuits-graph-viewer/docs/static/workflows/HelloXircuits.xircuits b/xircuits-graph-viewer/docs/static/workflows/HelloXircuits.xircuits new file mode 100644 index 00000000..4a2aa53e --- /dev/null +++ b/xircuits-graph-viewer/docs/static/workflows/HelloXircuits.xircuits @@ -0,0 +1,623 @@ +{ + "id": "11b9d835-f7c3-4b78-a927-bec01ae39956", + "offsetX": 138.70289808530393, + "offsetY": 112.11086262472926, + "zoom": 62.96296034657244, + "gridSize": 0, + "layers": [ + { + "id": "e8c7e3ab-cc6d-4d15-8c15-25b3b24cacd0", + "type": "diagram-links", + "isSvg": true, + "transformed": true, + "models": { + "0c51cfd5-b730-488b-a722-a7a93528866e": { + "id": "0c51cfd5-b730-488b-a722-a7a93528866e", + "type": "triangle-link", + "selected": false, + "source": "15df3e50-91c2-47a1-9c48-59f040abc728", + "sourcePort": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "points": [ + { + "id": "0ddd19f6-a0da-440f-a802-3932fb342c9a", + "type": "point", + "x": 193.281, + "y": 118.015 + }, + { + "id": "22ff1dfd-b7f5-4ce9-b642-296b831d0fdf", + "type": "point", + "x": 353.929, + "y": 196.811 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "901eb298-883a-4803-9fca-d3ed4f926688": { + "id": "901eb298-883a-4803-9fca-d3ed4f926688", + "type": "triangle-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "e4118ad4-6463-45d0-acfe-278473f33171", + "points": [ + { + "id": "c3b6116d-aaf4-459e-9c1d-2eac10f71110", + "type": "point", + "x": 454.253, + "y": 196.811 + }, + { + "id": "7640dc8e-dddc-4cd2-ac4f-e800452a3f2b", + "type": "point", + "x": 708.119, + "y": 276.568 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "11ae19ab-0615-4e3f-ba1d-6dea826154b3": { + "id": "11ae19ab-0615-4e3f-ba1d-6dea826154b3", + "type": "triangle-link", + "selected": false, + "source": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "sourcePort": "8d80f536-fec5-41ca-a82a-23972097d32f", + "target": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "targetPort": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "points": [ + { + "id": "e8436c2a-9c79-41f5-ae34-5c6c90852abe", + "type": "point", + "x": 800.006, + "y": 276.568 + }, + { + "id": "f692f0e3-1d03-4ebf-9e2f-c5eaa5c2152b", + "type": "point", + "x": 927.448, + "y": 408.385 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "9d08656b-7508-4eae-a449-f50a3a125289": { + "id": "9d08656b-7508-4eae-a449-f50a3a125289", + "type": "parameter-link", + "selected": false, + "source": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "sourcePort": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "points": [ + { + "id": "16128708-cec8-4c5c-aa18-eccc1d8aae67", + "type": "point", + "x": 201.892, + "y": 495.92 + }, + { + "id": "c6baf25d-ff3d-40c2-b43e-0430d3a05514", + "type": "point", + "x": 353.929, + "y": 228.779 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "14625014-44cf-4966-b34f-7b5d2023afe6": { + "id": "14625014-44cf-4966-b34f-7b5d2023afe6", + "type": "parameter-link", + "selected": false, + "source": "16949768-609b-4f49-9637-1362acd39ebe", + "sourcePort": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "target": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "targetPort": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "points": [ + { + "id": "b92a9e9d-47ca-45df-b50b-2725a1077ab2", + "type": "point", + "x": 454.253, + "y": 212.795 + }, + { + "id": "1d373617-9c69-4839-aea5-ec027d58b4d3", + "type": "point", + "x": 708.119, + "y": 292.552 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + }, + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f": { + "id": "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f", + "type": "parameter-link", + "selected": false, + "source": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "sourcePort": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "target": "16949768-609b-4f49-9637-1362acd39ebe", + "targetPort": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "points": [ + { + "id": "86e6c64b-d0b2-40e3-b746-dc56b9c2e56b", + "type": "point", + "x": 200.295, + "y": 422.066 + }, + { + "id": "fd5a730e-8422-4d27-95fb-b954065393ca", + "type": "point", + "x": 353.929, + "y": 212.795 + } + ], + "labels": [], + "width": 3, + "color": "gray", + "curvyness": 50, + "selectedColor": "rgb(0,192,255)" + } + } + }, + { + "id": "b1e2c329-efb4-4370-8927-38e61e23c5d2", + "type": "diagram-nodes", + "isSvg": false, + "transformed": true, + "models": { + "15df3e50-91c2-47a1-9c48-59f040abc728": { + "id": "15df3e50-91c2-47a1-9c48-59f040abc728", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Start", + "borderColor": "rgb(0,192,255)" + }, + "x": 155.159, + "y": 86.223, + "ports": [ + { + "id": "1bfb241e-2860-4cd8-887c-ace64dc6b9da", + "type": "default", + "extras": {}, + "x": 185.787, + "y": 110.521, + "name": "out-0", + "alignment": "right", + "parentNode": "15df3e50-91c2-47a1-9c48-59f040abc728", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Start", + "color": "rgb(255,102,102)", + "portsInOrder": [], + "portsOutOrder": [ + "1bfb241e-2860-4cd8-887c-ace64dc6b9da" + ] + }, + "4f6b8a78-d1a9-4510-b31e-131531a3ce23": { + "id": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "type": "custom-node", + "selected": false, + "extras": { + "type": "Finish", + "borderColor": "rgb(0,192,255)" + }, + "x": 918.478, + "y": 376.596, + "ports": [ + { + "id": "738f2d81-79ca-414f-a6c3-43ebcdc825b4", + "type": "default", + "extras": {}, + "x": 919.954, + "y": 400.891, + "name": "in-0", + "alignment": "left", + "parentNode": "4f6b8a78-d1a9-4510-b31e-131531a3ce23", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Finish", + "color": "rgb(255,102,102)", + "portsInOrder": [ + "738f2d81-79ca-414f-a6c3-43ebcdc825b4" + ], + "portsOutOrder": [] + }, + "7affbe5e-678b-4a5c-ad27-c5c4a12fc733": { + "id": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 133.861, + "y": 464.122, + "ports": [ + { + "id": "bef4edd7-d310-463f-8ac3-dba1fb71e80e", + "type": "default", + "extras": {}, + "x": 194.398, + "y": 488.426, + "name": "out-0", + "alignment": "right", + "parentNode": "7affbe5e-678b-4a5c-ad27-c5c4a12fc733", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": false, + "label": "Xircuits!", + "varName": "Xircuits!", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "bef4edd7-d310-463f-8ac3-dba1fb71e80e" + ] + }, + "bd066e96-970a-4477-86c7-fdc2dc88c4a1": { + "id": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "type": "custom-node", + "selected": false, + "extras": { + "type": "string" + }, + "x": 134.61, + "y": 390.271, + "ports": [ + { + "id": "d9cf851b-f1de-4ab8-9244-9e8b24399ffd", + "type": "default", + "extras": {}, + "x": 192.801, + "y": 414.572, + "name": "out-0", + "alignment": "right", + "parentNode": "bd066e96-970a-4477-86c7-fdc2dc88c4a1", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": false, + "label": "Hello ", + "varName": "Hello ", + "portType": "", + "dataType": "" + } + ], + "name": "Literal String", + "color": "lightpink", + "portsInOrder": [], + "portsOutOrder": [ + "d9cf851b-f1de-4ab8-9244-9e8b24399ffd" + ] + }, + "16949768-609b-4f49-9637-1362acd39ebe": { + "id": "16949768-609b-4f49-9637-1362acd39ebe", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 16, + "end_lineno": 22 + } + ] + }, + "x": 344.958, + "y": 165.014, + "ports": [ + { + "id": "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 189.317, + "name": "in-0", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "0c51cfd5-b730-488b-a722-a7a93528866e" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 205.301, + "name": "parameter-string-a", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "fd5f44a5-80b1-4b70-9e05-a6922ed2b49f" + ], + "in": true, + "label": "a", + "varName": "a", + "portType": "", + "dataType": "string" + }, + { + "id": "d487a5cd-ffe5-4fba-800f-4651634f1ff5", + "type": "default", + "extras": {}, + "x": 346.435, + "y": 221.285, + "name": "parameter-string-b", + "alignment": "left", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "9d08656b-7508-4eae-a449-f50a3a125289" + ], + "in": true, + "label": "b", + "varName": "b", + "portType": "", + "dataType": "string" + }, + { + "id": "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 189.317, + "name": "out-0", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "625956f7-cee1-4476-a9e7-ea34af1805d2", + "type": "default", + "extras": {}, + "x": 446.759, + "y": 205.301, + "name": "parameter-out-string-out", + "alignment": "right", + "parentNode": "16949768-609b-4f49-9637-1362acd39ebe", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": false, + "label": "out", + "varName": "out", + "portType": "", + "dataType": "" + } + ], + "name": "ConcatString", + "color": "rgb(153,51,204)", + "portsInOrder": [ + "40888689-6dc0-4d53-bdbf-f74cd85f7e47", + "14fbc718-0f8f-4c0b-bc47-4ac837d39b27", + "d487a5cd-ffe5-4fba-800f-4651634f1ff5" + ], + "portsOutOrder": [ + "13ff60b4-096f-43ac-9f8d-fd7eb6c68b00", + "625956f7-cee1-4476-a9e7-ea34af1805d2" + ] + }, + "c67603e4-dfda-4c58-b6ab-0952eba75254": { + "id": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "type": "custom-node", + "selected": false, + "extras": { + "type": "debug", + "path": "xai_components/xai_utils/utils.py", + "description": null, + "lineNo": [ + { + "lineno": 9, + "end_lineno": 13 + } + ] + }, + "x": 699.144, + "y": 244.771, + "ports": [ + { + "id": "e4118ad4-6463-45d0-acfe-278473f33171", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 269.074, + "name": "in-0", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "901eb298-883a-4803-9fca-d3ed4f926688" + ], + "in": true, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + }, + { + "id": "57336bb8-dbbf-48d2-88ac-2de9f15d6df6", + "type": "default", + "extras": {}, + "x": 700.625, + "y": 285.058, + "name": "parameter-any-msg", + "alignment": "left", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "14625014-44cf-4966-b34f-7b5d2023afe6" + ], + "in": true, + "label": "msg", + "varName": "msg", + "portType": "", + "dataType": "any" + }, + { + "id": "8d80f536-fec5-41ca-a82a-23972097d32f", + "type": "default", + "extras": {}, + "x": 792.512, + "y": 269.074, + "name": "out-0", + "alignment": "right", + "parentNode": "c67603e4-dfda-4c58-b6ab-0952eba75254", + "links": [ + "11ae19ab-0615-4e3f-ba1d-6dea826154b3" + ], + "in": false, + "label": "▶", + "varName": "▶", + "portType": "", + "dataType": "" + } + ], + "name": "Print", + "color": "rgb(102,51,102)", + "portsInOrder": [ + "e4118ad4-6463-45d0-acfe-278473f33171", + "57336bb8-dbbf-48d2-88ac-2de9f15d6df6" + ], + "portsOutOrder": [ + "8d80f536-fec5-41ca-a82a-23972097d32f" + ] + }, + "35a75ed7-cd63-45d0-83a8-82b6f2a1e295": { + "id": "35a75ed7-cd63-45d0-83a8-82b6f2a1e295", + "type": "custom-node", + "selected": true, + "extras": { + "type": "comment", + "commentInput": "[1] Xircuits workflows are designed around \n the concept of linking nodes and configuring \n them with specific parameters." + }, + "x": -2.913, + "y": -76.821, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce": { + "id": "d64c2fc8-73a6-4f7e-a406-f491c2ce2bce", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[2] The blue flowing link connecting ▶ ports\n represent the sequence of execution." + }, + "x": 339.679, + "y": 51.942, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "ef86f386-48c9-456c-9b3c-7af11c9c4575": { + "id": "ef86f386-48c9-456c-9b3c-7af11c9c4575", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[4] You can also pass parameters \n from one component node to another." + }, + "x": 381.006, + "y": 339.556, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "f2c978ce-51d3-4327-a01b-2490500dffb4": { + "id": "f2c978ce-51d3-4327-a01b-2490500dffb4", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[3] Literals are one way of supplying parameters\n to your component node.\n You can double click literals to edit their value." + }, + "x": -143.813, + "y": 231.319, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + }, + "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84": { + "id": "d4c2e2ce-f0dd-4104-9355-df2c96d0aa84", + "type": "custom-node", + "selected": false, + "extras": { + "type": "comment", + "commentInput": "[5] Once you're done, you can compile \n and execute the workflow." + }, + "x": 824.994, + "y": 456.905, + "ports": [], + "name": "Comment:", + "color": "rgb(255,255,255)", + "portsInOrder": [], + "portsOutOrder": [] + } + } + } + ] +} \ No newline at end of file diff --git a/xircuits-graph-viewer/package.json b/xircuits-graph-viewer/package.json new file mode 100644 index 00000000..48990659 --- /dev/null +++ b/xircuits-graph-viewer/package.json @@ -0,0 +1,13 @@ +{ + "name": "xircuits-graph-viewer-root", + "private": true, + "scripts": { + "build": "pnpm -r build", + "dev": "pnpm --filter demo dev", + "test": "vitest" + }, + "devDependencies": { + "vitest": "^3.1.1", + "typescript": "^5.8.3" + } +} diff --git a/xircuits-graph-viewer/packages/core/README.md b/xircuits-graph-viewer/packages/core/README.md new file mode 100644 index 00000000..f6f7b4bc --- /dev/null +++ b/xircuits-graph-viewer/packages/core/README.md @@ -0,0 +1,139 @@ +# @xpressai/xircuits-viewer + +Pure SVG renderer for `.xircuits` workflow files. Zero runtime dependencies. Parses the JSON format and produces self-contained SVG that visually matches the Xircuits editor. + +![HelloXircuits rendered](https://raw.githubusercontent.com/XpressAI/xircuits/master/xircuits-graph-viewer/xircuits-hello.png) + +## Install + +```bash +npm install @xpressai/xircuits-viewer +``` + +## Usage + +### From a URL (browser) + +```js +import { renderFromUrl } from '@xpressai/xircuits-viewer'; + +const svg = await renderFromUrl('/workflows/MyWorkflow.xircuits', { theme: 'dark' }); +document.getElementById('viewer').innerHTML = svg; +``` + +### From JSON data + +```js +import { renderXircuits } from '@xpressai/xircuits-viewer'; + +const svg = renderXircuits(workflowJson, { theme: 'dark' }); +``` + +### With pan/zoom + +```js +import { parse, renderToElement } from '@xpressai/xircuits-viewer'; +import { attachPanZoom } from '@xpressai/xircuits-viewer/interaction'; + +const res = await fetch('/workflows/MyWorkflow.xircuits'); +const svg = renderToElement(parse(await res.json()), { theme: 'dark' }); +document.body.appendChild(svg); +const { destroy, zoomBy, fitView } = attachPanZoom(svg); +``` + +### Python component → node + +Turn a single `@xai_component`-decorated Python class into an `XGraph` with one node — useful for live previews, docs playgrounds, or tooling that consumes component source. + +```js +import { parsePythonComponent, renderToString } from '@xpressai/xircuits-viewer'; + +const { graph, error, warnings } = parsePythonComponent(` +@xai_component(color="blue") +class GreetUser(Component): + name: InArg[str] + message: OutArg[str] +`); + +if (graph) { + const svg = renderToString(graph, { theme: 'dark' }); +} +``` + +Recognises the decorator (`color`), `InArg`/`InCompArg`/`OutArg`/`BaseComponent` fields, and docstrings (ignored). Python types are normalised (`str` → `string`, `bool` → `boolean`, `List[...]` → `list`) so port icons match those in real `.xircuits` workflows. + +Regex-based and lightweight — it's designed for live-preview ergonomics, not arbitrary Python. Parses the first `@xai_component` class it finds. + +### Container background + +The SVG renders just the graph content. Apply the Xircuits dot-grid background on your container: + +```js +import { getCanvasStyle } from '@xpressai/xircuits-viewer'; + +container.style.cssText = getCanvasStyle('dark'); +``` + +## Minifier + +`.xircuits` files from the Xircuits editor carry full UUIDs and high-precision coordinates that the viewer doesn't need. A bundled minifier cuts file size 57–85% so workflows load faster over the network. + +### CLI + +```bash +# Safe mode (best-effort compatible with the JupyterLab editor) +npx xircuits-minify MyWorkflow.xircuits + +# Viewer-only; shortens UUIDs and strips cosmetic fields +npx xircuits-minify MyWorkflow.xircuits --aggressive + +# Tune coordinate precision (default 0 = integer pixels) +npx xircuits-minify MyWorkflow.xircuits --precision 1 +``` + +### Library + +```js +import { minify, minifyWithStats } from '@xpressai/xircuits-viewer'; + +const compact = minify(workflowJson, { aggressive: true }); +const { output, stats } = minifyWithStats(workflowJson); +// stats: { inputBytes, outputBytes, ratio, nodes, edges, ports, mode, precision } +``` + +## API + +| Function | Description | +|----------|-------------| +| `renderFromUrl(url, options?)` | Fetch a `.xircuits` URL and return SVG string | +| `renderXircuits(json, options?)` | Parse JSON + render to SVG string | +| `parse(json)` | Parse `.xircuits` JSON into `XGraph` | +| `parsePythonComponent(source, options?)` | Parse Python component source into `{ graph, error, warnings }` | +| `renderToString(graph, options?)` | Render `XGraph` to SVG string | +| `renderToElement(graph, options?)` | Render `XGraph` to DOM `SVGSVGElement` | +| `validate(json)` | Validate without parsing | +| `getCanvasStyle(theme?)` | CSS string for the dot-grid container background | +| `attachPanZoom(svg, options?)` | Add pan/zoom, returns `{ destroy, zoomBy, fitView }` | +| `minify(json, options?)` | Minify a `.xircuits` JSON, returns compact string | +| `minifyWithStats(json, options?)` | Same, plus size/counts stats | + +### RenderOptions + +```ts +{ + theme?: 'dark' | 'light'; + width?: number; + height?: number; + padding?: number; + fitView?: boolean; + className?: string; +} +``` + +## React + +See [`@xpressai/xircuits-viewer-react`](https://www.npmjs.com/package/@xpressai/xircuits-viewer-react) for React components. + +## License + +MIT diff --git a/xircuits-graph-viewer/packages/core/package.json b/xircuits-graph-viewer/packages/core/package.json new file mode 100644 index 00000000..daaf86e4 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/package.json @@ -0,0 +1,33 @@ +{ + "name": "@xpressai/xircuits-viewer", + "version": "0.3.1", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./interaction": { + "types": "./dist/interaction/panZoom.d.ts", + "import": "./dist/interaction/panZoom.js", + "default": "./dist/interaction/panZoom.js" + } + }, + "bin": { + "xircuits-minify": "dist/minifier/cli.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc && chmod +x ./dist/minifier/cli.js", + "dev": "tsc --watch" + }, + "devDependencies": { + "@types/node": "^25.6.0", + "typescript": "^5.8.3" + } +} diff --git a/xircuits-graph-viewer/packages/core/src/index.ts b/xircuits-graph-viewer/packages/core/src/index.ts new file mode 100644 index 00000000..a982d5d2 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/index.ts @@ -0,0 +1,62 @@ +// Types +export type { + XGraph, + XNode, + XEdge, + XPort, + NodeMetrics, + RenderOptions, + PortDirection, + PortKind, + NodeKind, + EdgeKind, +} from './types.js'; + +// Parser +export { parse } from './parser/parse.js'; +export { validate } from './parser/validate.js'; +export { parsePythonComponent } from './parsePythonComponent.js'; +export type { ParseResult, ParsePythonOptions } from './parsePythonComponent.js'; + +// Layout +export { computeNodeMetrics } from './layout/metrics.js'; +export { computeViewBox } from './layout/viewBox.js'; + +// Renderer +export { renderToString, renderToElement } from './render/renderGraph.js'; + +// Minifier +export { minify, minifyWithStats } from './minifier/index.js'; +export type { MinifyOptions, MinifyStats } from './minifier/index.js'; + +// Convenience: one-shot parse + render +export { renderXircuits } from './render/renderGraph.js'; + +// Container background CSS (matching Xircuits canvas) +export function getCanvasStyle(theme: 'dark' | 'light' = 'dark'): string { + if (theme === 'dark') { + return [ + 'background-color: oklch(0.3 0.01 300)', + 'background-image: radial-gradient(oklch(40% 0 0) 1px, transparent 0)', + 'background-size: 15px 15px', + ].join(';'); + } + return [ + 'background-color: #f5f5f5', + 'background-image: radial-gradient(oklch(85% 0 0) 1px, transparent 0)', + 'background-size: 15px 15px', + ].join(';'); +} + +// Browser helper: fetch a .xircuits URL and render +export async function renderFromUrl( + url: string, + options?: import('./types.js').RenderOptions +): Promise { + const res = await fetch(url); + if (!res.ok) throw new Error(`Failed to load ${url}: ${res.status}`); + const json = await res.json(); + const { parse } = await import('./parser/parse.js'); + const { renderToString } = await import('./render/renderGraph.js'); + return renderToString(parse(json), options); +} diff --git a/xircuits-graph-viewer/packages/core/src/interaction/panZoom.ts b/xircuits-graph-viewer/packages/core/src/interaction/panZoom.ts new file mode 100644 index 00000000..6362376a --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/interaction/panZoom.ts @@ -0,0 +1,106 @@ +export interface PanZoomOptions { + minZoom?: number; + maxZoom?: number; + onViewportChange?: (viewport: { x: number; y: number; zoom: number }) => void; +} + +export interface PanZoomInstance { + destroy: () => void; + zoomBy: (factor: number) => void; + fitView: () => void; +} + +export function attachPanZoom( + svg: SVGSVGElement, + options: PanZoomOptions = {}, +): PanZoomInstance { + const { minZoom = 0.1, maxZoom = 4, onViewportChange } = options; + + const initialViewBox = readViewBox(); + let isPanning = false; + let startX = 0; + let startY = 0; + let panStartVB = { x: 0, y: 0, w: 0, h: 0 }; + + function readViewBox() { + const vb = svg.getAttribute('viewBox')?.split(/\s+/).map(Number) || [0, 0, 800, 600]; + return { x: vb[0], y: vb[1], w: vb[2], h: vb[3] }; + } + + function writeViewBox(vb: { x: number; y: number; w: number; h: number }) { + svg.setAttribute('viewBox', `${vb.x} ${vb.y} ${vb.w} ${vb.h}`); + onViewportChange?.({ x: vb.x, y: vb.y, zoom: svg.clientWidth / vb.w }); + } + + function onWheel(e: WheelEvent) { + e.preventDefault(); + const rect = svg.getBoundingClientRect(); + const mx = (e.clientX - rect.left) / rect.width; + const my = (e.clientY - rect.top) / rect.height; + const factor = e.deltaY > 0 ? 1.1 : 0.9; + applyZoom(factor, mx, my); + } + + function applyZoom(factor: number, anchorX = 0.5, anchorY = 0.5) { + const vb = readViewBox(); + const newW = vb.w * factor; + const newH = vb.h * factor; + + const currentZoom = svg.clientWidth / vb.w; + const newZoom = svg.clientWidth / newW; + if (newZoom < minZoom || newZoom > maxZoom) return; + + vb.x += (vb.w - newW) * anchorX; + vb.y += (vb.h - newH) * anchorY; + vb.w = newW; + vb.h = newH; + writeViewBox(vb); + } + + function onPointerDown(e: PointerEvent) { + if (e.button !== 0) return; + isPanning = true; + startX = e.clientX; + startY = e.clientY; + panStartVB = readViewBox(); + svg.setPointerCapture(e.pointerId); + svg.style.cursor = 'grabbing'; + } + + function onPointerMove(e: PointerEvent) { + if (!isPanning) return; + const rect = svg.getBoundingClientRect(); + const vb = panStartVB; + const dx = (e.clientX - startX) / rect.width * vb.w; + const dy = (e.clientY - startY) / rect.height * vb.h; + writeViewBox({ x: vb.x - dx, y: vb.y - dy, w: vb.w, h: vb.h }); + } + + function onPointerUp(e: PointerEvent) { + if (!isPanning) return; + isPanning = false; + svg.releasePointerCapture(e.pointerId); + svg.style.cursor = 'grab'; + } + + svg.style.cursor = 'grab'; + svg.addEventListener('wheel', onWheel, { passive: false }); + svg.addEventListener('pointerdown', onPointerDown); + svg.addEventListener('pointermove', onPointerMove); + svg.addEventListener('pointerup', onPointerUp); + + return { + destroy() { + svg.removeEventListener('wheel', onWheel); + svg.removeEventListener('pointerdown', onPointerDown); + svg.removeEventListener('pointermove', onPointerMove); + svg.removeEventListener('pointerup', onPointerUp); + }, + zoomBy(factor: number) { + applyZoom(factor); + }, + fitView() { + writeViewBox(initialViewBox); + }, + }; +} diff --git a/xircuits-graph-viewer/packages/core/src/layout/metrics.ts b/xircuits-graph-viewer/packages/core/src/layout/metrics.ts new file mode 100644 index 00000000..e1a5884d --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/layout/metrics.ts @@ -0,0 +1,95 @@ +import type { XNode, NodeMetrics } from '../types.js'; + +// Constants derived from Xircuits CSS +export const TITLE_HEIGHT = 26; +export const PORT_ROW_HEIGHT = 19; // 15px port + 2px margin top + 2px margin bottom +export const NODE_MIN_WIDTH = 100; +export const PORT_GAP = 10; // gap between in-port column and out-port column (margin-right: 10px) +export const PORT_DOT_SIZE = 15; +export const FONT_SIZE = 11; +export const CHAR_WIDTH = 6.6; // approx for sans-serif 11px +export const TITLE_ICON_SIZE = 15; +export const TITLE_PADDING_X = 5; +export const TITLE_PADDING_Y = 5; +export const PORT_LABEL_PADDING = 5; // padding: 0 5px on label +export const COMMENT_FONT_SIZE = 12; +export const COMMENT_CHAR_WIDTH = 7.2; +export const COMMENT_PADDING = 5; + +export function measureTextWidth(text: string, charWidth: number = CHAR_WIDTH): number { + return text.length * charWidth; +} + +export function computeNodeMetrics(node: XNode): NodeMetrics { + if (node.kind === 'comment') { + return computeCommentMetrics(node); + } + + // Title width = icon + padding + name text + padding + const titleTextWidth = TITLE_PADDING_X + TITLE_ICON_SIZE + TITLE_PADDING_X + measureTextWidth(node.name) + TITLE_PADDING_X; + + // In-ports column width: dot(15) + label padding(5) + label text + label padding(5) + let maxInWidth = 0; + for (const port of node.portsIn) { + const labelW = measureTextWidth(port.label) + PORT_LABEL_PADDING * 2; + maxInWidth = Math.max(maxInWidth, PORT_DOT_SIZE + labelW); + } + + // Out-ports column width: label padding(5) + label text + label padding(5) + dot(15) + let maxOutWidth = 0; + for (const port of node.portsOut) { + const labelW = measureTextWidth(port.label) + PORT_LABEL_PADDING * 2; + maxOutWidth = Math.max(maxOutWidth, labelW + PORT_DOT_SIZE); + } + + const hasIn = node.portsIn.length > 0; + const hasOut = node.portsOut.length > 0; + const portsWidth = maxInWidth + (hasIn && hasOut ? PORT_GAP : 0) + maxOutWidth; + + const width = Math.max(NODE_MIN_WIDTH, titleTextWidth, portsWidth); + + const maxPortCount = Math.max(node.portsIn.length, node.portsOut.length); + const bodyHeight = maxPortCount > 0 ? maxPortCount * PORT_ROW_HEIGHT : 0; + const height = TITLE_HEIGHT + bodyHeight; + + // Compute port positions (relative to node top-left, at the connection point) + const portPositions = new Map(); + + node.portsIn.forEach((port, i) => { + portPositions.set(port.id, { + x: 0, // left edge of node + y: TITLE_HEIGHT + i * PORT_ROW_HEIGHT + PORT_ROW_HEIGHT / 2, + }); + }); + + node.portsOut.forEach((port, i) => { + portPositions.set(port.id, { + x: width, // right edge of node + y: TITLE_HEIGHT + i * PORT_ROW_HEIGHT + PORT_ROW_HEIGHT / 2, + }); + }); + + return { width, height, titleHeight: TITLE_HEIGHT, portRowHeight: PORT_ROW_HEIGHT, portPositions }; +} + +function computeCommentMetrics(node: XNode): NodeMetrics { + const title = 'Comment:'; + const text = (node.extras.commentInput as string) || ''; + const lines = text.split('\n'); + + const titleWidth = measureTextWidth(title, COMMENT_CHAR_WIDTH) + COMMENT_PADDING * 2; + const maxLineWidth = Math.max(...lines.map(l => measureTextWidth(l, COMMENT_CHAR_WIDTH))); + const width = Math.max(NODE_MIN_WIDTH, titleWidth, maxLineWidth + COMMENT_PADDING * 2); + + // title line + content lines + padding + const lineHeight = 18; + const height = COMMENT_PADDING + 16 + lines.length * lineHeight + COMMENT_PADDING; + + return { + width, + height, + titleHeight: 0, + portRowHeight: 0, + portPositions: new Map(), + }; +} diff --git a/xircuits-graph-viewer/packages/core/src/layout/viewBox.ts b/xircuits-graph-viewer/packages/core/src/layout/viewBox.ts new file mode 100644 index 00000000..714b7e29 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/layout/viewBox.ts @@ -0,0 +1,40 @@ +import type { XNode, NodeMetrics } from '../types.js'; + +export interface ViewBox { + x: number; + y: number; + width: number; + height: number; +} + +export function computeViewBox( + nodes: XNode[], + metricsMap: Map, + padding: number = 40 +): ViewBox { + if (nodes.length === 0) { + return { x: 0, y: 0, width: 800, height: 600 }; + } + + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + for (const node of nodes) { + const metrics = metricsMap.get(node.id); + if (!metrics) continue; + + minX = Math.min(minX, node.x); + minY = Math.min(minY, node.y); + maxX = Math.max(maxX, node.x + metrics.width); + maxY = Math.max(maxY, node.y + metrics.height); + } + + return { + x: minX - padding, + y: minY - padding, + width: maxX - minX + padding * 2, + height: maxY - minY + padding * 2, + }; +} diff --git a/xircuits-graph-viewer/packages/core/src/minifier/cli.ts b/xircuits-graph-viewer/packages/core/src/minifier/cli.ts new file mode 100644 index 00000000..5f34b9b0 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/minifier/cli.ts @@ -0,0 +1,136 @@ +#!/usr/bin/env node +import { readFileSync, writeFileSync } from 'node:fs'; +import { basename, dirname, extname, join } from 'node:path'; +import { validate } from '../parser/validate.js'; +import { minifyWithStats } from './index.js'; + +function formatBytes(n: number): string { + if (n < 1024) return `${n} B`; + if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`; + return `${(n / 1024 / 1024).toFixed(2)} MB`; +} + +function printUsage() { + process.stderr.write( + [ + 'Usage: xircuits-minify [-o ] [--precision N] [--aggressive]', + '', + 'Options:', + ' -o, --output Output path (default: .min.xircuits)', + ' --precision N Coordinate decimal places (default: 0)', + ' --aggressive Shorten IDs and strip viewer-unused fields (viewer-only)', + ' -h, --help Show this help', + '', + ].join('\n') + ); +} + +interface Args { + input?: string; + output?: string; + precision: number; + aggressive: boolean; + help: boolean; +} + +function parseArgs(argv: string[]): Args { + const args: Args = { precision: 0, aggressive: false, help: false }; + for (let i = 0; i < argv.length; i++) { + const a = argv[i]; + if (a === '-h' || a === '--help') { + args.help = true; + } else if (a === '-o' || a === '--output') { + args.output = argv[++i]; + } else if (a === '--precision') { + args.precision = Number(argv[++i]); + if (!Number.isFinite(args.precision) || args.precision < 0) { + throw new Error(`Invalid --precision value: must be a non-negative number`); + } + } else if (a === '--aggressive') { + args.aggressive = true; + } else if (a.startsWith('-')) { + throw new Error(`Unknown flag: ${a}`); + } else if (!args.input) { + args.input = a; + } else { + throw new Error(`Unexpected positional argument: ${a}`); + } + } + return args; +} + +function defaultOutput(input: string): string { + const ext = extname(input); + const base = basename(input, ext); + return join(dirname(input), `${base}.min${ext || '.xircuits'}`); +} + +function main() { + let args: Args; + try { + args = parseArgs(process.argv.slice(2)); + } catch (e) { + process.stderr.write(`Error: ${(e as Error).message}\n\n`); + printUsage(); + process.exit(1); + } + + if (args.help || !args.input) { + printUsage(); + process.exit(args.help ? 0 : 1); + } + + const inputPath = args.input; + const outputPath = args.output ?? defaultOutput(inputPath); + + let raw: string; + try { + raw = readFileSync(inputPath, 'utf8'); + } catch (e) { + process.stderr.write(`Error reading ${inputPath}: ${(e as Error).message}\n`); + process.exit(1); + } + + let json: unknown; + try { + json = JSON.parse(raw); + } catch (e) { + process.stderr.write(`Error parsing ${inputPath}: ${(e as Error).message}\n`); + process.exit(1); + } + + const { valid, errors } = validate(json); + if (!valid) { + process.stderr.write(`Invalid .xircuits file: ${errors.join(', ')}\n`); + process.exit(1); + } + + const { output, stats } = minifyWithStats(json, { + precision: args.precision, + aggressive: args.aggressive, + }); + + writeFileSync(outputPath, output, 'utf8'); + + const onDiskInputBytes = Buffer.byteLength(raw, 'utf8'); + const savings = onDiskInputBytes - stats.outputBytes; + const pct = onDiskInputBytes === 0 ? 0 : (1 - stats.outputBytes / onDiskInputBytes) * 100; + const inName = basename(inputPath); + const outName = basename(outputPath); + const pad = Math.max(inName.length, outName.length); + + process.stderr.write( + [ + `Input: ${inName.padEnd(pad)} ${formatBytes(onDiskInputBytes)}`, + `Output: ${outName.padEnd(pad)} ${formatBytes(stats.outputBytes)}`, + `Savings: ${formatBytes(savings)} (${pct.toFixed(1)}% reduction)`, + '', + `Mode: ${stats.mode}`, + `Nodes: ${stats.nodes} Edges: ${stats.edges} Ports: ${stats.ports}`, + `Precision: ${stats.precision} decimals`, + '', + ].join('\n') + ); +} + +main(); diff --git a/xircuits-graph-viewer/packages/core/src/minifier/index.ts b/xircuits-graph-viewer/packages/core/src/minifier/index.ts new file mode 100644 index 00000000..26ba1e8e --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/minifier/index.ts @@ -0,0 +1,294 @@ +export interface MinifyOptions { + precision?: number; + aggressive?: boolean; +} + +export interface MinifyStats { + inputBytes: number; + outputBytes: number; + ratio: number; + nodes: number; + edges: number; + ports: number; + mode: 'safe' | 'aggressive'; + precision: number; +} + +const TRANSIENT_KEYS = new Set(['selected', 'locked']); + +const EXTRAS_ALLOWLIST = new Set([ + 'type', + 'path', + 'lineNo', + 'commentInput', +]); + +type Json = unknown; + +function roundTo(n: number, precision: number): number { + if (!Number.isFinite(n)) return n; + const f = Math.pow(10, precision); + return Math.round(n * f) / f; +} + +function stripTransient(value: Json): Json { + if (value === null || value === undefined) return undefined; + if (Array.isArray(value)) { + return value.map(stripTransient).filter(v => v !== undefined); + } + if (typeof value === 'object') { + const out: Record = {}; + for (const [k, v] of Object.entries(value as Record)) { + if (TRANSIENT_KEYS.has(k)) continue; + const cleaned = stripTransient(v); + if (cleaned !== undefined) out[k] = cleaned; + } + return out; + } + return value; +} + +function roundCoordsInPlace(graph: Record, precision: number) { + if (typeof graph.offsetX === 'number') graph.offsetX = roundTo(graph.offsetX, precision); + if (typeof graph.offsetY === 'number') graph.offsetY = roundTo(graph.offsetY, precision); + + const layers = graph.layers as Array> | undefined; + if (!Array.isArray(layers)) return; + + for (const layer of layers) { + const models = layer.models as Record> | undefined; + if (!models) continue; + + for (const model of Object.values(models)) { + if (typeof model.x === 'number') model.x = roundTo(model.x as number, precision); + if (typeof model.y === 'number') model.y = roundTo(model.y as number, precision); + + const ports = model.ports as Array> | undefined; + if (Array.isArray(ports)) { + for (const port of ports) { + if (typeof port.x === 'number') port.x = roundTo(port.x as number, precision); + if (typeof port.y === 'number') port.y = roundTo(port.y as number, precision); + } + } + + const points = model.points as Array> | undefined; + if (Array.isArray(points)) { + for (const p of points) { + if (typeof p.x === 'number') p.x = roundTo(p.x as number, precision); + if (typeof p.y === 'number') p.y = roundTo(p.y as number, precision); + } + } + } + } +} + +function collectCounts(graph: Record): { nodes: number; edges: number; ports: number } { + let nodes = 0; + let edges = 0; + let ports = 0; + const layers = graph.layers as Array> | undefined; + if (!Array.isArray(layers)) return { nodes, edges, ports }; + + for (const layer of layers) { + const models = layer.models as Record> | undefined; + if (!models) continue; + if (layer.type === 'diagram-nodes') { + for (const node of Object.values(models)) { + nodes++; + const nodePorts = node.ports as unknown[] | undefined; + if (Array.isArray(nodePorts)) ports += nodePorts.length; + } + } else if (layer.type === 'diagram-links') { + edges += Object.keys(models).length; + } + } + return { nodes, edges, ports }; +} + +function applyAggressive(graph: Record) { + const nodeMap = new Map(); + const portMap = new Map(); + const edgeMap = new Map(); + + const layers = graph.layers as Array> | undefined; + if (!Array.isArray(layers)) return; + + const nodeLayer = layers.find(l => l.type === 'diagram-nodes'); + const linkLayer = layers.find(l => l.type === 'diagram-links'); + + if (nodeLayer) { + const models = nodeLayer.models as Record>; + let ni = 0; + let pi = 0; + for (const node of Object.values(models)) { + const oldNodeId = node.id as string; + nodeMap.set(oldNodeId, `n${ni++}`); + const ports = node.ports as Array> | undefined; + if (Array.isArray(ports)) { + for (const port of ports) { + portMap.set(port.id as string, `p${pi++}`); + } + } + } + } + + if (linkLayer) { + const models = linkLayer.models as Record>; + let ei = 0; + for (const link of Object.values(models)) { + edgeMap.set(link.id as string, `e${ei++}`); + } + } + + if (typeof graph.id === 'string') graph.id = 'g'; + + const rewriteLayer = (layer: Record) => { + delete layer.id; + delete layer.isSvg; + delete layer.transformed; + delete layer.extras; + + const models = layer.models as Record>; + const newModels: Record> = {}; + + if (layer.type === 'diagram-nodes') { + for (const node of Object.values(models)) { + const newId = nodeMap.get(node.id as string)!; + node.id = newId; + + delete node.selectedColor; + delete node.width; + delete node.height; + delete node.type; + + const extras = node.extras as Record | undefined; + if (extras) { + const filteredExtras: Record = {}; + for (const [k, v] of Object.entries(extras)) { + if (EXTRAS_ALLOWLIST.has(k)) filteredExtras[k] = v; + } + if (Object.keys(filteredExtras).length > 0) { + node.extras = filteredExtras; + } else { + delete node.extras; + } + } + + const ports = node.ports as Array> | undefined; + if (Array.isArray(ports)) { + for (const port of ports) { + port.id = portMap.get(port.id as string)!; + delete port.alignment; + delete port.maximumLinks; + delete port.parentNode; + delete port.portType; + delete port.type; + + const pextras = port.extras as Record | undefined; + if (!pextras || Object.keys(pextras).length === 0) { + delete port.extras; + } + + const links = port.links as string[] | undefined; + if (Array.isArray(links)) { + port.links = links + .map(id => edgeMap.get(id)) + .filter((id): id is string => typeof id === 'string'); + } + } + } + + const portsInOrder = node.portsInOrder as string[] | undefined; + if (Array.isArray(portsInOrder)) { + node.portsInOrder = portsInOrder + .map(id => portMap.get(id)) + .filter((id): id is string => typeof id === 'string'); + } + const portsOutOrder = node.portsOutOrder as string[] | undefined; + if (Array.isArray(portsOutOrder)) { + node.portsOutOrder = portsOutOrder + .map(id => portMap.get(id)) + .filter((id): id is string => typeof id === 'string'); + } + + newModels[newId] = node; + } + } else if (layer.type === 'diagram-links') { + for (const link of Object.values(models)) { + const newId = edgeMap.get(link.id as string)!; + link.id = newId; + + delete link.width; + delete link.curvyness; + delete link.selectedColor; + delete link.labels; + delete link.extras; + + if (typeof link.source === 'string') link.source = nodeMap.get(link.source) ?? link.source; + if (typeof link.target === 'string') link.target = nodeMap.get(link.target) ?? link.target; + if (typeof link.sourcePort === 'string') link.sourcePort = portMap.get(link.sourcePort) ?? link.sourcePort; + if (typeof link.targetPort === 'string') link.targetPort = portMap.get(link.targetPort) ?? link.targetPort; + + const points = link.points as Array> | undefined; + if (Array.isArray(points)) { + for (const p of points) { + delete p.id; + delete p.type; + } + } + + newModels[newId] = link; + } + } + + layer.models = newModels; + }; + + delete graph.gridSize; + + for (const layer of layers) rewriteLayer(layer); +} + +function utf8Bytes(s: string): number { + return new TextEncoder().encode(s).length; +} + +export function minify(input: unknown, opts: MinifyOptions = {}): string { + return minifyWithStats(input, opts).output; +} + +export function minifyWithStats( + input: unknown, + opts: MinifyOptions = {} +): { output: string; stats: MinifyStats } { + const precision = opts.precision ?? 0; + const aggressive = opts.aggressive ?? false; + + const inputStr = JSON.stringify(input); + const inputBytes = utf8Bytes(inputStr); + + const cloned = JSON.parse(inputStr); + const stripped = stripTransient(cloned) as Record; + + const counts = collectCounts(stripped); + + roundCoordsInPlace(stripped, precision); + + if (aggressive) applyAggressive(stripped); + + const output = JSON.stringify(stripped); + const outputBytes = utf8Bytes(output); + + const stats: MinifyStats = { + inputBytes, + outputBytes, + ratio: inputBytes === 0 ? 0 : 1 - outputBytes / inputBytes, + nodes: counts.nodes, + edges: counts.edges, + ports: counts.ports, + mode: aggressive ? 'aggressive' : 'safe', + precision, + }; + + return { output, stats }; +} diff --git a/xircuits-graph-viewer/packages/core/src/parsePythonComponent.ts b/xircuits-graph-viewer/packages/core/src/parsePythonComponent.ts new file mode 100644 index 00000000..83a10059 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/parsePythonComponent.ts @@ -0,0 +1,212 @@ +import type { XGraph, XNode, XPort } from './types.js'; + +export interface ParseResult { + graph: XGraph | null; + error: string | null; + warnings: string[]; +} + +export interface ParsePythonOptions { + /** Node color to use when no @xai_component(color=...) is found. */ + defaultColor?: string; + /** Whether to inject the standard flow-in (▶) port. */ + includeFlowIn?: boolean; + /** Whether to inject the standard flow-out (▶) port. */ + includeFlowOut?: boolean; +} + +const DEFAULT_COLOR = 'rgb(153,51,204)'; + +const FIELD_RE = + /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(InArg|InCompArg|OutArg|BaseComponent)\s*(?:\[\s*(.+)\s*\])?\s*(?:=.*)?\s*(?:#.*)?$/; + +const CLASS_RE = /^\s*class\s+([A-Za-z_][A-Za-z0-9_]*)\s*(?:\([^)]*\))?\s*:\s*$/m; + +const DECORATOR_RE = /@xai_component\s*(?:\(([^)]*)\))?/; + +function extractKwarg(kwargs: string, key: string): string | null { + const re = new RegExp(`\\b${key}\\s*=\\s*(?:(["'])([^"']*)\\1|([^,\\s)]+))`); + const m = kwargs.match(re); + return m ? (m[2] ?? m[3] ?? null) : null; +} + +/** + * Parse a Python source string containing a single @xai_component class into + * an XGraph with one node. Designed for a live-preview use case where the + * input may be mid-edit; non-fatal issues are returned as `warnings`. + */ +export function parsePythonComponent( + source: string, + options: ParsePythonOptions = {} +): ParseResult { + const { + defaultColor = DEFAULT_COLOR, + includeFlowIn = true, + includeFlowOut = true, + } = options; + + const warnings: string[] = []; + + if (!source.trim()) { + return { graph: null, error: 'Empty source', warnings }; + } + + const classMatch = source.match(CLASS_RE); + if (!classMatch) { + return { graph: null, error: 'No class definition found', warnings }; + } + + const className = classMatch[1]; + const classIndex = source.indexOf(classMatch[0]); + + const preClass = source.slice(0, classIndex); + const decoratorMatch = preClass.match(DECORATOR_RE); + let color = defaultColor; + if (decoratorMatch) { + const colorKw = extractKwarg(decoratorMatch[1] ?? '', 'color'); + if (colorKw) color = colorKw; + } else { + warnings.push('No @xai_component decorator found; using default color'); + } + + const classBody = source.slice(classIndex + classMatch[0].length); + const fields = extractFields(classBody); + + const portsIn: XPort[] = []; + const portsOut: XPort[] = []; + + if (includeFlowIn) { + portsIn.push({ + id: 'preview-port-in-flow', + direction: 'in', + kind: 'flow', + label: '▶', + varName: 'in-0', + dataType: null, + linkIds: [], + }); + } + if (includeFlowOut) { + portsOut.push({ + id: 'preview-port-out-flow', + direction: 'out', + kind: 'flow', + label: '▶', + varName: 'out-0', + dataType: null, + linkIds: [], + }); + } + + let idCounter = 0; + for (const f of fields) { + const id = `preview-port-${idCounter++}`; + if (f.kind === 'OutArg') { + portsOut.push({ + id, direction: 'out', kind: 'parameter', + label: f.varName, varName: f.varName, + dataType: f.dataType, + linkIds: [], + }); + } else if (f.kind === 'BaseComponent') { + portsOut.push({ + id, direction: 'out', kind: 'flow', + label: f.varName, varName: f.varName, + dataType: null, + linkIds: [], + }); + } else { + // InArg / InCompArg + portsIn.push({ + id, direction: 'in', kind: 'parameter', + label: f.varName, varName: f.varName, + dataType: f.dataType, + linkIds: [], + }); + } + } + + const node: XNode = { + id: 'preview-node', + kind: 'component', + name: className, + color, + x: 0, + y: 0, + portsIn, + portsOut, + extras: { type: 'debug' }, + }; + + const graph: XGraph = { + id: 'preview-graph', + viewport: { x: 0, y: 0, zoom: 100 }, + nodes: [node], + edges: [], + }; + + return { graph, error: null, warnings }; +} + +type FieldKind = 'InArg' | 'InCompArg' | 'OutArg' | 'BaseComponent'; +interface Field { + varName: string; + kind: FieldKind; + dataType: string | null; +} + +// Map Python type annotations to the canonical xircuits type names used by +// the renderer's symbol table (see ./render/symbols.ts). +const PY_TYPE_TO_XIRCUITS: Record = { + str: 'string', + bool: 'boolean', + list: 'list', List: 'list', + tuple: 'tuple', Tuple: 'tuple', + dict: 'dict', Dict: 'dict', + any: 'any', Any: 'any', +}; + +function normaliseDataType(raw: string | null): string | null { + if (!raw) return null; + const outer = raw.split('[')[0].trim(); + return PY_TYPE_TO_XIRCUITS[outer] ?? outer; +} + +function extractFields(classBody: string): Field[] { + const fields: Field[] = []; + const lines = classBody.split('\n'); + + let inDocstring = false; + let docstringDelim = ''; + + for (const raw of lines) { + const line = raw.replace(/\r$/, ''); + const trimmed = line.trim(); + + if (inDocstring) { + if (trimmed.includes(docstringDelim)) inDocstring = false; + continue; + } + if (trimmed.startsWith('"""') || trimmed.startsWith("'''")) { + docstringDelim = trimmed.startsWith('"""') ? '"""' : "'''"; + const rest = trimmed.slice(3); + if (!rest.includes(docstringDelim)) inDocstring = true; + continue; + } + + if (trimmed.startsWith('def ') || trimmed.startsWith('class ') || trimmed.startsWith('@')) { + break; + } + + const m = line.match(FIELD_RE); + if (!m) continue; + const [, varName, kind, dataType] = m; + fields.push({ + varName, + kind: kind as FieldKind, + dataType: normaliseDataType(dataType ? dataType.trim() : null), + }); + } + + return fields; +} diff --git a/xircuits-graph-viewer/packages/core/src/parser/classify.ts b/xircuits-graph-viewer/packages/core/src/parser/classify.ts new file mode 100644 index 00000000..4ed1a30c --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/parser/classify.ts @@ -0,0 +1,58 @@ +import type { NodeKind, PortKind, PortDirection, EdgeKind } from '../types.js'; + +export function classifyNode(name: string, extras: Record): NodeKind { + const type = extras.type as string | undefined; + + if (type === 'comment') return 'comment'; + if (name.startsWith('Literal') || name.startsWith('Argument')) return 'literal'; + if (type === 'xircuits_workflow') return 'workflow'; + if (name === 'Start') return 'start'; + if (name === 'Finish') return 'finish'; + + // Sub-kinds from extras.type + if (type === 'branch') return 'branch'; + if (type === 'function') return 'function'; + if (type === 'context_set') return 'context_set'; + if (type === 'context_get') return 'context_get'; + if (type === 'variable') return 'variable'; + + return 'component'; +} + +export function classifyPort( + portName: string, + label: string, + isIn: boolean, + nodeName: string +): { kind: PortKind; direction: PortDirection; dataType: string | null; varName: string } { + const direction: PortDirection = isIn ? 'in' : 'out'; + + // Flow ports: name starts with "in-" or "out-" (flow connectors with ▶ label) + const isFlowPort = + label === '▶' && !nodeName.startsWith('Argument'); + + if (isFlowPort || portName.startsWith('out-') && label === '▶' || portName.startsWith('in-') && label === '▶') { + return { kind: 'flow', direction, dataType: null, varName: label }; + } + + // Parameter ports: "parameter-TYPE-NAME" or "parameter-out-TYPE-NAME" + let dataType: string | null = null; + let varName = label; + + if (portName.startsWith('parameter-')) { + const parts = portName.split('-'); + if (parts[1] === 'out') { + // parameter-out-TYPE-NAME + dataType = parts[2] || null; + } else { + // parameter-TYPE-NAME + dataType = parts[1] || null; + } + } + + return { kind: 'parameter', direction, dataType, varName }; +} + +export function classifyEdge(type: string): EdgeKind { + return type === 'triangle-link' ? 'flow' : 'data'; +} diff --git a/xircuits-graph-viewer/packages/core/src/parser/parse.ts b/xircuits-graph-viewer/packages/core/src/parser/parse.ts new file mode 100644 index 00000000..31795314 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/parser/parse.ts @@ -0,0 +1,156 @@ +import type { XGraph, XNode, XEdge, XPort } from '../types.js'; +import { classifyNode, classifyPort, classifyEdge } from './classify.js'; +import { validate } from './validate.js'; + +interface RawPort { + id: string; + name: string; + alignment: string; + parentNode: string; + links: string[]; + in: boolean; + label: string; + varName: string; + dataType: string; + x: number; + y: number; + extras?: Record; +} + +interface RawNode { + id: string; + type: string; + extras: Record; + x: number; + y: number; + ports: RawPort[]; + name: string; + color: string; + portsInOrder: string[]; + portsOutOrder: string[]; +} + +interface RawLink { + id: string; + type: string; + source: string; + sourcePort: string; + target: string; + targetPort: string; + points: Array<{ x: number; y: number }>; + color: string; + width: number; + curvyness: number; + selectedColor: string; +} + +interface RawLayer { + type: string; + models: Record; +} + +export function parse(json: unknown): XGraph { + const { valid, errors } = validate(json); + if (!valid) { + throw new Error(`Invalid .xircuits file: ${errors.join(', ')}`); + } + + const obj = json as Record; + const layers = obj.layers as RawLayer[]; + + const linkLayer = layers.find(l => l.type === 'diagram-links'); + const nodeLayer = layers.find(l => l.type === 'diagram-nodes')!; + + const rawNodes = Object.values(nodeLayer.models) as RawNode[]; + const rawLinks = linkLayer + ? (Object.values(linkLayer.models) as RawLink[]) + : []; + + // Build a port ID set for quick lookup + const portMap = new Map(); + for (const rawNode of rawNodes) { + for (const port of rawNode.ports) { + portMap.set(port.id, port); + } + } + + const nodes: XNode[] = rawNodes.map(raw => { + const kind = classifyNode(raw.name, raw.extras); + + // Order ports according to portsInOrder/portsOutOrder + const portsInOrdered = orderPorts(raw.ports, raw.portsInOrder, true); + const portsOutOrdered = orderPorts(raw.ports, raw.portsOutOrder, false); + + const portsIn: XPort[] = portsInOrdered.map(p => { + const cls = classifyPort(p.name, p.label, true, raw.name); + return { + id: p.id, + direction: cls.direction, + kind: cls.kind, + label: p.label, + varName: cls.varName, + dataType: p.dataType || cls.dataType, + linkIds: p.links || [], + }; + }); + + const portsOut: XPort[] = portsOutOrdered.map(p => { + const cls = classifyPort(p.name, p.label, false, raw.name); + return { + id: p.id, + direction: cls.direction, + kind: cls.kind, + label: p.label, + varName: cls.varName, + dataType: p.dataType || cls.dataType, + linkIds: p.links || [], + }; + }); + + return { + id: raw.id, + kind, + name: raw.name, + color: raw.color || 'red', + x: raw.x, + y: raw.y, + portsIn, + portsOut, + extras: raw.extras || {}, + }; + }); + + const edges: XEdge[] = rawLinks.map(raw => ({ + id: raw.id, + kind: classifyEdge(raw.type), + sourceNodeId: raw.source, + sourcePortId: raw.sourcePort, + targetNodeId: raw.target, + targetPortId: raw.targetPort, + points: raw.points || [], + color: raw.color || 'gray', + })); + + return { + id: obj.id as string, + viewport: { + x: (obj.offsetX as number) || 0, + y: (obj.offsetY as number) || 0, + zoom: (obj.zoom as number) || 100, + }, + nodes, + edges, + }; +} + +function orderPorts( + ports: RawPort[], + order: string[], + isIn: boolean +): RawPort[] { + if (!order || order.length === 0) { + return ports.filter(p => p.in === isIn); + } + const portById = new Map(ports.map(p => [p.id, p])); + return order.map(id => portById.get(id)).filter((p): p is RawPort => p != null); +} diff --git a/xircuits-graph-viewer/packages/core/src/parser/validate.ts b/xircuits-graph-viewer/packages/core/src/parser/validate.ts new file mode 100644 index 00000000..3d00218c --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/parser/validate.ts @@ -0,0 +1,40 @@ +export function validate(json: unknown): { valid: boolean; errors: string[] } { + const errors: string[] = []; + + if (!json || typeof json !== 'object') { + return { valid: false, errors: ['Input must be an object'] }; + } + + const obj = json as Record; + + if (typeof obj.id !== 'string') { + errors.push('Missing or invalid "id" field'); + } + + if (!Array.isArray(obj.layers)) { + errors.push('Missing or invalid "layers" array'); + return { valid: false, errors }; + } + + const layers = obj.layers as Array>; + + const linkLayer = layers.find(l => l.type === 'diagram-links'); + const nodeLayer = layers.find(l => l.type === 'diagram-nodes'); + + if (!nodeLayer) { + errors.push('Missing diagram-nodes layer'); + } + + if (!linkLayer) { + // Links layer is optional (a graph with no connections) + } + + if (nodeLayer) { + const models = nodeLayer.models; + if (!models || typeof models !== 'object') { + errors.push('diagram-nodes layer missing "models" object'); + } + } + + return { valid: errors.length === 0, errors }; +} diff --git a/xircuits-graph-viewer/packages/core/src/render/colors.ts b/xircuits-graph-viewer/packages/core/src/render/colors.ts new file mode 100644 index 00000000..c2293b4e --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/colors.ts @@ -0,0 +1,91 @@ +// Color utilities for title bar gradients. +// Replicates the Xircuits oklch gradient logic from CustomNodeWidget.tsx. +// Outputs oklch() CSS — requires a modern browser or renderer for full fidelity. + +function parseColor(color: string): { r: number; g: number; b: number } { + const named: Record = { + red: '#ff0000', blue: '#0000ff', green: '#008000', yellow: '#ffff00', + orange: '#ffa500', purple: '#800080', pink: '#ffc0cb', lightpink: '#ffb6c1', + cyan: '#00ffff', white: '#ffffff', black: '#000000', gray: '#808080', + grey: '#808080', salmon: '#fa8072', coral: '#ff7f50', teal: '#008080', + navy: '#000080', maroon: '#800000', lime: '#00ff00', magenta: '#ff00ff', + darkred: '#8b0000', darkblue: '#00008b', darkgreen: '#006400', + goldenrod: '#daa520', tomato: '#ff6347', orchid: '#da70d6', + }; + + const lower = color.toLowerCase().trim(); + if (named[lower]) color = named[lower]; + + const hexMatch = color.match(/^#([0-9a-f]{3,8})$/i); + if (hexMatch) { + let hex = hexMatch[1]; + if (hex.length === 3) hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + return { + r: parseInt(hex.slice(0, 2), 16) / 255, + g: parseInt(hex.slice(2, 4), 16) / 255, + b: parseInt(hex.slice(4, 6), 16) / 255, + }; + } + + const rgbMatch = color.match(/rgb\(\s*(\d+)[,\s]+(\d+)[,\s]+(\d+)/); + if (rgbMatch) { + return { + r: parseInt(rgbMatch[1]) / 255, + g: parseInt(rgbMatch[2]) / 255, + b: parseInt(rgbMatch[3]) / 255, + }; + } + + return { r: 0.5, g: 0.5, b: 0.5 }; +} + +function srgbToLinear(c: number): number { + return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); +} + +function toOklab(r: number, g: number, b: number) { + const l_ = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b; + const m_ = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b; + const s_ = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b; + const l = Math.cbrt(l_), m = Math.cbrt(m_), s = Math.cbrt(s_); + return { + L: 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s, + a: 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s, + b: 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s, + }; +} + +function rgbToOklch(color: string): { l: number; c: number; h: number } { + const { r, g, b } = parseColor(color); + const lab = toOklab(srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)); + const c = Math.sqrt(lab.a * lab.a + lab.b * lab.b); + let h = Math.atan2(lab.b, lab.a) * (180 / Math.PI); + if (h < 0) h += 360; + return { l: lab.L, c, h }; +} + +export interface GradientColors { + color1: string; + color2: string; +} + +/** + * Replicate the Xircuits title gradient from CustomNodeWidget.tsx: + * const color = new Color(p.background); + * color.alpha = 0.75; color.oklch.c *= 1.2; + * const color1 = color.to('oklch').toString() + * color.oklch.c *= 1.2; color.oklch.l /= 2; + * const color2 = color.to('oklch').toString() + */ +export function titleGradient(baseColor: string): GradientColors { + const oklch = rgbToOklch(baseColor); + + const c1_c = oklch.c * 1.2; + const c1 = `oklch(${(oklch.l * 100).toFixed(1)}% ${c1_c.toFixed(4)} ${oklch.h.toFixed(1)} / 0.75)`; + + const c2_c = c1_c * 1.2; + const c2_l = oklch.l / 2; + const c2 = `oklch(${(c2_l * 100).toFixed(1)}% ${c2_c.toFixed(4)} ${oklch.h.toFixed(1)} / 0.75)`; + + return { color1: c1, color2: c2 }; +} diff --git a/xircuits-graph-viewer/packages/core/src/render/renderDefs.ts b/xircuits-graph-viewer/packages/core/src/render/renderDefs.ts new file mode 100644 index 00000000..067980dd --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/renderDefs.ts @@ -0,0 +1,218 @@ +import { el } from '../svg/builder.js'; +import type { XNode } from '../types.js'; +import { titleGradient } from './colors.js'; + +export function renderDefs(nodes: XNode[], theme: 'dark' | 'light'): string { + const gradients: string[] = []; + const seenColors = new Set(); + + for (const node of nodes) { + if (node.kind === 'comment') continue; + const color = node.color; + if (seenColors.has(color)) continue; + seenColors.add(color); + + const { color1, color2 } = titleGradient(color); + const gradId = colorToGradientId(color); + gradients.push( + el('linearGradient', { id: gradId, x1: '0', y1: '0', x2: '0', y2: '1' }, + el('stop', { offset: '0%', 'stop-color': color1 }), + el('stop', { offset: '100%', 'stop-color': color2 }), + ) + ); + } + + const style = renderStyleBlock(theme); + + const flowInSymbol = el('symbol', { id: 'xg-flow-in', viewBox: '0 0 24 24' }, + el('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + el('path', { d: 'M3 12h12' }), + el('path', { d: 'M11 8l4 4l-4 4' }), + el('path', { d: 'M12 21a9 9 0 0 0 0 -18' }), + ); + + const flowOutSymbol = el('symbol', { id: 'xg-flow-out', viewBox: '0 0 24 24' }, + el('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + el('path', { d: 'M9 12h12' }), + el('path', { d: 'M17 16l4 -4l-4 -4' }), + el('path', { d: 'M12 3a9 9 0 1 0 0 18' }), + ); + + // Node icon symbols (from style/icons/*.svg in the Xircuits repo) + const nodeIcons = renderNodeIconSymbols(); + + return el('defs', {}, + style, + ...gradients, + flowInSymbol, + flowOutSymbol, + nodeIcons, + ); +} + +export function colorToGradientId(color: string): string { + return 'xg-grad-' + color.replace(/[^a-zA-Z0-9]/g, '_'); +} + +function renderNodeIconSymbols(): string { + const s = el; + // Each symbol extracted from style/icons/*.svg in the Xircuits repo + // All use viewBox="0 0 24 24", stroke="currentColor" (inherited) + + const icons: string[] = []; + + // start-finish-component.svg (filled direction sign diamond) + icons.push(s('symbol', { id: 'xg-icon-start-finish', viewBox: '0 0 24 24', fill: 'currentColor' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M10.52 2.614a2.095 2.095 0 0 1 2.835 -.117l.126 .117l7.905 7.905c.777 .777 .816 2.013 .117 2.836l-.117 .126l-7.905 7.905a2.094 2.094 0 0 1 -2.836 .117l-.126 -.117l-7.907 -7.906a2.096 2.096 0 0 1 -.115 -2.835l.117 -.126l7.905 -7.905zm5.969 9.535l.01 -.116l-.003 -.12l-.016 -.114l-.03 -.11l-.044 -.112l-.052 -.098l-.076 -.105l-.07 -.081l-3.5 -3.5l-.095 -.083a1 1 0 0 0 -1.226 0l-.094 .083l-.083 .094a1 1 0 0 0 0 1.226l.083 .094l1.792 1.793h-5.085l-.117 .007a1 1 0 0 0 0 1.986l.117 .007h5.085l-1.792 1.793l-.083 .094a1 1 0 0 0 1.403 1.403l.094 -.083l3.5 -3.5l.097 -.112l.05 -.074l.037 -.067l.05 -.112l.023 -.076l.025 -.117z' }), + )); + + // component-library.svg (3D cube outline) + icons.push(s('symbol', { id: 'xg-icon-component', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718z' }), + s('path', { d: 'M12 22v-10' }), + s('path', { d: 'M12 12l8.73 -5.04' }), + s('path', { d: 'M3.27 6.96l8.73 5.04' }), + )); + + // workflow-component.svg (chart dots) + icons.push(s('symbol', { id: 'xg-icon-workflow', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M5 7m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0' }), + s('path', { d: 'M16 15m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0' }), + s('path', { d: 'M18 6m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0' }), + s('path', { d: 'M6 18m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0' }), + s('path', { d: 'M9 17l5 -1.5' }), + s('path', { d: 'M6.5 8.5l7.81 5.37' }), + s('path', { d: 'M7 7l8 -1' }), + )); + + // branch-component.svg (arrows split) + icons.push(s('symbol', { id: 'xg-icon-branch', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M21 17h-8l-3.5 -5h-6.5' }), + s('path', { d: 'M21 7h-8l-3.495 5' }), + s('path', { d: 'M18 10l3 -3l-3 -3' }), + s('path', { d: 'M18 20l3 -3l-3 -3' }), + )); + + // function-component.svg (math function) + icons.push(s('symbol', { id: 'xg-icon-function', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2.5, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M3 19a2 2 0 0 0 2 2c2 0 2 -4 3 -9s1 -9 3 -9a2 2 0 0 1 2 2' }), + s('path', { d: 'M5 12h6' }), + s('path', { d: 'M15 12l6 6' }), + s('path', { d: 'M15 18l6 -6' }), + )); + + // set-variable-component.svg (world upload) + icons.push(s('symbol', { id: 'xg-icon-context_set', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M21 12a9 9 0 1 0 -9 9' }), + s('path', { d: 'M3.6 9h16.8' }), + s('path', { d: 'M3.6 15h8.4' }), + s('path', { d: 'M11.578 3a17 17 0 0 0 0 18' }), + s('path', { d: 'M12.5 3c1.719 2.755 2.5 5.876 2.5 9' }), + s('path', { d: 'M18 21v-7m3 3l-3 -3l-3 3' }), + )); + + // get-variable-component.svg (world download) + icons.push(s('symbol', { id: 'xg-icon-context_get', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M21 12a9 9 0 1 0 -9 9' }), + s('path', { d: 'M3.6 9h16.8' }), + s('path', { d: 'M3.6 15h8.4' }), + s('path', { d: 'M11.578 3a17 17 0 0 0 0 18' }), + s('path', { d: 'M12.5 3c1.719 2.755 2.5 5.876 2.5 9' }), + s('path', { d: 'M18 14v7m-3 -3l3 3l3 -3' }), + )); + + // variable-component.svg (variable x) + icons.push(s('symbol', { id: 'xg-icon-variable', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, + s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), + s('path', { d: 'M5 4c-2.5 5 -2.5 10 0 16m14 -16c2.5 5 2.5 10 0 16m-10 -11h1c1 0 1 1 2.016 3.527c.984 2.473 .984 3.473 1.984 3.473h1' }), + s('path', { d: 'M8 16c1.5 0 3 -2 4 -3.5s2.5 -3.5 4 -3.5' }), + )); + + return icons.join(''); +} + +function renderStyleBlock(theme: 'dark' | 'light'): string { + const isDark = theme === 'dark'; + const css = ` +.xg-root { + font-family: sans-serif; + font-size: 11px; +} +.xg-node__border { + fill: none; + stroke: ${isDark ? 'black' : 'oklch(0.8 0 0)'}; + stroke-width: 1; +} +.xg-node__title-text { + fill: white; + font-weight: 500; + letter-spacing: 0.025rem; +} +.xg-node__body { + fill: ${isDark + ? 'oklch(10% 0 0 / 0.85)' + : 'oklch(99% 0 0 / 0.85)'}; + stroke: none; +} +.xg-port__dot { + fill: oklch(50% 0 0 / 0.2); + stroke: oklch(0 0 0 / 0.2); + stroke-width: 1; +} +.xg-port__dot--connected { + fill: oklch(100% 0 0 / 0.5); +} +.xg-port__label { + fill: ${isDark ? 'white' : 'black'}; +} +.xg-port__symbol { + font-weight: bold; + font-family: Helvetica, Arial, sans-serif; +} +.xg-port__symbol--connected { fill: black; } +.xg-port__symbol--disconnected { fill: grey; } +.xg-port--flow use { + stroke-width: 3; + stroke-linecap: round; + stroke-linejoin: round; + fill: none; +} +.xg-port--flow--connected use { stroke: oklch(0% 0 0 / 0.8); } +.xg-port--flow--disconnected use { stroke: oklch(100% 0 0 / 0.8); } +.xg-edge--flow { + stroke: rgb(0, 192, 255); + stroke-width: 3; + fill: none; + stroke-dasharray: 10 2; + animation: xg-flow 1s steps(24) infinite; + filter: drop-shadow(2px 2px 4px rgb(0 0 0 / 40%)) opacity(60%); +} +.xg-edge--data { + stroke: gray; + stroke-width: 3; + fill: none; + filter: drop-shadow(2px 2px 4px rgb(0 0 0 / 40%)) opacity(60%); +} +.xg-comment__bg { + fill: ${isDark ? 'rgba(0, 0, 0, 0.3)' : 'oklch(0.98 0.13 108.65)'}; + stroke: ${isDark ? 'black' : '#ccc'}; + stroke-width: 2; + rx: 5; +} +.xg-comment__text { + fill: ${isDark ? 'white' : 'black'}; +} +@keyframes xg-flow { + from { stroke-dashoffset: 24; } + to { stroke-dashoffset: 0; } +} +`; + return el('style', {}, css); +} diff --git a/xircuits-graph-viewer/packages/core/src/render/renderEdge.ts b/xircuits-graph-viewer/packages/core/src/render/renderEdge.ts new file mode 100644 index 00000000..acc169c4 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/renderEdge.ts @@ -0,0 +1,23 @@ +import type { XEdge, XNode, NodeMetrics, RenderOptions } from '../types.js'; +import { g, el } from '../svg/builder.js'; +import { bezierPath } from '../svg/bezier.js'; + +export function renderEdge( + edge: XEdge, + nodesById: Map, + metricsMap: Map, + options?: RenderOptions, +): string { + if (!edge.points || edge.points.length < 2) return ''; + + const p0 = edge.points[0]; + const p1 = edge.points[edge.points.length - 1]; + const d = bezierPath(p0.x, p0.y, p1.x, p1.y, 50); + const extraClass = options?.edgeClassFn?.(edge) || ''; + const cls = edge.kind === 'flow' ? 'xg-edge xg-edge--flow' : 'xg-edge xg-edge--data'; + + return g( + { class: `xg-edge-group ${extraClass}`.trim(), 'data-edge-id': edge.id }, + el('path', { class: cls, d }), + ); +} diff --git a/xircuits-graph-viewer/packages/core/src/render/renderGraph.ts b/xircuits-graph-viewer/packages/core/src/render/renderGraph.ts new file mode 100644 index 00000000..8d0c2fd3 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/renderGraph.ts @@ -0,0 +1,61 @@ +import type { XGraph, RenderOptions, NodeMetrics } from '../types.js'; +import { svgRoot, g, el } from '../svg/builder.js'; +import { computeNodeMetrics } from '../layout/metrics.js'; +import { computeViewBox } from '../layout/viewBox.js'; +import { renderDefs } from './renderDefs.js'; +import { renderNode } from './renderNode.js'; +import { renderEdge } from './renderEdge.js'; +import { parse } from '../parser/parse.js'; + +export function renderToString(graph: XGraph, options: RenderOptions = {}): string { + const { + theme = 'dark', + padding = 40, + fitView = true, + className, + width, + height, + } = options; + + const metricsMap = new Map(); + for (const node of graph.nodes) { + metricsMap.set(node.id, computeNodeMetrics(node)); + } + + const viewBox = fitView + ? computeViewBox(graph.nodes, metricsMap, padding) + : { x: -graph.viewport.x, y: -graph.viewport.y, width: width || 800, height: height || 600 }; + + const nodesById = new Map(graph.nodes.map(n => [n.id, n])); + const defs = renderDefs(graph.nodes, theme); + + const edgeElements = graph.edges.map(edge => renderEdge(edge, nodesById, metricsMap, options)); + const nodeElements = graph.nodes.map(node => renderNode(node, metricsMap.get(node.id)!, options)); + + const rootClass = ['xg-root', className].filter(Boolean).join(' '); + + return svgRoot( + { + viewBox: `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`, + class: rootClass, + 'data-theme': theme, + ...(width ? { width } : {}), + ...(height ? { height } : {}), + }, + defs, + g({ class: 'xg-edges' }, ...edgeElements), + g({ class: 'xg-nodes' }, ...nodeElements), + ); +} + +export function renderToElement(graph: XGraph, options: RenderOptions = {}): SVGSVGElement { + const svgString = renderToString(graph, options); + const parser = new DOMParser(); + const doc = parser.parseFromString(svgString, 'image/svg+xml'); + return doc.documentElement as unknown as SVGSVGElement; +} + +export function renderXircuits(json: unknown, options: RenderOptions = {}): string { + const graph = parse(json); + return renderToString(graph, options); +} diff --git a/xircuits-graph-viewer/packages/core/src/render/renderNode.ts b/xircuits-graph-viewer/packages/core/src/render/renderNode.ts new file mode 100644 index 00000000..11877176 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/renderNode.ts @@ -0,0 +1,117 @@ +import type { XNode, NodeMetrics, RenderOptions } from '../types.js'; +import { g, rect, text, el, escapeXml } from '../svg/builder.js'; +import { colorToGradientId } from './renderDefs.js'; +import { renderPort } from './renderPort.js'; +import { FONT_SIZE, TITLE_HEIGHT, TITLE_PADDING_X, TITLE_ICON_SIZE, COMMENT_PADDING } from '../layout/metrics.js'; + +export function renderNode( + node: XNode, + metrics: NodeMetrics, + options?: RenderOptions, +): string { + const extraClass = options?.nodeClassFn?.(node) || ''; + + if (node.kind === 'comment') { + return renderCommentNode(node, metrics, extraClass); + } + + return renderStandardNode(node, metrics, extraClass); +} + +function renderStandardNode(node: XNode, metrics: NodeMetrics, extraClass: string): string { + const gradientId = colorToGradientId(node.color); + const { width, height } = metrics; + const bodyHeight = height - TITLE_HEIGHT; + + const elements: string[] = []; + + // Border + elements.push(rect({ x: 0, y: 0, width, height, rx: 5, ry: 5, class: 'xg-node__border' })); + + // Title gradient + elements.push(rect({ x: 0, y: 0, width, height: TITLE_HEIGHT, rx: 5, ry: 5, fill: `url(#${gradientId})` })); + if (bodyHeight > 0) { + elements.push(rect({ x: 0, y: TITLE_HEIGHT - 5, width, height: 5, fill: `url(#${gradientId})` })); + } + + // Icon + elements.push(renderNodeIcon(node.kind, TITLE_PADDING_X, (TITLE_HEIGHT - TITLE_ICON_SIZE) / 2)); + + // Name + elements.push(text( + { x: TITLE_PADDING_X + TITLE_ICON_SIZE + TITLE_PADDING_X, y: TITLE_HEIGHT - 8, 'font-size': FONT_SIZE, class: 'xg-node__title-text' }, + node.name.length > 40 ? node.name.slice(0, 39) + '…' : node.name, + )); + + // Body + if (bodyHeight > 0) { + elements.push(rect({ x: 0, y: TITLE_HEIGHT, width, height: bodyHeight, rx: 5, ry: 5, class: 'xg-node__body' })); + elements.push(rect({ x: 0, y: TITLE_HEIGHT, width, height: Math.min(5, bodyHeight), class: 'xg-node__body' })); + } + + // Ports + node.portsIn.forEach((port, i) => elements.push(renderPort(port, width, i, TITLE_HEIGHT))); + node.portsOut.forEach((port, i) => elements.push(renderPort(port, width, i, TITLE_HEIGHT))); + + return g( + { class: `xg-node xg-node--${node.kind} ${extraClass}`.trim(), transform: `translate(${node.x}, ${node.y})`, 'data-node-id': node.id }, + ...elements, + ); +} + +function renderCommentNode(node: XNode, metrics: NodeMetrics, extraClass: string): string { + const { width, height } = metrics; + const commentText = (node.extras.commentInput as string) || ''; + const elements: string[] = []; + + elements.push(rect({ x: 0, y: 0, width, height, rx: 5, ry: 5, class: 'xg-comment__bg' })); + elements.push(text( + { x: COMMENT_PADDING, y: COMMENT_PADDING + 12, 'font-size': 12, 'font-weight': 'bold', class: 'xg-comment__text' }, + 'Comment:', + )); + + const lines = commentText.split('\n'); + const tspans = lines.map((line, i) => + el('tspan', { x: COMMENT_PADDING, dy: i === 0 ? 18 : 18 }, escapeXml(line)) + ).join(''); + elements.push(el('text', { x: COMMENT_PADDING, y: COMMENT_PADDING + 14, 'font-size': 12, class: 'xg-comment__text' }, tspans)); + + return g( + { class: `xg-node xg-node--comment ${extraClass}`.trim(), transform: `translate(${node.x}, ${node.y})`, 'data-node-id': node.id }, + ...elements, + ); +} + +// Map node kind → symbol ID (matching getNodeIcon in CustomNodeWidget.tsx) +function getIconSymbolId(kind: string, extrasType?: string): string { + switch (kind) { + case 'start': + case 'finish': + return 'xg-icon-start-finish'; + case 'workflow': + return 'xg-icon-workflow'; + case 'branch': + return 'xg-icon-branch'; + case 'function': + return 'xg-icon-function'; + case 'context_set': + return 'xg-icon-context_set'; + case 'context_get': + return 'xg-icon-context_get'; + case 'variable': + return 'xg-icon-variable'; + default: + return 'xg-icon-component'; + } +} + +function renderNodeIcon(kind: string, x: number, y: number): string { + const symbolId = getIconSymbolId(kind); + return el('use', { + href: `#${symbolId}`, + x, y, + width: TITLE_ICON_SIZE, + height: TITLE_ICON_SIZE, + color: 'white', + }); +} diff --git a/xircuits-graph-viewer/packages/core/src/render/renderPort.ts b/xircuits-graph-viewer/packages/core/src/render/renderPort.ts new file mode 100644 index 00000000..4ef7c675 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/renderPort.ts @@ -0,0 +1,83 @@ +import type { XPort } from '../types.js'; +import { g, text, el } from '../svg/builder.js'; +import { getPortSymbol } from './symbols.js'; +import { PORT_ROW_HEIGHT, PORT_DOT_SIZE, FONT_SIZE, PORT_LABEL_PADDING } from '../layout/metrics.js'; + +const SYMBOL_FONT_SIZE = 9; + +export function renderPort( + port: XPort, + nodeWidth: number, + rowIndex: number, + titleHeight: number, +): string { + const isOut = port.direction === 'out'; + const y = titleHeight + rowIndex * PORT_ROW_HEIGHT; + const isConnected = port.linkIds.length > 0; + const isFlow = port.kind === 'flow'; + const dotY = y + (PORT_ROW_HEIGHT - PORT_DOT_SIZE) / 2; + + if (isOut) { + const dotX = nodeWidth - PORT_DOT_SIZE; + const dot = renderDot(port, dotX, dotY, isOut, isConnected, isFlow); + const label = isFlow ? '' : renderLabel(port.label, dotX - PORT_LABEL_PADDING, y, 'end'); + return g({ class: `xg-port xg-port--out xg-port--${isFlow ? 'flow' : 'param'}`, 'data-port-id': port.id }, dot, label); + } else { + const dotX = 0; + const dot = renderDot(port, dotX, dotY, isOut, isConnected, isFlow); + const label = isFlow ? '' : renderLabel(port.label, PORT_DOT_SIZE + PORT_LABEL_PADDING, y, 'start'); + return g({ class: `xg-port xg-port--in xg-port--${isFlow ? 'flow' : 'param'}`, 'data-port-id': port.id }, dot, label); + } +} + +function renderDot( + port: XPort, + x: number, + y: number, + isOut: boolean, + isConnected: boolean, + isFlow: boolean, +): string { + const elements: string[] = []; + const w = PORT_DOT_SIZE; + const h = PORT_DOT_SIZE; + const r = 8; + + // Half-rounded rect: out-ports rounded on left, in-ports rounded on right + let d: string; + if (isOut) { + d = `M${x + r},${y} L${x + w},${y} L${x + w},${y + h} L${x + r},${y + h} A${r},${r} 0 0,1 ${x},${y + h - r} L${x},${y + r} A${r},${r} 0 0,1 ${x + r},${y}Z`; + } else { + d = `M${x},${y} L${x + w - r},${y} A${r},${r} 0 0,1 ${x + w},${y + r} L${x + w},${y + h - r} A${r},${r} 0 0,1 ${x + w - r},${y + h} L${x},${y + h}Z`; + } + + const connClass = isConnected ? ' xg-port__dot--connected' : ''; + elements.push(el('path', { d, class: `xg-port__dot${connClass}` })); + + if (isFlow) { + const iconRef = isOut ? '#xg-flow-out' : '#xg-flow-in'; + const flowClass = isConnected ? 'xg-port--flow--connected' : 'xg-port--flow--disconnected'; + elements.push(el('g', { class: flowClass }, + el('use', { href: iconRef, x: x + 1.5, y: y + 1.5, width: 12, height: 12 }), + )); + } else { + const symbol = getPortSymbol(port.dataType); + if (symbol) { + const symClass = isConnected ? 'xg-port__symbol xg-port__symbol--connected' : 'xg-port__symbol xg-port__symbol--disconnected'; + elements.push(text( + { x: x + w / 2, y: y + h - 3, 'text-anchor': 'middle', 'font-size': SYMBOL_FONT_SIZE, class: symClass }, + symbol, + )); + } + } + + return elements.join(''); +} + +function renderLabel(label: string, x: number, y: number, anchor: 'start' | 'end'): string { + const displayLabel = label.length > 40 ? label.slice(0, 37) + '...' : label; + return text( + { x, y: y + PORT_ROW_HEIGHT / 2 + FONT_SIZE / 2 - 1, 'text-anchor': anchor, 'font-size': FONT_SIZE, class: 'xg-port__label' }, + displayLabel, + ); +} diff --git a/xircuits-graph-viewer/packages/core/src/render/symbols.ts b/xircuits-graph-viewer/packages/core/src/render/symbols.ts new file mode 100644 index 00000000..76692f02 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/render/symbols.ts @@ -0,0 +1,46 @@ +export const SYMBOL_MAP: Record = { + 'string': '" "', + 'int': ' 1', + 'float': '1.0', + 'boolean': '⊤⊥', + 'time.time': '𝘵', + 'list': '[ ]', + 'tuple': '( )', + 'dict': '{ }', + 'dynalist': '«[]»', + 'dynatuple': '«()»', + 'union': ' U', + 'secret': '🗝️', + 'chat': '🗨', + 'any': '[_]', + '0': null, + 'flow': null, +}; + +export const UNKNOWN_SYMBOL = '◎'; + +export function getPortSymbol(dataType: string | null): string | null { + if (!dataType) return null; + const lower = dataType.toLowerCase(); + if (lower in SYMBOL_MAP) return SYMBOL_MAP[lower]; + return UNKNOWN_SYMBOL; +} + +// Flow port SVG icons (from CustomPortLabel.tsx) +export const FLOW_IN_ICON = [ + '', + '', + '', + '', + '', + '', +].join(''); + +export const FLOW_OUT_ICON = [ + '', + '', + '', + '', + '', + '', +].join(''); diff --git a/xircuits-graph-viewer/packages/core/src/svg/bezier.ts b/xircuits-graph-viewer/packages/core/src/svg/bezier.ts new file mode 100644 index 00000000..cb44d2f8 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/svg/bezier.ts @@ -0,0 +1,14 @@ +/** + * Generate a cubic bezier path between two points. + * Matches react-diagrams' DefaultLinkModel.getSVGPath() behavior: + * control points offset horizontally by `curvyness` (default 50). + */ +export function bezierPath( + x1: number, + y1: number, + x2: number, + y2: number, + curvyness: number = 50, +): string { + return `M${x1},${y1} C${x1 + curvyness},${y1} ${x2 - curvyness},${y2} ${x2},${y2}`; +} diff --git a/xircuits-graph-viewer/packages/core/src/svg/builder.ts b/xircuits-graph-viewer/packages/core/src/svg/builder.ts new file mode 100644 index 00000000..f85e3771 --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/svg/builder.ts @@ -0,0 +1,57 @@ +type Attrs = Record; + +function attrString(attrs: Attrs): string { + return Object.entries(attrs) + .filter(([, v]) => v !== undefined && v !== false) + .map(([k, v]) => { + if (v === true) return k; + return `${k}="${escapeAttr(String(v))}"`; + }) + .join(' '); +} + +function escapeAttr(s: string): string { + return s.replace(/&/g, '&').replace(/"/g, '"').replace(//g, '>'); +} + +export function escapeXml(s: string): string { + return s + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +export function el(tag: string, attrs: Attrs, ...children: string[]): string { + const a = attrString(attrs); + const open = a ? `<${tag} ${a}` : `<${tag}`; + if (children.length === 0) { + return `${open}/>`; + } + return `${open}>${children.join('')}`; +} + +export function g(attrs: Attrs, ...children: string[]): string { + return el('g', attrs, ...children); +} + +export function rect(attrs: Attrs): string { + return el('rect', attrs); +} + +export function text(attrs: Attrs, content: string): string { + return el('text', attrs, escapeXml(content)); +} + +export function path(attrs: Attrs): string { + return el('path', attrs); +} + +export function line(attrs: Attrs): string { + return el('line', attrs); +} + +export function svgRoot(attrs: Attrs, ...children: string[]): string { + return el('svg', { xmlns: 'http://www.w3.org/2000/svg', ...attrs }, ...children); +} diff --git a/xircuits-graph-viewer/packages/core/src/types.ts b/xircuits-graph-viewer/packages/core/src/types.ts new file mode 100644 index 00000000..f609425c --- /dev/null +++ b/xircuits-graph-viewer/packages/core/src/types.ts @@ -0,0 +1,75 @@ +export type PortDirection = 'in' | 'out'; +export type PortKind = 'flow' | 'parameter'; +export type NodeKind = + | 'start' + | 'finish' + | 'literal' + | 'component' + | 'workflow' + | 'branch' + | 'comment' + | 'function' + | 'context_set' + | 'context_get' + | 'variable'; +export type EdgeKind = 'flow' | 'data'; + +export interface XPort { + id: string; + direction: PortDirection; + kind: PortKind; + label: string; + varName: string; + dataType: string | null; + linkIds: string[]; +} + +export interface XNode { + id: string; + kind: NodeKind; + name: string; + color: string; + x: number; + y: number; + portsIn: XPort[]; + portsOut: XPort[]; + extras: Record; +} + +export interface XEdge { + id: string; + kind: EdgeKind; + sourceNodeId: string; + sourcePortId: string; + targetNodeId: string; + targetPortId: string; + points: Array<{ x: number; y: number }>; + color: string; +} + +export interface XGraph { + id: string; + viewport: { x: number; y: number; zoom: number }; + nodes: XNode[]; + edges: XEdge[]; +} + +export interface RenderOptions { + theme?: 'dark' | 'light'; + width?: number; + height?: number; + padding?: number; + fitView?: boolean; + interactive?: boolean; + className?: string; + nodeClassFn?: (node: XNode) => string; + edgeClassFn?: (edge: XEdge) => string; +} + +export interface NodeMetrics { + width: number; + height: number; + titleHeight: number; + portRowHeight: number; + portPositions: Map; +} diff --git a/xircuits-graph-viewer/packages/core/tsconfig.json b/xircuits-graph-viewer/packages/core/tsconfig.json new file mode 100644 index 00000000..792172fb --- /dev/null +++ b/xircuits-graph-viewer/packages/core/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src"] +} diff --git a/xircuits-graph-viewer/packages/react/README.md b/xircuits-graph-viewer/packages/react/README.md new file mode 100644 index 00000000..4d7e045f --- /dev/null +++ b/xircuits-graph-viewer/packages/react/README.md @@ -0,0 +1,144 @@ +# @xpressai/xircuits-viewer-react + +React components for rendering `.xircuits` workflow files. Built on [`@xpressai/xircuits-viewer`](https://www.npmjs.com/package/@xpressai/xircuits-viewer). + +![HelloXircuits rendered](https://raw.githubusercontent.com/XpressAI/xircuits/master/xircuits-graph-viewer/xircuits-hello.png) + +## Install + +```bash +npm install @xpressai/xircuits-viewer @xpressai/xircuits-viewer-react +``` + +## Usage + +### Interactive (with pan/zoom) + +```tsx +import { XircuitsGraph } from '@xpressai/xircuits-viewer-react'; + +// Point it at a .xircuits file — that's it + +``` + +With options: + +```tsx + console.log(node.name)} +/> +``` + +### Static (SSR-safe) + +```tsx +import { XircuitsGraphStatic } from '@xpressai/xircuits-viewer-react'; + + +``` + +### Pre-loaded data + +```tsx +import workflow from './MyWorkflow.xircuits'; + + +``` + +### Live component preview (Python → node) + +Drop-in: a two-line demo with a textarea editor and a live-updating node preview. + +```tsx +import { ComponentPreview } from '@xpressai/xircuits-viewer-react'; + + +``` + +Plug in a real editor (CodeMirror, Monaco, etc.) via the `editor` prop: + +```tsx +import { ComponentPreview } from '@xpressai/xircuits-viewer-react'; +import CodeMirror from '@uiw/react-codemirror'; +import { python } from '@codemirror/lang-python'; + + ( + + )} + theme="dark" +/> +``` + +For full control over layout, skip `` and compose it yourself — `parsePythonComponent` (re-exported here from `@xpressai/xircuits-viewer`) is a pure function, and `` accepts a pre-built graph: + +```tsx +import { XircuitsGraph, parsePythonComponent } from '@xpressai/xircuits-viewer-react'; + +const { graph } = parsePythonComponent(pythonSource); +return graph ? : null; +``` + +The parser itself is documented in the [core package README](../core/README.md#python-component--node) — what it recognises, what it doesn't, and how Python types map to xircuits type names. + +## Props + +### XircuitsGraph + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `src` | `string` | — | URL to a `.xircuits` file | +| `data` | `object` | — | Pre-loaded JSON (takes precedence over `src`) | +| `graph` | `XGraph` | — | Pre-parsed graph (takes precedence over both `data` and `src`) | +| `theme` | `'dark' \| 'light'` | `'dark'` | Color theme | +| `showCanvasBackground` | `boolean` | `true` | Render the Xircuits dot-grid background on the container | +| `interactive` | `boolean` | `true` | Enable pan/zoom | +| `showControls` | `boolean` | same as `interactive` | Show zoom +/−/fit buttons in the corner | +| `fitView` | `boolean` | `true` | Auto-fit the graph on first render | +| `height` | `number \| string` | `400` | Container height | +| `width` | `number \| string` | `'100%'` | Container width | +| `padding` | `number` | `40` | Viewport padding | +| `onNodeClick` | `(node) => void` | — | Node click handler | +| `onEdgeClick` | `(edge) => void` | — | Edge click handler | +| `onError` | `(error) => void` | — | Error handler | + +### XircuitsGraphStatic + +Same props as above, minus `interactive`, `onNodeClick`, `onEdgeClick`. + +### ComponentPreview + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string` | *required* | Python source code | +| `onChange` | `(v: string) => void` | *required* | Called on edit | +| `editor` | `React.ComponentType<{ value, onChange, language }>` | plain `