diff --git a/.github/workflows/bun-build.yml b/.github/workflows/bun-build.yml new file mode 100644 index 00000000..84f09371 --- /dev/null +++ b/.github/workflows/bun-build.yml @@ -0,0 +1,26 @@ +# Created using @tscircuit/plop (npm install -g @tscircuit/plop) +name: Build + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Run build + run: bun run build diff --git a/.github/workflows/bun-formatcheck.yml b/.github/workflows/bun-formatcheck.yml new file mode 100644 index 00000000..be449cf6 --- /dev/null +++ b/.github/workflows/bun-formatcheck.yml @@ -0,0 +1,26 @@ +# Created using @tscircuit/plop (npm install -g @tscircuit/plop) +name: Format Check + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + format-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Run format check + run: bun run format:check diff --git a/.github/workflows/bun-typecheck.yml b/.github/workflows/bun-typecheck.yml new file mode 100644 index 00000000..68acb7de --- /dev/null +++ b/.github/workflows/bun-typecheck.yml @@ -0,0 +1,26 @@ +# Created using @tscircuit/plop (npm install -g @tscircuit/plop) +name: Type Check + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + type-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun i + + - name: Run type check + run: bunx tsc --noEmit diff --git a/.github/workflows/stalebot.yml b/.github/workflows/stalebot.yml new file mode 100644 index 00000000..0b10923b --- /dev/null +++ b/.github/workflows/stalebot.yml @@ -0,0 +1,29 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' # Runs at 1:30 AM UTC every day + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + # Issues config + stale-issue-message: 'This issue has been automatically marked as stale because it has had no recent activity. It will be closed if no further activity occurs.' + close-issue-message: 'This issue was closed because it has been inactive for 14 days since being marked as stale.' + days-before-issue-stale: 60 + days-before-issue-close: 14 + + # Pull request config + stale-pr-message: 'This PR has been automatically marked as stale because it has had no recent activity. It will be closed if no further activity occurs.' + close-pr-message: 'This PR was closed because it has been inactive for 1 day since being marked as stale.' + days-before-pr-stale: 2 + days-before-pr-close: 1 + + # General config + exempt-issue-labels: 'pinned,security,help-wanted' + exempt-pr-labels: 'pinned,security,help-wanted' + stale-issue-label: 'no-issue-activity' + stale-pr-label: 'no-pr-activity' + operations-per-run: 100 diff --git a/.gitignore b/.gitignore index 1ac85dc3..1be86fd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Dependencies /node_modules - +package-lock.json # Production /build diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..81687470 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,41 @@ +# tscircuit docs - Development Guidelines + +- Use `bun` not `node`/`npx`/`npm` + +## Commands + +- **Start development server**: `bun run start` +- **Build site**: `bun run build` +- **Serve built site**: `bun run serve` +- **Type check**: `bun run typecheck` +- **Format code**: `bunx @biomejs/biome format --write .` +- **Lint code**: `bunx @biomejs/biome lint .` + +## Code Style + +- **Formatting**: Use Biome formatter with space indentation +- **Imports**: Use organized imports (auto-sortable by Biome) +- **JSX**: Use double quotes for JSX attributes +- **Semicolons**: Prefer to omit except when necessary +- **Naming**: Use kebab-case for filenames +- **Types**: TypeScript is used throughout, explicit "any" is allowed +- **Error handling**: Follow React/Docusaurus error boundary patterns +- **Markdown**: Follow standard Docusaurus MDX patterns + +## Documentation Standards + +- Keep documentation concise and example-focused +- Include working code examples where possible +- Use proper heading hierarchy (h1 → h2 → h3) +- Images should include descriptive alt text + +## Testing tscircuit TSX Code + +- To test tscircuit TSX code, create a new file in the `codetestingplayground` + directory and add the code you want to test, then run `tsci build .circuit.tsx` +- You may also want to generate snapshots via `tsci snapshot .circuit.tsx` + and inspect the results +- The autorouter and DRC often throws errors and this is expected since the + product is in early stages of development, use `tsci build --ignore-errors` to ignore + non-fatal errors +- Prefer `bunx` over `npx` diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..81687470 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,41 @@ +# tscircuit docs - Development Guidelines + +- Use `bun` not `node`/`npx`/`npm` + +## Commands + +- **Start development server**: `bun run start` +- **Build site**: `bun run build` +- **Serve built site**: `bun run serve` +- **Type check**: `bun run typecheck` +- **Format code**: `bunx @biomejs/biome format --write .` +- **Lint code**: `bunx @biomejs/biome lint .` + +## Code Style + +- **Formatting**: Use Biome formatter with space indentation +- **Imports**: Use organized imports (auto-sortable by Biome) +- **JSX**: Use double quotes for JSX attributes +- **Semicolons**: Prefer to omit except when necessary +- **Naming**: Use kebab-case for filenames +- **Types**: TypeScript is used throughout, explicit "any" is allowed +- **Error handling**: Follow React/Docusaurus error boundary patterns +- **Markdown**: Follow standard Docusaurus MDX patterns + +## Documentation Standards + +- Keep documentation concise and example-focused +- Include working code examples where possible +- Use proper heading hierarchy (h1 → h2 → h3) +- Images should include descriptive alt text + +## Testing tscircuit TSX Code + +- To test tscircuit TSX code, create a new file in the `codetestingplayground` + directory and add the code you want to test, then run `tsci build .circuit.tsx` +- You may also want to generate snapshots via `tsci snapshot .circuit.tsx` + and inspect the results +- The autorouter and DRC often throws errors and this is expected since the + product is in early stages of development, use `tsci build --ignore-errors` to ignore + non-fatal errors +- Prefer `bunx` over `npx` diff --git a/README.md b/README.md index 0c6c2c27..39272cc8 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,3 @@ -# Website +# [docs.tscircuit.com](https://docs.tscircuit.com) -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. +The [tscircuit](https://github.com/tscircuit/tscircuit) docs diff --git a/biome.json b/biome.json index 70a21506..d83952aa 100644 --- a/biome.json +++ b/biome.json @@ -7,8 +7,18 @@ "enabled": true, "indentStyle": "space" }, + "css": { + "parser": { + "cssModules": true + } + }, "files": { - "ignore": ["cosmos-export", "dist", "package.json"] + "ignore": [ + "cosmos-export", + "dist", + "package.json", + "!./codetestingplayground" + ] }, "javascript": { "formatter": { @@ -31,6 +41,9 @@ "complexity": { "noForEach": "info" }, + "correctness": { + "useExhaustiveDependencies": "off" + }, "style": { "noUnusedTemplateLiteral": "off", "noUselessElse": "off", diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..0a4bd604 --- /dev/null +++ b/bun.lock @@ -0,0 +1,3115 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "docs", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/plugin-client-redirects": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@docusaurus/theme-mermaid": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.1.1", + "fs-extra": "^11.2.0", + "lucide-static": "^0.545.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "turndown": "^7.2.1", + }, + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/tsconfig": "3.8.1", + "@docusaurus/types": "3.8.1", + "@tscircuit/create-snippet-url": "^0.0.12", + "@tscircuit/footprinter": "^0.0.135", + "@tscircuit/math-utils": "^0.0.18", + "@twind/core": "^1.1.3", + "@types/fs-extra": "^11.0.4", + "@types/turndown": "^5.0.5", + "globby": "^11.1.0", + "posthog-docusaurus": "^2.0.2", + "repomix": "^0.3.9", + "twind": "^0.16.19", + "typescript": "~5.6.2", + }, + }, + }, + "packages": { + "@algolia/abtesting": ["@algolia/abtesting@1.4.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A=="], + + "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.9", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", "@algolia/autocomplete-shared": "1.17.9" } }, "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ=="], + + "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.9", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ=="], + + "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.9", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ=="], + + "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.9", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ=="], + + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw=="], + + "@algolia/client-analytics": ["@algolia/client-analytics@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ=="], + + "@algolia/client-common": ["@algolia/client-common@5.38.0", "", {}, "sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ=="], + + "@algolia/client-insights": ["@algolia/client-insights@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q=="], + + "@algolia/client-personalization": ["@algolia/client-personalization@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA=="], + + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA=="], + + "@algolia/client-search": ["@algolia/client-search@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw=="], + + "@algolia/events": ["@algolia/events@4.0.1", "", {}, "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="], + + "@algolia/ingestion": ["@algolia/ingestion@1.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ=="], + + "@algolia/monitoring": ["@algolia/monitoring@1.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ=="], + + "@algolia/recommend": ["@algolia/recommend@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ=="], + + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0" } }, "sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg=="], + + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0" } }, "sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ=="], + + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.38.0", "", { "dependencies": { "@algolia/client-common": "5.38.0" } }, "sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw=="], + + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + + "@antfu/utils": ["@antfu/utils@9.2.1", "", {}, "sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.4", "", {}, "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw=="], + + "@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@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" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], + + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], + + "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], + + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], + + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="], + + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="], + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "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" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="], + + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw=="], + + "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.28.3", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.4", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], + + "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], + + "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="], + + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], + + "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="], + + "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], + + "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], + + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + + "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="], + + "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA=="], + + "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.4", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew=="], + + "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="], + + "@babel/plugin-transform-react-constant-elements": ["@babel/plugin-transform-react-constant-elements@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA=="], + + "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], + + "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "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" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], + + "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + + "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="], + + "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], + + "@babel/preset-env": ["@babel/preset-env@7.28.3", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@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.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@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.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@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.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg=="], + + "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "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" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="], + + "@babel/preset-react": ["@babel/preset-react@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.27.1", "@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" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "", { "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.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="], + + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.28.4", "", { "dependencies": { "core-js-pure": "^3.43.0" } }, "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], + + "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], + + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + + "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="], + + "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="], + + "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="], + + "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="], + + "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], + + "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="], + + "@clack/core": ["@clack/core@0.4.2", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg=="], + + "@clack/prompts": ["@clack/prompts@0.10.1", "", { "dependencies": { "@clack/core": "0.4.2", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw=="], + + "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], + + "@csstools/cascade-layer-name-parser": ["@csstools/cascade-layer-name-parser@2.0.5", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A=="], + + "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="], + + "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="], + + "@csstools/css-color-parser": ["@csstools/css-color-parser@3.1.0", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.5", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], + + "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@4.0.3", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ=="], + + "@csstools/postcss-alpha-function": ["@csstools/postcss-alpha-function@1.0.1", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w=="], + + "@csstools/postcss-cascade-layers": ["@csstools/postcss-cascade-layers@5.0.2", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg=="], + + "@csstools/postcss-color-function": ["@csstools/postcss-color-function@4.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA=="], + + "@csstools/postcss-color-function-display-p3-linear": ["@csstools/postcss-color-function-display-p3-linear@1.0.1", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg=="], + + "@csstools/postcss-color-mix-function": ["@csstools/postcss-color-mix-function@3.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag=="], + + "@csstools/postcss-color-mix-variadic-function-arguments": ["@csstools/postcss-color-mix-variadic-function-arguments@1.0.2", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ=="], + + "@csstools/postcss-content-alt-text": ["@csstools/postcss-content-alt-text@2.0.8", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q=="], + + "@csstools/postcss-contrast-color-function": ["@csstools/postcss-contrast-color-function@2.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA=="], + + "@csstools/postcss-exponential-functions": ["@csstools/postcss-exponential-functions@2.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw=="], + + "@csstools/postcss-font-format-keywords": ["@csstools/postcss-font-format-keywords@4.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw=="], + + "@csstools/postcss-gamut-mapping": ["@csstools/postcss-gamut-mapping@2.0.11", "", { "dependencies": { "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw=="], + + "@csstools/postcss-gradients-interpolation-method": ["@csstools/postcss-gradients-interpolation-method@5.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow=="], + + "@csstools/postcss-hwb-function": ["@csstools/postcss-hwb-function@4.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA=="], + + "@csstools/postcss-ic-unit": ["@csstools/postcss-ic-unit@4.0.4", "", { "dependencies": { "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg=="], + + "@csstools/postcss-initial": ["@csstools/postcss-initial@2.0.1", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg=="], + + "@csstools/postcss-is-pseudo-class": ["@csstools/postcss-is-pseudo-class@5.0.3", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ=="], + + "@csstools/postcss-light-dark-function": ["@csstools/postcss-light-dark-function@2.0.11", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA=="], + + "@csstools/postcss-logical-float-and-clear": ["@csstools/postcss-logical-float-and-clear@3.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ=="], + + "@csstools/postcss-logical-overflow": ["@csstools/postcss-logical-overflow@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA=="], + + "@csstools/postcss-logical-overscroll-behavior": ["@csstools/postcss-logical-overscroll-behavior@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w=="], + + "@csstools/postcss-logical-resize": ["@csstools/postcss-logical-resize@3.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg=="], + + "@csstools/postcss-logical-viewport-units": ["@csstools/postcss-logical-viewport-units@3.0.4", "", { "dependencies": { "@csstools/css-tokenizer": "^3.0.4", "@csstools/utilities": "^2.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ=="], + + "@csstools/postcss-media-minmax": ["@csstools/postcss-media-minmax@2.0.9", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig=="], + + "@csstools/postcss-media-queries-aspect-ratio-number-values": ["@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg=="], + + "@csstools/postcss-nested-calc": ["@csstools/postcss-nested-calc@4.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A=="], + + "@csstools/postcss-normalize-display-values": ["@csstools/postcss-normalize-display-values@4.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q=="], + + "@csstools/postcss-oklab-function": ["@csstools/postcss-oklab-function@4.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg=="], + + "@csstools/postcss-progressive-custom-properties": ["@csstools/postcss-progressive-custom-properties@4.2.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw=="], + + "@csstools/postcss-random-function": ["@csstools/postcss-random-function@2.0.1", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w=="], + + "@csstools/postcss-relative-color-syntax": ["@csstools/postcss-relative-color-syntax@3.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw=="], + + "@csstools/postcss-scope-pseudo-class": ["@csstools/postcss-scope-pseudo-class@4.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q=="], + + "@csstools/postcss-sign-functions": ["@csstools/postcss-sign-functions@1.1.4", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg=="], + + "@csstools/postcss-stepped-value-functions": ["@csstools/postcss-stepped-value-functions@4.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA=="], + + "@csstools/postcss-text-decoration-shorthand": ["@csstools/postcss-text-decoration-shorthand@4.0.3", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA=="], + + "@csstools/postcss-trigonometric-functions": ["@csstools/postcss-trigonometric-functions@4.0.9", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A=="], + + "@csstools/postcss-unset-value": ["@csstools/postcss-unset-value@4.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA=="], + + "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@3.1.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g=="], + + "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + + "@csstools/utilities": ["@csstools/utilities@2.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ=="], + + "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], + + "@docsearch/css": ["@docsearch/css@3.9.0", "", {}, "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA=="], + + "@docsearch/react": ["@docsearch/react@3.9.0", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.9", "@algolia/autocomplete-preset-algolia": "1.17.9", "@docsearch/css": "3.9.0", "algoliasearch": "^5.14.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" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ=="], + + "@docusaurus/babel": ["@docusaurus/babel@3.8.1", "", { "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.8.1", "@docusaurus/utils": "3.8.1", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw=="], + + "@docusaurus/bundler": ["@docusaurus/bundler@3.8.1", "", { "dependencies": { "@babel/core": "^7.25.9", "@docusaurus/babel": "3.8.1", "@docusaurus/cssnano-preset": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "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" }, "peerDependencies": { "@docusaurus/faster": "*" }, "optionalPeers": ["@docusaurus/faster"] }, "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA=="], + + "@docusaurus/core": ["@docusaurus/core@3.8.1", "", { "dependencies": { "@docusaurus/babel": "3.8.1", "@docusaurus/bundler": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "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": "^4.15.2", "webpack-merge": "^6.0.1" }, "peerDependencies": { "@mdx-js/react": "^3.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "bin": { "docusaurus": "bin/docusaurus.mjs" } }, "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA=="], + + "@docusaurus/cssnano-preset": ["@docusaurus/cssnano-preset@3.8.1", "", { "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.5.4", "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" } }, "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug=="], + + "@docusaurus/logger": ["@docusaurus/logger@3.8.1", "", { "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" } }, "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww=="], + + "@docusaurus/mdx-loader": ["@docusaurus/mdx-loader@3.8.1", "", { "dependencies": { "@docusaurus/logger": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "@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" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w=="], + + "@docusaurus/module-type-aliases": ["@docusaurus/module-type-aliases@3.8.1", "", { "dependencies": { "@docusaurus/types": "3.8.1", "@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": "*" } }, "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg=="], + + "@docusaurus/plugin-client-redirects": ["@docusaurus/plugin-client-redirects@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-F+86R7PBn6VNgy/Ux8w3ZRypJGJEzksbejQKlbTC8u6uhBUhfdXWkDp6qdOisIoW0buY5nLqucvZt1zNJzhJhA=="], + + "@docusaurus/plugin-content-blog": ["@docusaurus/plugin-content-blog@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "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" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw=="], + + "@docusaurus/plugin-content-docs": ["@docusaurus/plugin-content-docs@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/module-type-aliases": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "@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" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA=="], + + "@docusaurus/plugin-content-pages": ["@docusaurus/plugin-content-pages@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w=="], + + "@docusaurus/plugin-css-cascade-layers": ["@docusaurus/plugin-css-cascade-layers@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" } }, "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw=="], + + "@docusaurus/plugin-debug": ["@docusaurus/plugin-debug@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw=="], + + "@docusaurus/plugin-google-analytics": ["@docusaurus/plugin-google-analytics@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q=="], + + "@docusaurus/plugin-google-gtag": ["@docusaurus/plugin-google-gtag@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg=="], + + "@docusaurus/plugin-google-tag-manager": ["@docusaurus/plugin-google-tag-manager@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw=="], + + "@docusaurus/plugin-sitemap": ["@docusaurus/plugin-sitemap@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw=="], + + "@docusaurus/plugin-svgr": ["@docusaurus/plugin-svgr@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw=="], + + "@docusaurus/preset-classic": ["@docusaurus/preset-classic@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/plugin-content-blog": "3.8.1", "@docusaurus/plugin-content-docs": "3.8.1", "@docusaurus/plugin-content-pages": "3.8.1", "@docusaurus/plugin-css-cascade-layers": "3.8.1", "@docusaurus/plugin-debug": "3.8.1", "@docusaurus/plugin-google-analytics": "3.8.1", "@docusaurus/plugin-google-gtag": "3.8.1", "@docusaurus/plugin-google-tag-manager": "3.8.1", "@docusaurus/plugin-sitemap": "3.8.1", "@docusaurus/plugin-svgr": "3.8.1", "@docusaurus/theme-classic": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/theme-search-algolia": "3.8.1", "@docusaurus/types": "3.8.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ=="], + + "@docusaurus/theme-classic": ["@docusaurus/theme-classic@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/module-type-aliases": "3.8.1", "@docusaurus/plugin-content-blog": "3.8.1", "@docusaurus/plugin-content-docs": "3.8.1", "@docusaurus/plugin-content-pages": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/theme-translations": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.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" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw=="], + + "@docusaurus/theme-common": ["@docusaurus/theme-common@3.8.1", "", { "dependencies": { "@docusaurus/mdx-loader": "3.8.1", "@docusaurus/module-type-aliases": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "@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" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw=="], + + "@docusaurus/theme-mermaid": ["@docusaurus/theme-mermaid@3.8.1", "", { "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/module-type-aliases": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg=="], + + "@docusaurus/theme-search-algolia": ["@docusaurus/theme-search-algolia@3.8.1", "", { "dependencies": { "@docsearch/react": "^3.9.0", "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", "@docusaurus/plugin-content-docs": "3.8.1", "@docusaurus/theme-common": "3.8.1", "@docusaurus/theme-translations": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-validation": "3.8.1", "algoliasearch": "^5.17.1", "algoliasearch-helper": "^3.22.6", "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" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ=="], + + "@docusaurus/theme-translations": ["@docusaurus/theme-translations@3.8.1", "", { "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g=="], + + "@docusaurus/tsconfig": ["@docusaurus/tsconfig@3.8.1", "", {}, "sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A=="], + + "@docusaurus/types": ["@docusaurus/types@3.8.1", "", { "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@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" } }, "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg=="], + + "@docusaurus/utils": ["@docusaurus/utils@3.8.1", "", { "dependencies": { "@docusaurus/logger": "3.8.1", "@docusaurus/types": "3.8.1", "@docusaurus/utils-common": "3.8.1", "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" } }, "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ=="], + + "@docusaurus/utils-common": ["@docusaurus/utils-common@3.8.1", "", { "dependencies": { "@docusaurus/types": "3.8.1", "tslib": "^2.6.0" } }, "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg=="], + + "@docusaurus/utils-validation": ["@docusaurus/utils-validation@3.8.1", "", { "dependencies": { "@docusaurus/logger": "3.8.1", "@docusaurus/utils": "3.8.1", "@docusaurus/utils-common": "3.8.1", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "tslib": "^2.6.0" } }, "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA=="], + + "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], + + "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@3.0.2", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", "debug": "^4.4.1", "globals": "^15.15.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ=="], + + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "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" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "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" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + + "@mermaid-js/parser": ["@mermaid-js/parser@0.6.2", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ=="], + + "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.18.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-beedclIvFcCnPrYgHsylqiYJVJ/CI47Vyc4tY8no1/Li/O8U4BTlJfy6ZwxkYwx+Mx10nrgwSVrA7VBbhh4slg=="], + + "@napi-rs/nice": ["@napi-rs/nice@1.1.1", "", { "optionalDependencies": { "@napi-rs/nice-android-arm-eabi": "1.1.1", "@napi-rs/nice-android-arm64": "1.1.1", "@napi-rs/nice-darwin-arm64": "1.1.1", "@napi-rs/nice-darwin-x64": "1.1.1", "@napi-rs/nice-freebsd-x64": "1.1.1", "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", "@napi-rs/nice-linux-arm64-gnu": "1.1.1", "@napi-rs/nice-linux-arm64-musl": "1.1.1", "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", "@napi-rs/nice-linux-s390x-gnu": "1.1.1", "@napi-rs/nice-linux-x64-gnu": "1.1.1", "@napi-rs/nice-linux-x64-musl": "1.1.1", "@napi-rs/nice-openharmony-arm64": "1.1.1", "@napi-rs/nice-win32-arm64-msvc": "1.1.1", "@napi-rs/nice-win32-ia32-msvc": "1.1.1", "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw=="], + + "@napi-rs/nice-android-arm-eabi": ["@napi-rs/nice-android-arm-eabi@1.1.1", "", { "os": "android", "cpu": "arm" }, "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw=="], + + "@napi-rs/nice-android-arm64": ["@napi-rs/nice-android-arm64@1.1.1", "", { "os": "android", "cpu": "arm64" }, "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw=="], + + "@napi-rs/nice-darwin-arm64": ["@napi-rs/nice-darwin-arm64@1.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A=="], + + "@napi-rs/nice-darwin-x64": ["@napi-rs/nice-darwin-x64@1.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ=="], + + "@napi-rs/nice-freebsd-x64": ["@napi-rs/nice-freebsd-x64@1.1.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ=="], + + "@napi-rs/nice-linux-arm-gnueabihf": ["@napi-rs/nice-linux-arm-gnueabihf@1.1.1", "", { "os": "linux", "cpu": "arm" }, "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg=="], + + "@napi-rs/nice-linux-arm64-gnu": ["@napi-rs/nice-linux-arm64-gnu@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ=="], + + "@napi-rs/nice-linux-arm64-musl": ["@napi-rs/nice-linux-arm64-musl@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg=="], + + "@napi-rs/nice-linux-ppc64-gnu": ["@napi-rs/nice-linux-ppc64-gnu@1.1.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg=="], + + "@napi-rs/nice-linux-riscv64-gnu": ["@napi-rs/nice-linux-riscv64-gnu@1.1.1", "", { "os": "linux", "cpu": "none" }, "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw=="], + + "@napi-rs/nice-linux-s390x-gnu": ["@napi-rs/nice-linux-s390x-gnu@1.1.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ=="], + + "@napi-rs/nice-linux-x64-gnu": ["@napi-rs/nice-linux-x64-gnu@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg=="], + + "@napi-rs/nice-linux-x64-musl": ["@napi-rs/nice-linux-x64-musl@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw=="], + + "@napi-rs/nice-openharmony-arm64": ["@napi-rs/nice-openharmony-arm64@1.1.1", "", { "os": "none", "cpu": "arm64" }, "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ=="], + + "@napi-rs/nice-win32-arm64-msvc": ["@napi-rs/nice-win32-arm64-msvc@1.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA=="], + + "@napi-rs/nice-win32-ia32-msvc": ["@napi-rs/nice-win32-ia32-msvc@1.1.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug=="], + + "@napi-rs/nice-win32-x64-msvc": ["@napi-rs/nice-win32-x64-msvc@1.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], + + "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], + + "@pnpm/npm-conf": ["@pnpm/npm-conf@2.3.1", "", { "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@secretlint/core": ["@secretlint/core@9.3.4", "", { "dependencies": { "@secretlint/profiler": "^9.3.4", "@secretlint/types": "^9.3.4", "debug": "^4.4.1", "structured-source": "^4.0.0" } }, "sha512-ErIVHI6CJd191qdNKuMkH3bZQo9mWJsrSg++bQx64o0WFuG5nPvkYrDK0p/lebf+iQuOnzvl5HrZU6GU9a6o+Q=="], + + "@secretlint/profiler": ["@secretlint/profiler@9.3.4", "", {}, "sha512-99WmaHd4dClNIm5BFsG++E6frNIZ3qVwg6s804Ql/M19pDmtZOoVCl4/UuzWpwNniBqLIgn9rHQZ/iGlIW3wyw=="], + + "@secretlint/secretlint-rule-preset-recommend": ["@secretlint/secretlint-rule-preset-recommend@9.3.4", "", {}, "sha512-RvzrLNN2A0B2bYQgRSRjh2dkdaIDuhXjj4SO5bElK1iBtJNiD6VBTxSSY1P3hXYaBeva7MEF+q1PZ3cCL8XYOA=="], + + "@secretlint/types": ["@secretlint/types@9.3.4", "", {}, "sha512-z9rdKHNeL4xa48+367RQJVw1d7/Js9HIQ+gTs/angzteM9osfgs59ad3iwVRhCGYbeUoUUDe2yxJG2ylYLaH3Q=="], + + "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], + + "@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="], + + "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], + + "@slorber/remark-comment": ["@slorber/remark-comment@1.0.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.1.0", "micromark-util-symbol": "^1.0.1" } }, "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA=="], + + "@svgr/babel-plugin-add-jsx-attribute": ["@svgr/babel-plugin-add-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g=="], + + "@svgr/babel-plugin-remove-jsx-attribute": ["@svgr/babel-plugin-remove-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="], + + "@svgr/babel-plugin-remove-jsx-empty-expression": ["@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="], + + "@svgr/babel-plugin-replace-jsx-attribute-value": ["@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ=="], + + "@svgr/babel-plugin-svg-dynamic-title": ["@svgr/babel-plugin-svg-dynamic-title@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og=="], + + "@svgr/babel-plugin-svg-em-dimensions": ["@svgr/babel-plugin-svg-em-dimensions@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g=="], + + "@svgr/babel-plugin-transform-react-native-svg": ["@svgr/babel-plugin-transform-react-native-svg@8.1.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q=="], + + "@svgr/babel-plugin-transform-svg-component": ["@svgr/babel-plugin-transform-svg-component@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw=="], + + "@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "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" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], + + "@svgr/core": ["@svgr/core@8.1.0", "", { "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" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="], + + "@svgr/hast-util-to-babel-ast": ["@svgr/hast-util-to-babel-ast@8.0.0", "", { "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" } }, "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q=="], + + "@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "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" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="], + + "@svgr/plugin-svgo": ["@svgr/plugin-svgo@8.1.0", "", { "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", "svgo": "^3.0.2" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA=="], + + "@svgr/webpack": ["@svgr/webpack@8.1.0", "", { "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" } }, "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], + + "@tscircuit/create-snippet-url": ["@tscircuit/create-snippet-url@0.0.12", "", { "dependencies": { "fflate": "^0.8.2" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-dOBs/rv53Gz2y6swurLKbF25kUmz9KPzDAndjBh+lmmWSs6QRs63OubIk7HYBagsdgwKvOhHDceSl4ByTmTAZQ=="], + + "@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.135", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-+8MasMGTNQL/NINnlWk2v6zw/NDerfdIBG3uqhrTr0r7VOHh4lK1ymTkQR7IeoypkxTIHYGB9wHbOt39XAF3mg=="], + + "@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.18", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-P45v7V/BiVZZjXTUzjWSUsy0M8GpI5o6d+JWhPWE5+JwI/sYZARuLT4e1xzV7LaavEX4GQ0NKG9hKN48xTZJsw=="], + + "@tscircuit/mm": ["@tscircuit/mm@0.0.8", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-nl7nxE7AhARbKuobflI0LUzoir7+wJyvwfPw6bzA/O0Q3YTcH3vBkU/Of+V/fp6ht+AofiCXj7YAH9E446138Q=="], + + "@twind/core": ["@twind/core@1.1.3", "", { "dependencies": { "csstype": "^3.1.1" }, "peerDependencies": { "typescript": "^4.8.4" }, "optionalPeers": ["typescript"] }, "sha512-/B/aNFerMb2IeyjSJy3SJxqVxhrT77gBDknLMiZqXIRr4vNJqiuhx7KqUSRzDCwUmyGuogkamz+aOLzN6MeSLw=="], + + "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], + + "@types/bonjour": ["@types/bonjour@3.5.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/connect-history-api-fallback": ["@types/connect-history-api-fallback@1.5.4", "", { "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw=="], + + "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + + "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + + "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + + "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + + "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="], + + "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + + "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + + "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + + "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + + "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + + "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + + "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + + "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + + "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + + "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], + + "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/express": ["@types/express@4.17.23", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], + + "@types/fs-extra": ["@types/fs-extra@11.0.4", "", { "dependencies": { "@types/jsonfile": "*", "@types/node": "*" } }, "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/gtag.js": ["@types/gtag.js@0.0.12", "", {}, "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/history": ["@types/history@4.7.11", "", {}, "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="], + + "@types/html-minifier-terser": ["@types/html-minifier-terser@6.1.0", "", {}, "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], + + "@types/http-proxy": ["@types/http-proxy@1.17.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/jsonfile": ["@types/jsonfile@6.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], + + "@types/node-forge": ["@types/node-forge@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw=="], + + "@types/parse-path": ["@types/parse-path@7.1.0", "", { "dependencies": { "parse-path": "*" } }, "sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q=="], + + "@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="], + + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/react": ["@types/react@19.1.13", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ=="], + + "@types/react-router": ["@types/react-router@5.1.20", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" } }, "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q=="], + + "@types/react-router-config": ["@types/react-router-config@5.0.11", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "^5.1.0" } }, "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw=="], + + "@types/react-router-dom": ["@types/react-router-dom@5.3.3", "", { "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw=="], + + "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], + + "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], + + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], + + "@types/serve-index": ["@types/serve-index@1.9.4", "", { "dependencies": { "@types/express": "*" } }, "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug=="], + + "@types/serve-static": ["@types/serve-static@1.15.8", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg=="], + + "@types/sockjs": ["@types/sockjs@0.3.36", "", { "dependencies": { "@types/node": "*" } }, "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/turndown": ["@types/turndown@5.0.5", "", {}, "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + + "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], + + "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], + + "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], + + "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], + + "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], + + "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "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" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], + + "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], + + "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], + + "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], + + "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "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" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], + + "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "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" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], + + "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], + + "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "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" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], + + "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], + + "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], + + "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + + "address": ["address@1.2.2", "", {}, "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "algoliasearch": ["algoliasearch@5.38.0", "", { "dependencies": { "@algolia/abtesting": "1.4.0", "@algolia/client-abtesting": "5.38.0", "@algolia/client-analytics": "5.38.0", "@algolia/client-common": "5.38.0", "@algolia/client-insights": "5.38.0", "@algolia/client-personalization": "5.38.0", "@algolia/client-query-suggestions": "5.38.0", "@algolia/client-search": "5.38.0", "@algolia/ingestion": "1.38.0", "@algolia/monitoring": "1.38.0", "@algolia/recommend": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", "@algolia/requester-fetch": "5.38.0", "@algolia/requester-node-http": "5.38.0" } }, "sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g=="], + + "algoliasearch-helper": ["algoliasearch-helper@3.26.0", "", { "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6" } }, "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-escapes": ["ansi-escapes@7.1.1", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q=="], + + "ansi-html-community": ["ansi-html-community@0.0.8", "", { "bin": { "ansi-html": "bin/ansi-html" } }, "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + + "babel-loader": ["babel-loader@9.2.1", "", { "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", "webpack": ">=5" } }, "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA=="], + + "babel-plugin-dynamic-import-node": ["babel-plugin-dynamic-import-node@2.3.3", "", { "dependencies": { "object.assign": "^4.1.0" } }, "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "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" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.7", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ=="], + + "batch": ["batch@0.6.1", "", {}, "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="], + + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "binaryextensions": ["binaryextensions@6.11.0", "", { "dependencies": { "editions": "^6.21.0" } }, "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw=="], + + "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + + "bonjour-service": ["bonjour-service@1.3.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "boundary": ["boundary@2.0.0", "", {}, "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA=="], + + "boxen": ["boxen@6.2.1", "", { "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" } }, "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.26.2", "", { "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", "electron-to-chromium": "^1.5.218", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], + + "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], + + "cacheable-request": ["cacheable-request@10.2.14", "", { "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" } }, "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "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" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001745", "", {}, "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "cheerio": ["cheerio@1.0.0-rc.12", "", { "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" } }, "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "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" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + + "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], + + "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="], + + "chokidar": ["chokidar@3.6.0", "", { "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" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "circuit-json": ["circuit-json@0.0.265", "", {}, "sha512-Am9GkXh+81892/WMoiM29mmoX2z67OxtIxCTuhziqyXYHemxSSvp3tep+DBGlEl7wXzPyylZFqX28eFsp2cY+g=="], + + "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], + + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], + + "clipboardy": ["clipboardy@4.0.0", "", { "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", "is64bit": "^2.0.0" } }, "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w=="], + + "clone-deep": ["clone-deep@4.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" } }, "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "combine-promises": ["combine-promises@1.2.0", "", {}, "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + + "common-path-prefix": ["common-path-prefix@3.0.0", "", {}, "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], + + "compression": ["compression@1.8.1", "", { "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" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], + + "configstore": ["configstore@6.0.0", "", { "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" } }, "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA=="], + + "connect-history-api-fallback": ["connect-history-api-fallback@2.0.0", "", {}, "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "content-disposition": ["content-disposition@0.5.2", "", {}, "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "copy-text-to-clipboard": ["copy-text-to-clipboard@3.2.2", "", {}, "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A=="], + + "copy-webpack-plugin": ["copy-webpack-plugin@11.0.0", "", { "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" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ=="], + + "core-js": ["core-js@3.45.1", "", {}, "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg=="], + + "core-js-compat": ["core-js-compat@3.45.1", "", { "dependencies": { "browserslist": "^4.25.3" } }, "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA=="], + + "core-js-pure": ["core-js-pure@3.45.1", "", {}, "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + + "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-random-string": ["crypto-random-string@4.0.0", "", { "dependencies": { "type-fest": "^1.0.1" } }, "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA=="], + + "css-blank-pseudo": ["css-blank-pseudo@7.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag=="], + + "css-declaration-sorter": ["css-declaration-sorter@7.3.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ=="], + + "css-has-pseudo": ["css-has-pseudo@7.0.3", "", { "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA=="], + + "css-loader": ["css-loader@6.11.0", "", { "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" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g=="], + + "css-minimizer-webpack-plugin": ["css-minimizer-webpack-plugin@5.0.1", "", { "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" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg=="], + + "css-prefers-color-scheme": ["css-prefers-color-scheme@10.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ=="], + + "css-select": ["css-select@4.3.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssdb": ["cssdb@8.4.2", "", {}, "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cssnano": ["cssnano@6.1.2", "", { "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA=="], + + "cssnano-preset-advanced": ["cssnano-preset-advanced@6.1.2", "", { "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" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ=="], + + "cssnano-preset-default": ["cssnano-preset-default@6.1.2", "", { "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" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg=="], + + "cssnano-utils": ["cssnano-utils@4.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], + + "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], + + "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="], + + "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="], + + "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="], + + "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="], + + "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], + + "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + + "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + + "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="], + + "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="], + + "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], + + "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], + + "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="], + + "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="], + + "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="], + + "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], + + "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + + "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + + "dagre-d3-es": ["dagre-d3-es@7.0.11", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw=="], + + "dayjs": ["dayjs@1.11.18", "", {}, "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA=="], + + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "default-gateway": ["default-gateway@6.0.3", "", { "dependencies": { "execa": "^5.0.0" } }, "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "detect-port": ["detect-port@1.6.1", "", { "dependencies": { "address": "^1.0.1", "debug": "4" }, "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" } }, "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dns-packet": ["dns-packet@5.6.1", "", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="], + + "dom-converter": ["dom-converter@0.2.0", "", { "dependencies": { "utila": "~0.4" } }, "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="], + + "dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "dompurify": ["dompurify@3.2.7", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw=="], + + "domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "editions": ["editions@6.22.0", "", { "dependencies": { "version-range": "^4.15.0" } }, "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.224", "", {}, "sha512-kWAoUu/bwzvnhpdZSIc6KUyvkI1rbRXMT0Eq8pKReyOyaPZcctMli+EgvcN1PAvwVc7Tdo4Fxi2PsLNDU05mdg=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "emojilib": ["emojilib@2.4.0", "", {}, "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="], + + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + + "emoticon": ["emoticon@4.1.0", "", {}, "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], + + "entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "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" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.4.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eta": ["eta@2.2.0", "", {}, "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eval": ["eval@0.1.8", "", { "dependencies": { "@types/node": "*", "require-like": ">= 0.1.1" } }, "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + + "execa": ["execa@5.1.1", "", { "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" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + + "express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], + + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + + "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], + + "feed": ["feed@4.2.2", "", { "dependencies": { "xml-js": "^1.6.11" } }, "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + + "file-loader": ["file-loader@6.2.0", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + + "find-cache-dir": ["find-cache-dir@4.0.0", "", { "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" } }, "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg=="], + + "find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], + + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], + + "fs-monkey": ["fs-monkey@1.1.0", "", {}, "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-own-enumerable-property-symbols": ["get-own-enumerable-property-symbols@3.0.2", "", {}, "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "git-up": ["git-up@8.1.1", "", { "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^9.2.0" } }, "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g=="], + + "git-url-parse": ["git-url-parse@16.1.0", "", { "dependencies": { "git-up": "^8.1.0" } }, "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw=="], + + "github-slugger": ["github-slugger@1.5.0", "", {}, "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globby": ["globby@11.1.0", "", { "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" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "got": ["got@12.6.1", "", { "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" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], + + "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + + "handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="], + + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-yarn": ["has-yarn@3.0.0", "", {}, "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "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" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "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" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "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" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "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" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "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" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "history": ["history@4.10.1", "", { "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" } }, "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "hpack.js": ["hpack.js@2.1.6", "", { "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" } }, "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ=="], + + "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "html-minifier-terser": ["html-minifier-terser@7.2.0", "", { "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" } }, "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA=="], + + "html-tags": ["html-tags@3.3.1", "", {}, "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "html-webpack-plugin": ["html-webpack-plugin@5.6.4", "", { "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" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw=="], + + "htmlparser2": ["htmlparser2@6.1.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-deceiver": ["http-deceiver@1.2.7", "", {}, "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-parser-js": ["http-parser-js@0.5.10", "", {}, "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA=="], + + "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], + + "http-proxy-middleware": ["http-proxy-middleware@2.0.9", "", { "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" }, "peerDependencies": { "@types/express": "^4.17.13" }, "optionalPeers": ["@types/express"] }, "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q=="], + + "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-lazy": ["import-lazy@4.0.0", "", {}, "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "infima": ["infima@0.2.0-alpha.45", "", {}, "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], + + "is-npm": ["is-npm@6.1.0", "", {}, "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-obj": ["is-obj@1.0.1", "", {}, "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-regexp": ["is-regexp@1.0.0", "", {}, "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="], + + "is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "is-yarn-global": ["is-yarn-global@0.4.1", "", {}, "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ=="], + + "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], + + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "istextorbinary": ["istextorbinary@9.5.0", "", { "dependencies": { "binaryextensions": "^6.11.0", "editions": "^6.21.0", "textextensions": "^6.11.0" } }, "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw=="], + + "jest-util": ["jest-util@29.7.0", "", { "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" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "joi": ["joi@17.13.3", "", { "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" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jschardet": ["jschardet@3.1.4", "", {}, "sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "katex": ["katex@0.16.22", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], + + "latest-version": ["latest-version@7.0.0", "", { "dependencies": { "package-json": "^8.1.0" } }, "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg=="], + + "launch-editor": ["launch-editor@2.11.1", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg=="], + + "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="], + + "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], + + "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], + + "locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], + + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-static": ["lucide-static@0.545.0", "", {}, "sha512-2i81WNw3y+sN17gG75DKZbd43pGJREyoAQRK5IG8djCWhISoK6Ri1ovbKwOjFR+St2LHTQhu+EJygmUIWMotew=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@2.0.0", "", { "dependencies": { "repeat-string": "^1.0.0" } }, "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A=="], + + "marked": ["marked@16.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-directive": ["mdast-util-directive@3.1.0", "", { "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" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "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" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "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" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "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" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "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" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "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" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "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" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "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" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "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" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "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" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "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" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "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" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "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" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "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" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "memfs": ["memfs@3.6.0", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "mermaid": ["mermaid@11.12.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.2", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromark": ["micromark@4.0.2", "", { "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" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "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" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-directive": ["micromark-extension-directive@3.0.2", "", { "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" } }, "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA=="], + + "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "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" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "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" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "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" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "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" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "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" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "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" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "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" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "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" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "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" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "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" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "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" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "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" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "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" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@1.2.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "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" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "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" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@1.1.0", "", {}, "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], + + "mini-css-extract-plugin": ["mini-css-extract-plugin@2.9.4", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimatch": ["minimatch@10.0.3", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multicast-dns": ["multicast-dns@7.2.5", "", { "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-emoji": ["node-emoji@2.2.0", "", { "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" } }, "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-releases": ["node-releases@2.0.21", "", {}, "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "normalize-url": ["normalize-url@8.1.0", "", {}, "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "nprogress": ["nprogress@0.2.0", "", {}, "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "null-loader": ["null-loader@4.0.1", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "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" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "opener": ["opener@1.5.2", "", { "bin": { "opener": "bin/opener-bin.js" } }, "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="], + + "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + + "p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], + + "p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], + + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="], + + "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], + + "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "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" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-json": ["parse-json@5.2.0", "", { "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" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-numeric-range": ["parse-numeric-range@1.3.0", "", {}, "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="], + + "parse-path": ["parse-path@7.1.0", "", { "dependencies": { "protocols": "^2.0.0" } }, "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw=="], + + "parse-url": ["parse-url@9.2.0", "", { "dependencies": { "@types/parse-path": "^7.0.0", "parse-path": "^7.0.0" } }, "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + + "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + + "path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "piscina": ["piscina@4.9.2", "", { "optionalDependencies": { "@napi-rs/nice": "^1.0.1" } }, "sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ=="], + + "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="], + + "pkg-dir": ["pkg-dir@7.0.0", "", { "dependencies": { "find-up": "^6.3.0" } }, "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA=="], + + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], + + "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-attribute-case-insensitive": ["postcss-attribute-case-insensitive@7.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw=="], + + "postcss-calc": ["postcss-calc@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ=="], + + "postcss-clamp": ["postcss-clamp@4.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.6" } }, "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow=="], + + "postcss-color-functional-notation": ["postcss-color-functional-notation@7.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw=="], + + "postcss-color-hex-alpha": ["postcss-color-hex-alpha@10.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w=="], + + "postcss-color-rebeccapurple": ["postcss-color-rebeccapurple@10.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ=="], + + "postcss-colormin": ["postcss-colormin@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw=="], + + "postcss-convert-values": ["postcss-convert-values@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w=="], + + "postcss-custom-media": ["postcss-custom-media@11.0.6", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw=="], + + "postcss-custom-properties": ["postcss-custom-properties@14.0.6", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ=="], + + "postcss-custom-selectors": ["postcss-custom-selectors@8.0.5", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg=="], + + "postcss-dir-pseudo-class": ["postcss-dir-pseudo-class@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA=="], + + "postcss-discard-comments": ["postcss-discard-comments@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw=="], + + "postcss-discard-duplicates": ["postcss-discard-duplicates@6.0.3", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw=="], + + "postcss-discard-empty": ["postcss-discard-empty@6.0.3", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ=="], + + "postcss-discard-overridden": ["postcss-discard-overridden@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ=="], + + "postcss-discard-unused": ["postcss-discard-unused@6.0.5", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA=="], + + "postcss-double-position-gradients": ["postcss-double-position-gradients@6.0.4", "", { "dependencies": { "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g=="], + + "postcss-focus-visible": ["postcss-focus-visible@10.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA=="], + + "postcss-focus-within": ["postcss-focus-within@9.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw=="], + + "postcss-font-variant": ["postcss-font-variant@5.0.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA=="], + + "postcss-gap-properties": ["postcss-gap-properties@6.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw=="], + + "postcss-image-set-function": ["postcss-image-set-function@7.0.0", "", { "dependencies": { "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA=="], + + "postcss-lab-function": ["postcss-lab-function@7.0.12", "", { "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w=="], + + "postcss-loader": ["postcss-loader@7.3.4", "", { "dependencies": { "cosmiconfig": "^8.3.5", "jiti": "^1.20.0", "semver": "^7.5.4" }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" } }, "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A=="], + + "postcss-logical": ["postcss-logical@8.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA=="], + + "postcss-merge-idents": ["postcss-merge-idents@6.0.3", "", { "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g=="], + + "postcss-merge-longhand": ["postcss-merge-longhand@6.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w=="], + + "postcss-merge-rules": ["postcss-merge-rules@6.1.1", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "cssnano-utils": "^4.0.2", "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ=="], + + "postcss-minify-font-values": ["postcss-minify-font-values@6.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg=="], + + "postcss-minify-gradients": ["postcss-minify-gradients@6.0.3", "", { "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q=="], + + "postcss-minify-params": ["postcss-minify-params@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA=="], + + "postcss-minify-selectors": ["postcss-minify-selectors@6.0.4", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ=="], + + "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="], + + "postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="], + + "postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="], + + "postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="], + + "postcss-nesting": ["postcss-nesting@13.0.2", "", { "dependencies": { "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ=="], + + "postcss-normalize-charset": ["postcss-normalize-charset@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ=="], + + "postcss-normalize-display-values": ["postcss-normalize-display-values@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg=="], + + "postcss-normalize-positions": ["postcss-normalize-positions@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q=="], + + "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ=="], + + "postcss-normalize-string": ["postcss-normalize-string@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ=="], + + "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA=="], + + "postcss-normalize-unicode": ["postcss-normalize-unicode@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg=="], + + "postcss-normalize-url": ["postcss-normalize-url@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ=="], + + "postcss-normalize-whitespace": ["postcss-normalize-whitespace@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q=="], + + "postcss-opacity-percentage": ["postcss-opacity-percentage@3.0.0", "", { "peerDependencies": { "postcss": "^8.4" } }, "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ=="], + + "postcss-ordered-values": ["postcss-ordered-values@6.0.2", "", { "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q=="], + + "postcss-overflow-shorthand": ["postcss-overflow-shorthand@6.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q=="], + + "postcss-page-break": ["postcss-page-break@3.0.4", "", { "peerDependencies": { "postcss": "^8" } }, "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ=="], + + "postcss-place": ["postcss-place@10.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw=="], + + "postcss-preset-env": ["postcss-preset-env@10.4.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.0", "@csstools/postcss-oklab-function": "^4.0.12", "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@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-text-decoration-shorthand": "^4.0.3", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.21", "browserslist": "^4.26.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", "cssdb": "^8.4.2", "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" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw=="], + + "postcss-pseudo-class-any-link": ["postcss-pseudo-class-any-link@10.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q=="], + + "postcss-reduce-idents": ["postcss-reduce-idents@6.0.3", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA=="], + + "postcss-reduce-initial": ["postcss-reduce-initial@6.1.0", "", { "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw=="], + + "postcss-reduce-transforms": ["postcss-reduce-transforms@6.0.2", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA=="], + + "postcss-replace-overflow-wrap": ["postcss-replace-overflow-wrap@4.0.0", "", { "peerDependencies": { "postcss": "^8.0.3" } }, "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw=="], + + "postcss-selector-not": ["postcss-selector-not@8.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + + "postcss-sort-media-queries": ["postcss-sort-media-queries@5.2.0", "", { "dependencies": { "sort-css-media-queries": "2.2.0" }, "peerDependencies": { "postcss": "^8.4.23" } }, "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA=="], + + "postcss-svgo": ["postcss-svgo@6.0.3", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g=="], + + "postcss-unique-selectors": ["postcss-unique-selectors@6.0.4", "", { "dependencies": { "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "postcss-zindex": ["postcss-zindex@6.0.2", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg=="], + + "posthog-docusaurus": ["posthog-docusaurus@2.0.4", "", {}, "sha512-xnEVCBovSuvQvYXGny03CDTc0yZCl7O3Mz21sJpXmE1Gvs21gM33WzWaA9Cm6WvWGYZtQy8t8/g8OjCkmTWlXA=="], + + "pretty-error": ["pretty-error@4.0.0", "", { "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="], + + "pretty-time": ["pretty-time@1.1.0", "", {}, "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA=="], + + "prism-react-renderer": ["prism-react-renderer@2.4.1", "", { "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], + + "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pupa": ["pupa@3.3.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "range-parser": ["range-parser@1.2.0", "", {}, "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="], + + "raw-body": ["raw-body@3.0.1", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.7.0", "unpipe": "1.0.0" } }, "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + + "react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], + + "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], + + "react-helmet-async": ["@slorber/react-helmet-async@1.3.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" } }, "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-json-view-lite": ["react-json-view-lite@2.5.0", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g=="], + + "react-loadable": ["@docusaurus/react-loadable@6.0.0", "", { "dependencies": { "@types/react": "*" }, "peerDependencies": { "react": "*" } }, "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ=="], + + "react-loadable-ssr-addon-v5-slorber": ["react-loadable-ssr-addon-v5-slorber@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.10.3" }, "peerDependencies": { "react-loadable": "*", "webpack": ">=4.41.1 || 5.x" } }, "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A=="], + + "react-router": ["react-router@5.3.4", "", { "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" } }, "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA=="], + + "react-router-config": ["react-router-config@5.1.1", "", { "dependencies": { "@babel/runtime": "^7.1.2" }, "peerDependencies": { "react": ">=15", "react-router": ">=5" } }, "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg=="], + + "react-router-dom": ["react-router-dom@5.3.4", "", { "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" } }, "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "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" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="], + + "regexpu-core": ["regexpu-core@6.4.0", "", { "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" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], + + "registry-auth-token": ["registry-auth-token@5.1.0", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw=="], + + "registry-url": ["registry-url@6.0.1", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="], + + "remark-directive": ["remark-directive@3.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^3.0.0", "unified": "^11.0.0" } }, "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A=="], + + "remark-emoji": ["remark-emoji@4.0.1", "", { "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" } }, "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg=="], + + "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "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" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "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" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "renderkid": ["renderkid@3.0.0", "", { "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.1" } }, "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "repomix": ["repomix@0.3.9", "", { "dependencies": { "@clack/prompts": "^0.10.1", "@modelcontextprotocol/sdk": "^1.11.0", "@secretlint/core": "^9.3.1", "@secretlint/secretlint-rule-preset-recommend": "^9.3.1", "cli-spinners": "^2.9.2", "clipboardy": "^4.0.0", "commander": "^14.0.0", "fast-xml-parser": "^5.2.0", "git-url-parse": "^16.1.0", "globby": "^14.1.0", "handlebars": "^4.7.8", "iconv-lite": "^0.6.3", "istextorbinary": "^9.5.0", "jschardet": "^3.1.4", "json5": "^2.2.3", "log-update": "^6.1.0", "minimatch": "^10.0.1", "picocolors": "^1.1.1", "piscina": "^4.9.2", "strip-comments": "^2.0.1", "strip-json-comments": "^5.0.1", "tiktoken": "^1.0.20", "tree-sitter-wasms": "^0.1.12", "web-tree-sitter": "^0.24.7", "zod": "^3.24.3" }, "bin": { "repomix": "bin/repomix.cjs" } }, "sha512-Olo/vORZChL98HOC3tZaE5+kwSaoox8KoF9N+lfQRb7dWT4qNa/SLFHT40Xq54cbZ7l9qTIZhXWmU1d/AtwqGQ=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-like": ["require-like@0.1.2", "", {}, "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pathname": ["resolve-pathname@3.0.0", "", {}, "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="], + + "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "rtlcss": ["rtlcss@4.3.0", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", "postcss": "^8.4.21", "strip-json-comments": "^3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" } }, "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "schema-dts": ["schema-dts@1.1.5", "", {}, "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg=="], + + "schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], + + "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "select-hose": ["select-hose@2.0.0", "", {}, "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="], + + "selfsigned": ["selfsigned@2.4.1", "", { "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA=="], + + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "serve-handler": ["serve-handler@6.1.6", "", { "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ=="], + + "serve-index": ["serve-index@1.9.1", "", { "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" } }, "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "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" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shallow-clone": ["shallow-clone@3.0.1", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "side-channel": ["side-channel@1.1.0", "", { "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" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "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" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sitemap": ["sitemap@7.1.2", "", { "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" }, "bin": { "sitemap": "dist/cli.js" } }, "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw=="], + + "skin-tone": ["skin-tone@2.0.0", "", { "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" } }, "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "sockjs": ["sockjs@0.3.24", "", { "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ=="], + + "sort-css-media-queries": ["sort-css-media-queries@2.2.0", "", {}, "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spdy": ["spdy@4.0.2", "", { "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" } }, "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="], + + "spdy-transport": ["spdy-transport@3.0.0", "", { "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" } }, "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "srcset": ["srcset@4.0.0", "", {}, "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "stringify-object": ["stringify-object@3.3.0", "", { "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" } }, "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strip-comments": ["strip-comments@2.0.1", "", {}, "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], + + "strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], + + "structured-source": ["structured-source@4.0.0", "", { "dependencies": { "boundary": "^2.0.0" } }, "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA=="], + + "style-to-js": ["style-to-js@1.1.17", "", { "dependencies": { "style-to-object": "1.0.9" } }, "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA=="], + + "style-to-object": ["style-to-object@1.0.9", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw=="], + + "style-vendorizer": ["style-vendorizer@2.2.3", "", {}, "sha512-/VDRsWvQAgspVy9eATN3z6itKTuyg+jW1q6UoTCQCFRqPDw8bi3E1hXIKnGw5LvXS2AQPuJ7Af4auTLYeBOLEg=="], + + "stylehacks": ["stylehacks@6.1.1", "", { "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg=="], + + "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="], + + "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "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" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + + "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], + + "tapable": ["tapable@2.2.3", "", {}, "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg=="], + + "terser": ["terser@5.44.0", "", { "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" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], + + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], + + "textextensions": ["textextensions@6.11.0", "", { "dependencies": { "editions": "^6.21.0" } }, "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ=="], + + "thunky": ["thunky@1.1.0", "", {}, "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="], + + "tiktoken": ["tiktoken@1.0.22", "", {}, "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "tree-sitter-wasms": ["tree-sitter-wasms@0.1.12", "", { "dependencies": { "tree-sitter-wasms": "^0.1.11" } }, "sha512-N9Jp+dkB23Ul5Gw0utm+3pvG4km4Fxsi2jmtMFg7ivzwqWPlSyrYQIrOmcX+79taVfcHEA+NzP0hl7vXL8DNUQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "turndown": ["turndown@7.2.1", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ=="], + + "twind": ["twind@0.16.19", "", { "dependencies": { "csstype": "^3.0.5", "htmlparser2": "^6.0.0", "style-vendorizer": "^2.0.0" }, "peerDependencies": { "typescript": "^4.1.0" }, "optionalPeers": ["typescript"] }, "sha512-/9H7I/Xzji6UZ+x1V8/llcQSAI0bINqpZtvAqqTzuU/qAdzRCnrpaME8x57k8tUu2KbosjSQE85sSwcLBGD1DQ=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], + + "typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "undici-types": ["undici-types@7.12.0", "", {}, "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-emoji-modifier-base": ["unicode-emoji-modifier-base@1.0.0", "", {}, "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "unified": ["unified@11.0.5", "", { "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" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unique-string": ["unique-string@3.0.0", "", { "dependencies": { "crypto-random-string": "^4.0.0" } }, "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "update-notifier": ["update-notifier@6.0.2", "", { "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" } }, "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "url-loader": ["url-loader@4.1.1", "", { "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" }, "peerDependencies": { "file-loader": "*", "webpack": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["file-loader"] }, "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utila": ["utila@0.4.0", "", {}, "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="], + + "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "value-equal": ["value-equal@1.0.1", "", {}, "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "version-range": ["version-range@4.15.0", "", {}, "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + + "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], + + "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="], + + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], + + "wbuf": ["wbuf@1.7.3", "", { "dependencies": { "minimalistic-assert": "^1.0.0" } }, "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "web-tree-sitter": ["web-tree-sitter@0.24.7", "", {}, "sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ=="], + + "webpack": ["webpack@5.101.3", "", { "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.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "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.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A=="], + + "webpack-bundle-analyzer": ["webpack-bundle-analyzer@4.10.2", "", { "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" } }, "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw=="], + + "webpack-dev-middleware": ["webpack-dev-middleware@5.3.4", "", { "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q=="], + + "webpack-dev-server": ["webpack-dev-server@4.15.2", "", { "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, "optionalPeers": ["webpack"], "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" } }, "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g=="], + + "webpack-merge": ["webpack-merge@5.10.0", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.0" } }, "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA=="], + + "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], + + "webpackbar": ["webpackbar@6.0.1", "", { "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" }, "peerDependencies": { "webpack": "3 || 4 || 5" } }, "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q=="], + + "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], + + "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], + + "wildcard": ["wildcard@2.0.1", "", {}, "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], + + "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], + + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@docusaurus/core/webpack-merge": ["webpack-merge@6.0.1", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.1" } }, "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg=="], + + "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "@svgr/hast-util-to-babel-ast/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "accepts/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "body-parser/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "boxen/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "cheerio/dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "cheerio/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "cheerio/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "cheerio/htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + + "cheerio-select/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "cheerio-select/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "cheerio-select/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "cli-table3/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "clipboardy/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "compressible/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "compression/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "copy-webpack-plugin/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "copy-webpack-plugin/globby": ["globby@13.2.2", "", { "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w=="], + + "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + + "css-minimizer-webpack-plugin/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], + + "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + + "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "express/content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + + "express/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "express/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "file-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "got/@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], + + "hpack.js/readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "html-minifier-terser/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + + "html-minifier-terser/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "html-webpack-plugin/html-minifier-terser": ["html-minifier-terser@6.1.0", "", { "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" } }, "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw=="], + + "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "http-proxy-middleware/is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-from-markdown/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mdast-util-frontmatter/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-gfm-autolink-literal/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "mdast-util-gfm-table/markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "micromark/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-core-commonmark/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-core-commonmark/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-core-commonmark/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-directive/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-directive/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-directive/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-frontmatter/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-frontmatter/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-autolink-literal/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-autolink-literal/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-footnote/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-footnote/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-footnote/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-strikethrough/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-table/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-table/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-table/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-gfm-task-list-item/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-gfm-task-list-item/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-gfm-task-list-item/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdx-expression/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-mdx-expression/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdx-expression/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdx-jsx/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-extension-mdx-jsx/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdx-jsx/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-extension-mdxjs-esm/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-extension-mdxjs-esm/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-destination/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-destination/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-label/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-label/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-mdx-expression/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-mdx-expression/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-mdx-expression/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-space/micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="], + + "micromark-factory-title/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-title/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-factory-whitespace/micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-whitespace/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-factory-whitespace/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-character/micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="], + + "micromark-util-chunked/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-classify-character/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-classify-character/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-decode-numeric-character-reference/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-decode-string/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-decode-string/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-events-to-acorn/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-normalize-identifier/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-sanitize-uri/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-sanitize-uri/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-subtokenize/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "null-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "parse5-htmlparser2-tree-adapter/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-discard-unused/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-unique-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "raw-body/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "raw-body/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "renderkid/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "repomix/commander": ["commander@14.0.1", "", {}, "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A=="], + + "repomix/globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="], + + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + + "rtlcss/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "send/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "send/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "serve-handler/mime-types": ["mime-types@2.1.18", "", { "dependencies": { "mime-db": "~1.33.0" } }, "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ=="], + + "serve-handler/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "serve-handler/path-to-regexp": ["path-to-regexp@3.3.0", "", {}, "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="], + + "serve-index/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "serve-index/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "serve-index/http-errors": ["http-errors@1.6.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" } }, "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="], + + "sitemap/@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "stylehacks/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "svgo/css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "type-is/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "update-notifier/boxen": ["boxen@7.1.1", "", { "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" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="], + + "update-notifier/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "url-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "webpack-bundle-analyzer/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "webpack-dev-middleware/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "webpack-dev-server/express": ["express@4.21.2", "", { "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.13.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" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "webpack-dev-server/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "webpackbar/ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "webpackbar/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "accepts/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "cheerio-select/domutils/dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "cheerio/dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "cheerio/htmlparser2/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "cli-table3/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cli-table3/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "cli-table3/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "clipboardy/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "clipboardy/execa/human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "clipboardy/execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "clipboardy/execa/npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "clipboardy/execa/onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "clipboardy/execa/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "clipboardy/execa/strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "copy-webpack-plugin/globby/slash": ["slash@4.0.0", "", {}, "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="], + + "css-minimizer-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + + "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "file-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "hpack.js/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "hpack.js/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "hpack.js/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "html-webpack-plugin/html-minifier-terser/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "mdast-util-gfm-autolink-literal/micromark-util-character/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "null-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "renderkid/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "repomix/globby/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "repomix/globby/path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="], + + "repomix/globby/slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], + + "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "serve-handler/mime-types/mime-db": ["mime-db@1.33.0", "", {}, "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="], + + "serve-index/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "serve-index/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "serve-index/http-errors/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "serve-index/http-errors/setprototypeof": ["setprototypeof@1.1.0", "", {}, "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="], + + "serve-index/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "svgo/css-select/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "svgo/css-select/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "update-notifier/boxen/camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="], + + "update-notifier/boxen/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "url-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "webpack-dev-server/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "webpack-dev-server/express/body-parser": ["body-parser@1.20.3", "", { "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.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "webpack-dev-server/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "webpack-dev-server/express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "webpack-dev-server/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "webpack-dev-server/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "webpack-dev-server/express/finalhandler": ["finalhandler@1.3.1", "", { "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.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "webpack-dev-server/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "webpack-dev-server/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "webpack-dev-server/express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "webpack-dev-server/express/qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "webpack-dev-server/express/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "webpack-dev-server/express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "webpack-dev-server/express/serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "webpack-dev-server/express/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "webpack-dev-server/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "webpackbar/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "webpackbar/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "webpackbar/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.5.0", "", {}, "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "cheerio-select/domutils/dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "cli-table3/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "clipboardy/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "clipboardy/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "svgo/css-select/domutils/dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "update-notifier/boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "webpack-dev-server/express/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "webpack-dev-server/express/body-parser/bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "webpack-dev-server/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "webpack-dev-server/express/body-parser/raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "webpack-dev-server/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "webpack-dev-server/express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "webpack-dev-server/express/type-is/media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "webpackbar/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "webpackbar/wrap-ansi/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "webpackbar/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "svgo/css-select/domutils/dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index c9c53038..00000000 Binary files a/bun.lockb and /dev/null differ diff --git a/codetestingplayground/.gitignore b/codetestingplayground/.gitignore new file mode 100644 index 00000000..8c7a2760 --- /dev/null +++ b/codetestingplayground/.gitignore @@ -0,0 +1,26 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +build/ + +# Environment variables +.env +.env.local +.env.*.local + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db + +# Debug logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/codetestingplayground/.npmrc b/codetestingplayground/.npmrc new file mode 100644 index 00000000..5067e477 --- /dev/null +++ b/codetestingplayground/.npmrc @@ -0,0 +1 @@ +@tsci:registry=https://npm.tscircuit.com diff --git a/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-pcb.snap.svg b/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-pcb.snap.svg new file mode 100644 index 00000000..55f1e3a0 --- /dev/null +++ b/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-pcb.snap.svg @@ -0,0 +1 @@ +HAT1_chipBZ1Q1R1 \ No newline at end of file diff --git a/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-schematic.snap.svg b/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-schematic.snap.svg new file mode 100644 index 00000000..441ee5f0 --- /dev/null +++ b/codetestingplayground/__snapshots__/pi-hat-buzzer.circuit-schematic.snap.svg @@ -0,0 +1,53 @@ +HAT1_chip1V3_3_12V5_13V5_24GND_15GPIO_14/TX6GPIO_15/RX7GPIO_18/PCM_CLK8GND_210GPIO_2411GND_312GPIO_2513GPIO_8/CE014GPIO_7/CE115GPIO_1/ID_SC16GND_417GPIO_12/PWM018GND_519GPIO_1620GPIO_20/PCM_DIN21GPIO_21/PCM_DOUT22GND_623GPIO_2624GPIO_19/PCM_FS25GPIO_13/PWM126GPIO_627GPIO_528GPIO_0/ID_SD29GND_730GPIO_11/SCLK31GPIO_9/MISO32GPIO_10/MOSI33V3_3_234GPIO_2235GPIO_2736GPIO_1737GND_838GPIO_4/GPCLK039GPIO_3/SCL40GPIO_2/SDAPassive BuzzerBZ112Q11B2E3CR11kΩHAT1_chip_GPIO_18/R1_pin1HAT1_chip_GPIO_18/R1_pin1BZ1_pin2/Q1_C \ No newline at end of file diff --git a/codetestingplayground/bunfig.toml b/codetestingplayground/bunfig.toml new file mode 100644 index 00000000..3ce444d8 --- /dev/null +++ b/codetestingplayground/bunfig.toml @@ -0,0 +1,5 @@ +# [test] +# preload = ["./tests/fixtures/preload.ts"] + +[install.lockfile] +save = false diff --git a/codetestingplayground/index.tsx b/codetestingplayground/index.tsx new file mode 100644 index 00000000..312c2caa --- /dev/null +++ b/codetestingplayground/index.tsx @@ -0,0 +1,13 @@ +export default () => ( + + + + + +) diff --git a/codetestingplayground/package.json b/codetestingplayground/package.json new file mode 100644 index 00000000..6de5c2af --- /dev/null +++ b/codetestingplayground/package.json @@ -0,0 +1,22 @@ +{ + "name": "@tsci/tscircuit.codetestingplayground", + "version": "1.0.0", + "main": "index.tsx", + "keywords": [ + "tscircuit" + ], + "scripts": { + "dev": "tsci dev", + "build": "tsci build", + "snapshot": "tsci snapshot", + "snapshot:update": "tsci snapshot --update", + "start": "tsci dev" + }, + "devDependencies": { + "@types/react": "^19.2.8", + "tscircuit": "^0.0.1148" + }, + "dependencies": { + "@tscircuit/common": "^0.0.33" + } +} \ No newline at end of file diff --git a/codetestingplayground/pi-hat-buzzer.circuit.tsx b/codetestingplayground/pi-hat-buzzer.circuit.tsx new file mode 100644 index 00000000..b88cf2cc --- /dev/null +++ b/codetestingplayground/pi-hat-buzzer.circuit.tsx @@ -0,0 +1,55 @@ +import { RaspberryPiHatBoard } from "@tscircuit/common" + +export default () => ( + + {/* Passive Buzzer - driven by GPIO18 (PWM capable) */} + + + {/* NPN Transistor to drive buzzer (2N2222 or similar) */} + + + {/* Base resistor for transistor (1k) */} + + + {/* Connect GPIO18 (PWM) to base resistor */} + + + {/* Connect resistor to transistor base */} + + + {/* Connect transistor emitter to ground */} + + + {/* Connect buzzer positive to 5V */} + + + {/* Connect buzzer negative to transistor collector */} + + +) diff --git a/codetestingplayground/tscircuit.config.json b/codetestingplayground/tscircuit.config.json new file mode 100644 index 00000000..b9e98ac6 --- /dev/null +++ b/codetestingplayground/tscircuit.config.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://cdn.jsdelivr.net/npm/@tscircuit/cli/types/tscircuit.config.schema.json", + "mainEntrypoint": "index.tsx" +} diff --git a/codetestingplayground/tsconfig.json b/codetestingplayground/tsconfig.json new file mode 100644 index 00000000..50c22603 --- /dev/null +++ b/codetestingplayground/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "ESNext", + "jsx": "react-jsx", + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "sourceMap": true, + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "types": ["tscircuit"] + } +} diff --git a/docs/advanced/ai-context.mdx b/docs/advanced/ai-context.mdx new file mode 100644 index 00000000..a5ad49ba --- /dev/null +++ b/docs/advanced/ai-context.mdx @@ -0,0 +1,27 @@ +--- +title: Use tscircuit with AI +description: Install the tscircuit skill so your AI assistant can design boards with tscircuit +--- + +import YouTubeEmbed from '../../src/components/YouTubeEmbed'; + +## Overview + + + +To use tscircuit with an AI assistant, install the `tscircuit` skill: + +```bash +npx skills add tscircuit/skill +``` + +The skill lives in the [tscircuit/skill](https://github.com/tscircuit/skill) +repository. + +It contains the syntax, workflows, CLI usage, and project knowledge an AI needs +to build a board from scratch with tscircuit. + +After installing it, tell the AI what you want to build, any physical +constraints, and which parts or interfaces you need. The skill gives the AI the +context it needs to search for components, write tscircuit code, and iterate on +your design. diff --git a/docs/advanced/create-or-use-custom-autorouter.mdx b/docs/advanced/create-or-use-custom-autorouter.mdx new file mode 100644 index 00000000..c0b7c617 --- /dev/null +++ b/docs/advanced/create-or-use-custom-autorouter.mdx @@ -0,0 +1,490 @@ +--- +title: Create or Use a Custom Autorouter +description: Use a custom autorouter directly from tscircuit code with algorithmFn. +--- + +import CircuitExample from "@site/src/components/CircuitPreview" + +export const customAutorouterFiles = { + "index.circuit.tsx": `import { SimpleCustomAutorouter } from "./src/simple-custom-autorouter" + +const LEFT_HEADER_X = -13 +const RIGHT_HEADER_X = 13 + +export default () => ( + + new SimpleCustomAutorouter(simpleRouteJson), + }} + > + + + + + + + + + + + + +)`, + "src/simple-custom-autorouter.ts": `import type { + AutorouterCompleteEvent, + AutorouterErrorEvent, + AutorouterProgressEvent, + GenericLocalAutorouter, + Obstacle, + SimpleRouteConnection, + SimpleRouteJson, + SimplifiedPcbTrace, +} from "tscircuit" + +type Handler = (event: T) => void +type Layer = string + +interface Point { + x: number + y: number + layer?: string + pointId?: string + pcb_port_id?: string +} + +const TRACE_CLEARANCE = 0.35 +const HEADER_ESCAPE = 2.1 +const LANE_SPACING = 0.65 + +export class SimpleCustomAutorouter implements GenericLocalAutorouter { + readonly input: SimpleRouteJson + isRouting = false + + private completeHandlers: Array> = [] + private errorHandlers: Array> = [] + private progressHandlers: Array> = [] + private cachedTraces: SimplifiedPcbTrace[] | null = null + + constructor(input: SimpleRouteJson) { + this.input = input + } + + on(event: "complete", callback: Handler): void + on(event: "error", callback: Handler): void + on(event: "progress", callback: Handler): void + on( + event: "complete" | "error" | "progress", + callback: + | Handler + | Handler + | Handler, + ): void { + if (event === "complete") { + this.completeHandlers.push(callback as Handler) + return + } + if (event === "error") { + this.errorHandlers.push(callback as Handler) + return + } + this.progressHandlers.push(callback as Handler) + } + + start(): void { + if (this.isRouting) return + + this.isRouting = true + this.emitProgress(0, "building custom Manhattan routes") + + setTimeout(() => { + if (!this.isRouting) return + + try { + const traces = this.solveSync() + this.isRouting = false + this.emitProgress(1, "custom autorouter complete") + this.emitComplete(traces) + } catch (error) { + this.isRouting = false + this.emitError(error) + } + }, 0) + } + + stop(): void { + this.isRouting = false + } + + solveSync(): SimplifiedPcbTrace[] { + if (this.cachedTraces) return this.cachedTraces + + this.cachedTraces = this.input.connections.flatMap((connection, index) => { + if (connection.pointsToConnect.length < 2) return [] + + const route = routeConnection(this.input, connection, index) + + return [ + { + type: "pcb_trace" as const, + pcb_trace_id: connection.source_trace_id ?? \`custom_trace_\${index}\`, + connection_name: connection.name, + route, + }, + ] + }) + + return this.cachedTraces + } + + private emitComplete(traces: SimplifiedPcbTrace[]) { + for (const handler of this.completeHandlers) { + handler({ type: "complete", traces }) + } + } + + private emitError(error: unknown) { + const normalizedError = + error instanceof Error ? error : new Error(String(error)) + + for (const handler of this.errorHandlers) { + handler({ type: "error", error: normalizedError }) + } + } + + private emitProgress(progress: number, phase: string) { + for (const handler of this.progressHandlers) { + handler({ + type: "progress", + steps: Math.round(progress * this.input.connections.length), + progress, + phase, + }) + } + } +} + +function routeConnection( + input: SimpleRouteJson, + connection: SimpleRouteConnection, + connectionIndex: number, +): SimplifiedPcbTrace["route"] { + const width = getTraceWidth(input, connection) + const layer = getRouteLayer(input, connectionIndex) + const route: SimplifiedPcbTrace["route"] = [] + + for (let i = 0; i < connection.pointsToConnect.length - 1; i += 1) { + const start = connection.pointsToConnect[i]! + const end = connection.pointsToConnect[i + 1]! + const section = routeBetweenPoints({ + input, + connection, + connectionIndex, + start, + end, + layer, + width, + }) + + route.push(...(i === 0 ? section : section.slice(1))) + } + + return compactWires(route) +} + +function routeBetweenPoints({ + input, + connection, + connectionIndex, + start, + end, + layer, + width, +}: { + input: SimpleRouteJson + connection: SimpleRouteConnection + connectionIndex: number + start: Point + end: Point + layer: Layer + width: number +}): SimplifiedPcbTrace["route"] { + const direction = end.x >= start.x ? 1 : -1 + const laneNumber = Math.floor(connectionIndex / 2) + const side = connectionIndex % 2 === 0 ? 1 : -1 + const escape = HEADER_ESCAPE + laneNumber * LANE_SPACING + const entryX = clamp( + start.x + direction * escape, + input.bounds.minX, + input.bounds.maxX, + ) + const exitX = clamp( + end.x - direction * escape, + input.bounds.minX, + input.bounds.maxX, + ) + const laneY = getBypassLaneY({ + input, + connection, + start, + end, + side, + laneNumber, + }) + + return compactWires([ + wire(start.x, start.y, layer, width), + wire(entryX, start.y, layer, width), + wire(entryX, laneY, layer, width), + wire(exitX, laneY, layer, width), + wire(exitX, end.y, layer, width), + wire(end.x, end.y, layer, width), + ]) +} + +function getBypassLaneY({ + input, + connection, + start, + end, + side, + laneNumber, +}: { + input: SimpleRouteJson + connection: SimpleRouteConnection + start: Point + end: Point + side: 1 | -1 + laneNumber: number +}) { + const routeMinX = Math.min(start.x, end.x) + const routeMaxX = Math.max(start.x, end.x) + const connectionIds = getConnectionIds(connection) + const blockingObstacles = input.obstacles.filter( + (obstacle) => + !isObstacleConnectedTo(connectionIds, obstacle) && + obstacle.center.x + obstacle.width / 2 >= routeMinX && + obstacle.center.x - obstacle.width / 2 <= routeMaxX, + ) + + const obstacleTop = + Math.max( + ...blockingObstacles.map( + (obstacle) => obstacle.center.y + obstacle.height / 2, + ), + Math.max(start.y, end.y), + ) + TRACE_CLEARANCE + + const obstacleBottom = + Math.min( + ...blockingObstacles.map( + (obstacle) => obstacle.center.y - obstacle.height / 2, + ), + Math.min(start.y, end.y), + ) - TRACE_CLEARANCE + + const offset = laneNumber * LANE_SPACING + const desiredY = side > 0 ? obstacleTop + offset : obstacleBottom - offset + const boardMargin = TRACE_CLEARANCE * 2 + + return clamp( + desiredY, + input.bounds.minY + boardMargin, + input.bounds.maxY - boardMargin, + ) +} + +function getTraceWidth( + input: SimpleRouteJson, + connection: SimpleRouteConnection, +) { + return toNumber( + connection.width ?? + connection.nominalTraceWidth ?? + input.nominalTraceWidth ?? + input.minTraceWidth, + ) +} + +function getRouteLayer(input: SimpleRouteJson, connectionIndex: number): Layer { + const layerNames = getLayerNames(input.layerCount) + return layerNames[connectionIndex % layerNames.length] ?? "top" +} + +function getLayerNames(layerCount: number) { + if (layerCount <= 1) return ["top"] + if (layerCount === 2) return ["top", "bottom"] + + const layerNames = ["top"] + for (let i = 1; i < layerCount - 1; i += 1) { + layerNames.push(\`inner\${i}\`) + } + layerNames.push("bottom") + return layerNames +} + +function getConnectionIds(connection: SimpleRouteConnection) { + return new Set( + [ + connection.name, + connection.source_trace_id, + ...connection.pointsToConnect.flatMap((point) => [ + point.pointId, + point.pcb_port_id, + ]), + ].filter((value): value is string => Boolean(value)), + ) +} + +function isObstacleConnectedTo(connectionIds: Set, obstacle: Obstacle) { + return obstacle.connectedTo.some((id) => connectionIds.has(id)) +} + +function compactWires(route: SimplifiedPcbTrace["route"]) { + const compacted: SimplifiedPcbTrace["route"] = [] + + for (const point of route) { + const previous = compacted[compacted.length - 1] + if ( + previous?.route_type === "wire" && + point.route_type === "wire" && + previous.x === point.x && + previous.y === point.y && + previous.layer === point.layer + ) { + continue + } + + compacted.push(point) + } + + return compacted +} + +function wire(x: number, y: number, layer: Layer, width: number) { + return { + route_type: "wire" as const, + x, + y, + layer, + width, + } +} + +function clamp(value: number, min: number, max: number) { + return Math.min(max, Math.max(min, value)) +} + +function toNumber(value: number | string) { + if (typeof value === "number") return value + + const parsed = Number.parseFloat(value) + if (Number.isFinite(parsed)) return parsed + + throw new Error(\`Expected a numeric route width, got "\${value}"\`) +}`, +} + +Use `algorithmFn` when you want to create or use a custom autorouter in your +tscircuit project without running a separate autorouter server. The function +receives the board's `SimpleRouteJson` routing problem and returns a +`GenericLocalAutorouter`. + +This example recreates the +[`tscircuit/example-custom-autorouter`](https://github.com/tscircuit/example-custom-autorouter) +project. The board is a four-wire crossover adapter. The custom router draws +Manhattan routes, cycles traces across the available layers, and uses obstacles +from the `SimpleRouteJson` input to route around the center mounting hole. + + + +## Use an Autorouter in a Board + +Pass an object with `algorithmFn` to the `autorouter` prop. The function can +construct your own router, call a library, or wrap an existing routing +implementation: + +```tsx + + new SimpleCustomAutorouter(simpleRouteJson), + }} +> + {/* components and traces */} + +``` + +`algorithmFn` receives a `SimpleRouteJson` object. Return an object that +implements `GenericLocalAutorouter`, usually with these methods: + +- `start()` to begin asynchronous routing and emit a `complete` event +- `stop()` to cancel routing +- `on("progress" | "complete" | "error", callback)` to report router state +- `solveSync()` to return `SimplifiedPcbTrace[]` synchronously when supported + +## Create a Router + +The router output is a list of simplified PCB traces. Each trace should use the +source trace ID when one is present, then return a route made of `wire` and +optional `via` points. + +The example's `SimpleCustomAutorouter` is intentionally small, but it shows the +full shape: event handlers, sync solving, trace IDs, route widths, layer +selection, obstacle checks, and progress/error reporting. + +## Run the Example Locally + +```bash +git clone https://github.com/tscircuit/example-custom-autorouter +cd example-custom-autorouter +bun install +bun run typecheck +bun run build +``` + +Use `bun run dev` to open the interactive tscircuit viewer. + +For a custom autorouter that runs as an HTTP service instead of inside the +tscircuit process, see the [Autorouting API](../web-apis/autorouting-api.mdx#using-a-custom-autorouter-server). diff --git a/docs/advanced/local-package-development.mdx b/docs/advanced/local-package-development.mdx new file mode 100644 index 00000000..80602666 --- /dev/null +++ b/docs/advanced/local-package-development.mdx @@ -0,0 +1,227 @@ +--- +title: Local Package Development +description: Learn how to develop and test local packages with tsci dev using yalc and other linking tools +--- + +## Overview + +When developing tscircuit projects, you may want to test changes to local packages without publishing them to npm. The `tsci dev` command automatically detects and uploads local packages, making local development seamless. + +Currently supported methods: +- **yalc** - Recommended for most use cases +- **bun link** - Native Bun linking for Bun users + +## What is Yalc? + +[Yalc](https://github.com/wclr/yalc) is a tool for managing local package dependencies. It's a better alternative to `npm link` that creates a local package store and symlinks packages into your project's `node_modules`. + +## Installation + +First, install yalc globally: + +```bash +npm install -g yalc +# or +bun install -g yalc +``` + +## Basic Workflow + +### 1. Build and Publish Your Local Package + +In the package you're developing `@/` (e.g., `@tscircuit/pico`): + +```bash +cd path/to/your/local/package + +# Build the package first +bun run build +# or npm run build + +# Then publish to yalc +yalc publish +``` + +This builds the package and publishes the distribution files to your local yalc store. + +**Note**: You must build the package before publishing with yalc, as it publishes the compiled output (typically in `dist/` or `lib/`), not the source files. + +### 2. Link the Package to Your Project + +In your tscircuit project: + +```bash +cd path/to/your/tscircuit-project +yalc add @tscircuit/pico +``` + +This will: +- Add the package to your `node_modules` +- Update your `package.json` with a `file:.yalc/@tscircuit/pico` reference +- Create a `.yalc` directory with the package contents + +### 3. Start Development + +Run the dev server as usual: + +```bash +tsci dev index.circuit.tsx +``` + +The dev server will automatically detect that `@tscircuit/pico` is a local package (via the `file:.yalc/` reference) and upload it along with your component files. + +### 4. Update Your Local Package + +When you make changes to your local package: + +```bash +# In the local package directory +bun run build # Rebuild with your changes +yalc push # Push updates to all linked projects +``` + +This will rebuild and update all linked projects. You may need to restart `tsci dev` to pick up the changes. + +## How It Works + +The `tsci dev` command automatically uploads packages from `node_modules` **only if** they meet these criteria: + +1. The package is referenced in `package.json` with a `file:.yalc/` path +2. The package exists in your `node_modules` directory + +Regular npm packages (like `react`, `lodash`, etc.) are **not** uploaded to keep bundle sizes small and development fast. + +## Example + +Here's a complete example of developing a custom component library: + +**Your local library** (`my-components`): +```tsx +// my-components/src/index.ts +export const MyCustomChip = (props: any) => { + return +} +``` + +**Publish it locally**: +```bash +bun run build +yalc publish +``` + +**Use it in your project**: +```bash +cd my-tscircuit-project +yalc add my-components +``` + +**Your component**: +```tsx +// circuit.tsx +import { MyCustomChip } from "my-components" + +export default () => ( + + + +) +``` + +**Start dev server**: +```bash +tsci dev circuit.tsx +``` + +Now both your component and the `my-components` package code will be uploaded to the dev server! + +## Removing Yalc Packages + +To remove a yalc package and restore the npm version: + +```bash +yalc remove @tscircuit/pico +npm install @tscircuit/pico +``` + +Or remove all yalc packages: + +```bash +yalc remove --all +``` + +## Tips + +- Use `yalc push` instead of `yalc publish` when updating packages - it's faster and automatically updates linked projects +- The `.yalc` directory and `yalc.lock` file should be added to `.gitignore` +- Remember to test with the published npm version before releasing to ensure compatibility + +## Using Bun Link + +If you're using Bun as your package manager, you can use the native `bun link` command instead of yalc. This provides a simpler workflow for Bun users. + +### Basic Workflow with Bun Link + +#### 1. Link Your Local Package + +In the package you're developing (e.g., `@tscircuit/pico`): + +```bash +cd path/to/your/local/package + +# Build the package first +bun run build + +# Register it for linking +bun link +``` + +This registers the package globally, making it available for linking in other projects. + +#### 2. Link the Package to Your Project + +In your tscircuit project: + +```bash +cd path/to/your/tscircuit-project +bun link @tscircuit/pico +``` + +This creates a symlink in your project's `node_modules` pointing to your local package. + +#### 3. Start Development + +Run the dev server as usual: + +```bash +tsci dev index.circuit.tsx +``` + +The dev server will automatically detect that `@tscircuit/pico` is a local package (via the symlink) and upload it along with your component files. + +#### 4. Update Your Local Package + +When you make changes to your local package: + +```bash +# In the local package directory +bun run build # Rebuild with your changes +``` + +Since `bun link` uses symlinks, the changes will be immediately available. You may need to restart `tsci dev` to pick up the changes. + +### Unlinking Bun Packages + +To remove a linked package: + +```bash +# In your project +bun unlink @tscircuit/pico +``` + +To remove the global link registration: + +```bash +# In the package directory +bun unlink +``` + diff --git a/docs/advanced/math-utils.mdx b/docs/advanced/math-utils.mdx new file mode 100644 index 00000000..5051cad3 --- /dev/null +++ b/docs/advanced/math-utils.mdx @@ -0,0 +1,86 @@ +--- +title: Math Utils +description: >- + The `@tscircuit/math-utils` package provides a set of utilities that are + commonly used in circuit design. The `@tscircuit/math-utils` package is + generally available in any platform that uses `tscircuit`. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `@tscircuit/math-utils` package provides a set of utilities that are +commonly used in circuit design. The `@tscircuit/math-utils` package is +generally available in any platform that uses `tscircuit`. + +The source code for the `@tscircuit/math-utils` package [is available here](https://github.com/tscircuit/math-utils) + + +## `grid` + +A utility function that generates a grid of cells with configurable dimensions, spacing, and positioning. Each cell contains its index, position (row/column), and coordinate points (center, top-left, bottom-right). + + ( + + {gridCells.map((cell) => ( + + ))} + +) +`} +/> + +## Grid Options + +| Option | Description | Default | +| ------ | ----------- | ------- | +| `rows` | Number of rows in the generated grid. | Required | +| `cols` | Number of columns in the generated grid. | Required | +| `width` | Total width of the grid. When omitted, uses `cols * xSpacing`. | `cols * xSpacing` | +| `height` | Total height of the grid. When omitted, uses `rows * ySpacing`. | `rows * ySpacing` | +| `xSpacing` | Horizontal spacing between cells when `width` is not provided. | `1` | +| `ySpacing` | Vertical spacing between cells when `height` is not provided. | `1` | +| `offsetX` | Horizontal offset applied to every cell. | `0` | +| `offsetY` | Vertical offset applied to every cell. | `0` | +| `yDirection` | Sets positive Y direction: `"cartesian"` keeps positive-up, `"up-is-negative"` flips it. | `"cartesian"` | +| `centered` | Centers the grid around the origin when `true`. | `true` | + +## Grid Cell Data + +Each object returned by `grid` represents a cell with useful positional metadata: + +| Property | Description | +| -------- | ----------- | +| `index` | Sequential identifier for the cell. | +| `row` / `col` | Grid coordinates of the cell starting from zero. | +| `center` | `{ x, y }` coordinates of the cell center. | +| `topLeft` | `{ x, y }` coordinates of the cell's top-left corner. | +| `bottomRight` | `{ x, y }` coordinates of the cell's bottom-right corner. | diff --git a/docs/advanced/simple-route-json.mdx b/docs/advanced/simple-route-json.mdx new file mode 100644 index 00000000..4fc428d5 --- /dev/null +++ b/docs/advanced/simple-route-json.mdx @@ -0,0 +1,603 @@ +--- +title: Simple Route JSON +description: >- + Simple Route JSON (SRJ) is a lightweight, straightforward format designed to + describe a Printed Circuit Board (PCB) routing problem. It serves as a common + intermediary representation used by `tscircuit` autorouters, simplifying the + complex details often found in full PCB design files. +--- + +## Overview + +Simple Route JSON (SRJ) is a lightweight, straightforward format designed to describe a Printed Circuit Board (PCB) routing problem. It serves as a common intermediary representation used by [`tscircuit` autorouters](https://github.com/tscircuit/unravel-autorouter), simplifying the complex details often found in full PCB design files. + +The primary goal of SRJ is to provide only the essential information required for a routing algorithm: +1. Where routing is allowed (layers, board boundaries). +2. Where routing is forbidden (obstacles, keep-out areas). +3. What needs to be connected (nets and their associated pins/pads). +4. Basic routing constraints (minimum trace width). + +SRJ can be directly generated from more comprehensive formats like [Circuit JSON](https://circuitjson.com), stripping away details irrelevant to the core routing task (e.g., specific component models, schematic information beyond connectivity). It shares conceptual similarities with the industry-standard [Specctra DSN (Design)](https://github.com/tscircuit/dsn-converter) format, but aims for greater simplicity and modern JSON representation. + +:::info +A formal specification with versioning is planned for the future. To stay updated on its release and other tscircuit developments, please subscribe to [the tscircuit newsletter](https://blog.tscircuit.com/). +::: + +## Format Structure + +A Simple Route JSON file is a single JSON object containing the definition of the board layout, obstacles, and connections needed for routing. + +```typescript +export interface SimpleRouteJson { + /** The total number of conductive layers on the PCB. */ + layerCount: number; + + /** The default or minimum width for traces. Specific trace segments might override this if the format evolves, but currently used as a general guideline. Units are implicit (e.g., mm, inches) and must be consistent throughout the file. */ + minTraceWidth: number; + + /** An array of obstacles on the board, such as component pads, mounting holes, or keep-out areas. */ + obstacles: Obstacle[]; + + /** An array defining the electrical connections (nets) that need to be routed. */ + connections: Array; + + /** The bounding box defining the extents of the routing area. */ + bounds: { minX: number; maxX: number; minY: number; maxY: number }; + + /** [Optional] The routing solution provided by an autorouter. This array contains the actual paths of the traces. It is typically absent in the input file given to a router and present in the output file. */ + traces?: SimplifiedPcbTrace[]; +} +``` + +## Top-Level Properties + +### `layerCount` + +* **Type:** `number` +* **Description:** An integer specifying the total number of conductive layers available for routing on the PCB. Layers are typically identified by string names (e.g., `"top"`, `"inner1"`, `"bottom"`) within other parts of the format (like `obstacles` and `connections`). While `layerCount` provides the total number, the specific layer names used must be consistent throughout the file. + +### `minTraceWidth` + +* **Type:** `number` +* **Description:** Specifies the default or minimum trace width to be used by the autorouter. This acts as a global constraint. Future versions or specific router implementations might allow per-net or per-segment width rules, but this provides a baseline. +* **Units:** Units (e.g., millimeters, inches) are not explicitly defined by the format. It is crucial that the same unit system is used consistently for all dimensional values (`minTraceWidth`, `obstacles`, `bounds`, coordinates) within a single SRJ file. Millimeters (mm) are commonly used. + +### `obstacles` + +* **Type:** `Array` +* **Description:** An array containing objects that represent areas on the PCB where routing is either restricted or represents a connection point. Obstacles can be physical component pads, mounting holes, board edges defined as keep-outs, or explicit keep-out zones. + +```typescript +export type Obstacle = { + /** The shape of the obstacle. Currently, only "rect" is standard. Oval shapes might be included in future revisions. */ + type: "rect"; // NOTE: most datasets do not contain ovals + + /** An array of layer names (strings) on which this obstacle exists. An obstacle can span multiple layers (e.g., a plated through-hole pad). */ + layers: string[]; + + /** The center coordinates of the obstacle. */ + center: { x: number; y: number }; + + /** The width of the rectangular obstacle. */ + width: number; + + /** The height of the rectangular obstacle. */ + height: number; + + /** An array of connection names (strings) that this obstacle is part of. If this obstacle is a pad for a net (e.g., "GND", "VCC"), the net name(s) will be listed here. If the array is empty, the obstacle is typically a keep-out area or an unconnected feature. */ + connectedTo: string[]; +}; +``` +* **`type`**: Defines the geometry. Currently `"rect"` is the standard. +* **`layers`**: Specifies which layer(s) the obstacle occupies. Important for multi-layer routing. +* **`center`, `width`, `height`**: Define the geometry and position of the rectangle. Units must be consistent with `minTraceWidth` and `bounds`. +* **`connectedTo`**: This critical field links obstacles (like pads) to the electrical nets defined in the `connections` array. If an obstacle represents a pin for the "VCC" net, `connectedTo` would contain `["VCC"]`. + +### `connections` + +* **Type:** `Array` +* **Description:** Defines the sets of points that need to be electrically connected. Each object in the array represents a single net (e.g., power, ground, signal). + +```typescript +export interface SimpleRouteConnection { + /** The unique name of the connection or net (e.g., "GND", "VCC", "DATA0"). This name is referenced by Obstacle.connectedTo. */ + name: string; + + /** An array of points that must be connected together to form this net. Each point typically corresponds to the center of an obstacle (pad) belonging to this net. */ + pointsToConnect: Array<{ + /** The x-coordinate of the connection point. */ + x: number; + /** The y-coordinate of the connection point. */ + y: number; + /** The layer name (string) on which this connection point resides. */ + layer: string; + }>; +} +``` +* **`name`**: A unique string identifier for the net. This is used to link `Obstacle` objects (pads) to their respective nets. +* **`pointsToConnect`**: An array listing the specific locations (`x`, `y`, `layer`) that the router must connect. These points usually align with the `center` coordinates and `layers` of the corresponding `Obstacle` objects linked via the `name`. + +### `bounds` + +* **Type:** `object` +* **Description:** Defines the rectangular boundary of the area where routing is permitted. Traces should generally not extend beyond these limits. +* **Structure:** + * `minX`: The minimum x-coordinate of the routing area. + * `maxX`: The maximum x-coordinate of the routing area. + * `minY`: The minimum y-coordinate of the routing area. + * `maxY`: The maximum y-coordinate of the routing area. +* **Units:** Must be consistent with other dimensional values in the file. + +### `traces` (Optional) + +* **Type:** `Array` +* **Description:** This array represents the output of an autorouter – the actual geometric paths (traces and vias) that implement the required connections. It is typically **not present** in the input SRJ file given to the router. +* **Presence:** Included in the SRJ file *after* routing has been successfully completed. + +```typescript +export type SimplifiedPcbTrace = { + /** Identifier indicating the object type. Always "pcb_trace". */ + type: "pcb_trace"; + + /** A unique identifier for this specific trace path. */ + pcb_trace_id: string; + + /** [Optional] The name of the connection/net this trace belongs to. Links the solved route back to the SimpleRouteConnection definition. */ + connection_name?: string; + + /** An array defining the geometry of the trace path, composed of wire segments and vias. */ + route: Array< + | { + /** Indicates a straight wire segment on a single layer. */ + route_type: "wire"; + /** The x-coordinate of the *end* point of the wire segment. */ + x: number; + /** The y-coordinate of the *end* point of the wire segment. */ + y: number; + /** The width of this wire segment. */ + width: number; + /** The layer name (string) this wire segment is on. */ + layer: string; + } + | { + /** Indicates a via connecting two layers. */ + route_type: "via"; + /** The x-coordinate of the via's center. */ + x: number; + /** The y-coordinate of the via's center. */ + y: number; + /** The layer name (string) the via transitions *to*. */ + to_layer: string; + /** The layer name (string) the via transitions *from*. */ + from_layer: string; + } + >; +}; +``` +* **`type`**: Always `"pcb_trace"`. +* **`pcb_trace_id`**: Unique ID for the trace. +* **`connection_name`**: Links trace to the net name from `connections`. +* **`route`**: An ordered array describing the path: + * **`wire`**: Represents a straight segment of copper trace. The segment runs from the end point of the previous element in the `route` array (or an initial connection point) to the specified `(x, y)` coordinate on the given `layer` with the specified `width`. + * **`via`**: Represents a vertical connection between layers at `(x, y)`, transitioning from `from_layer` to `to_layer`. Note that physical via characteristics (drill size, annular ring) are not detailed in this simplified format. + +## Example + +```json +{ + "layerCount": 2, + "minTraceWidth": 0.15, + "obstacles": [ + { + "type": "rect", + "layers": ["top"], + "center": { "x": 10, "y": 10 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["VCC"] + }, + { + "type": "rect", + "layers": ["top"], + "center": { "x": 30, "y": 10 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["VCC"] + }, + { + "type": "rect", + "layers": ["bottom"], + "center": { "x": 20, "y": 25 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["GND"] + }, + { + "type": "rect", + "layers": ["bottom"], + "center": { "x": 40, "y": 25 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["GND"] + }, + { + "type": "rect", + "layers": ["top", "bottom"], // Keepout on both layers + "center": { "x": 25, "y": 15 }, + "width": 5, + "height": 3, + "connectedTo": [] // Empty means it's a keepout + } + ], + "connections": [ + { + "name": "VCC", + "pointsToConnect": [ + { "x": 10, "y": 10, "layer": "top" }, + { "x": 30, "y": 10, "layer": "top" } + ] + }, + { + "name": "GND", + "pointsToConnect": [ + { "x": 20, "y": 25, "layer": "bottom" }, + { "x": 40, "y": 25, "layer": "bottom" } + ] + } + ], + "bounds": { + "minX": 0, + "maxX": 50, + "minY": 0, + "maxY": 40 + }, + // --- TRACES SECTION (added by router) --- + "traces": [ + { + "type": "pcb_trace", + "pcb_trace_id": "trace_vcc_1", + "connection_name": "VCC", + "route": [ + { "route_type": "wire", "x": 10, "y": 10, "width": 0.15, "layer": "top" }, // Start implicitly at first point + { "route_type": "wire", "x": 20, "y": 5, "width": 0.15, "layer": "top" }, + { "route_type": "wire", "x": 30, "y": 10, "width": 0.15, "layer": "top" } // End at second point + ] + }, + { + "type": "pcb_trace", + "pcb_trace_id": "trace_gnd_1", + "connection_name": "GND", + "route": [ + { "route_type": "wire", "x": 20, "y": 25, "width": 0.15, "layer": "bottom" }, // Start implicitly at first point + // Example with a via + { "route_type": "wire", "x": 30, "y": 25, "width": 0.15, "layer": "bottom" }, + { "route_type": "via", "x": 30, "y": 25, "from_layer": "bottom", "to_layer": "top" }, + { "route_type": "wire", "x": 30, "y": 20, "width": 0.15, "layer": "top" }, // Segment on top layer + { "route_type": "via", "x": 30, "y": 20, "from_layer": "top", "to_layer": "bottom" }, + { "route_type": "wire", "x": 40, "y": 25, "width": 0.15, "layer": "bottom" } // End at second point + ] + } + ] +} +``` + +## Units and Coordinate System + +The Simple Route JSON format does **not** enforce specific units (e.g., mm, mil, inches) or a coordinate system origin (e.g., top-left, bottom-left). + +* **Consistency is Key:** All dimensional values (`minTraceWidth`, obstacle `width`/`height`, `bounds`, all `x`/`y` coordinates in `obstacles`, `connections`, and `traces`) within a single SRJ file **must** use the same units. +* **Common Practice:** Millimeters (mm) are frequently used. +* **Origin:** The coordinate system origin is typically assumed to be top-left or bottom-left, with X increasing to the right and Y increasing downwards (top-left) or upwards (bottom-left). Consistency within the file and between the SRJ generator and consumer (the autorouter) is essential. + +## Relationship to Other Formats + +* **Circuit JSON:** Simple Route JSON is a simplified derivative of Circuit JSON. Tools can convert Circuit JSON to SRJ by extracting layer stackup information, component pad locations and net assignments, board outlines, and any defined keep-out areas. Information not relevant to routing (e.g., schematic IDs, component values, 3D models) is omitted. +* **Specctra DSN:** SRJ serves a similar purpose to DSN files – describing a routing problem. However, SRJ uses a modern JSON structure, which is often easier to parse and generate in web-based and JavaScript/TypeScript environments compared to the text-based, keyword-driven DSN format. The `dsn-converter` tool ([link](https://github.com/tscircuit/dsn-converter)) can facilitate conversion between DSN and SRJ or similar formats. + +## Usage + +The primary use case for Simple Route JSON is as the input and output format for `tscircuit` autorouting tools. + +1. **Input:** A PCB design tool or conversion script generates an SRJ file describing the board, obstacles, and connections. This file is fed into an autorouter. +2. **Output:** The autorouter processes the input SRJ, computes the trace paths, and outputs a new SRJ file that includes the original data plus the `traces` array detailing the solution. +3. **Post-processing:** The output SRJ (with traces) can then be converted back into a format compatible with PCB design software (like Circuit JSON, KiCad, Eagle, etc.) to integrate the routing solution into the full PCB design. +``````markdown +--- +title: Simple Route JSON +--- + +## Overview + +Simple Route JSON (SRJ) is a lightweight, straightforward format designed to describe a Printed Circuit Board (PCB) routing problem. It serves as a common intermediary representation used by `tscircuit` autorouters, simplifying the complex details often found in full PCB design files. + +The primary goal of SRJ is to provide only the essential information required for a routing algorithm: +1. Where routing is allowed (layers, board boundaries). +2. Where routing is forbidden (obstacles, keep-out areas). +3. What needs to be connected (nets and their associated pins/pads). +4. Basic routing constraints (minimum trace width). + +SRJ can be directly generated from more comprehensive formats like [Circuit JSON](https://circuitjson.com), stripping away details irrelevant to the core routing task (e.g., specific component models, schematic information beyond connectivity). It shares conceptual similarities with the industry-standard [Specctra DSN (Design)](https://github.com/tscircuit/dsn-converter) format, but aims for greater simplicity and modern JSON representation. + +:::info +A formal specification with versioning is planned for the future. To stay updated on its release and other tscircuit developments, please subscribe to [the tscircuit newsletter](https://blog.tscircuit.com/). +::: + +## Format Structure + +A Simple Route JSON file is a single JSON object containing the definition of the board layout, obstacles, and connections needed for routing. + +```typescript +export interface SimpleRouteJson { + /** The total number of conductive layers on the PCB. */ + layerCount: number; + + /** The default or minimum width for traces. Specific trace segments might override this if the format evolves, but currently used as a general guideline. Units are implicit (e.g., mm, inches) and must be consistent throughout the file. */ + minTraceWidth: number; + + /** An array of obstacles on the board, such as component pads, mounting holes, or keep-out areas. */ + obstacles: Obstacle[]; + + /** An array defining the electrical connections (nets) that need to be routed. */ + connections: Array; + + /** The bounding box defining the extents of the routing area. */ + bounds: { minX: number; maxX: number; minY: number; maxY: number }; + + /** [Optional] The routing solution provided by an autorouter. This array contains the actual paths of the traces. It is typically absent in the input file given to a router and present in the output file. */ + traces?: SimplifiedPcbTrace[]; +} +``` + +## Top-Level Properties + +### `layerCount` + +* **Type:** `number` +* **Description:** An integer specifying the total number of conductive layers available for routing on the PCB. Layers are typically identified by string names (e.g., `"top"`, `"inner1"`, `"bottom"`) within other parts of the format (like `obstacles` and `connections`). While `layerCount` provides the total number, the specific layer names used must be consistent throughout the file. + +### `minTraceWidth` + +* **Type:** `number` +* **Description:** Specifies the default or minimum trace width to be used by the autorouter. This acts as a global constraint. Future versions or specific router implementations might allow per-net or per-segment width rules, but this provides a baseline. +* **Units:** Units (e.g., millimeters, inches) are not explicitly defined by the format. It is crucial that the same unit system is used consistently for all dimensional values (`minTraceWidth`, `obstacles`, `bounds`, coordinates) within a single SRJ file. Millimeters (mm) are commonly used. + +### `obstacles` + +* **Type:** `Array` +* **Description:** An array containing objects that represent areas on the PCB where routing is either restricted or represents a connection point. Obstacles can be physical component pads, mounting holes, board edges defined as keep-outs, or explicit keep-out zones. + +```typescript +export type Obstacle = { + /** The shape of the obstacle. Currently, only "rect" is standard. Oval shapes might be included in future revisions. */ + type: "rect"; // NOTE: most datasets do not contain ovals + + /** An array of layer names (strings) on which this obstacle exists. An obstacle can span multiple layers (e.g., a plated through-hole pad). */ + layers: string[]; + + /** The center coordinates of the obstacle. */ + center: { x: number; y: number }; + + /** The width of the rectangular obstacle. */ + width: number; + + /** The height of the rectangular obstacle. */ + height: number; + + /** An array of connection names (strings) that this obstacle is part of. If this obstacle is a pad for a net (e.g., "GND", "VCC"), the net name(s) will be listed here. If the array is empty, the obstacle is typically a keep-out area or an unconnected feature. */ + connectedTo: string[]; +}; +``` +* **`type`**: Defines the geometry. Currently `"rect"` is the standard. +* **`layers`**: Specifies which layer(s) the obstacle occupies. Important for multi-layer routing. +* **`center`, `width`, `height`**: Define the geometry and position of the rectangle. Units must be consistent with `minTraceWidth` and `bounds`. +* **`connectedTo`**: This critical field links obstacles (like pads) to the electrical nets defined in the `connections` array. If an obstacle represents a pin for the "VCC" net, `connectedTo` would contain `["VCC"]`. + +### `connections` + +* **Type:** `Array` +* **Description:** Defines the sets of points that need to be electrically connected. Each object in the array represents a single net (e.g., power, ground, signal). + +```typescript +export interface SimpleRouteConnection { + /** The unique name of the connection or net (e.g., "GND", "VCC", "DATA0"). This name is referenced by Obstacle.connectedTo. */ + name: string; + + /** An array of points that must be connected together to form this net. Each point typically corresponds to the center of an obstacle (pad) belonging to this net. */ + pointsToConnect: Array<{ + /** The x-coordinate of the connection point. */ + x: number; + /** The y-coordinate of the connection point. */ + y: number; + /** The layer name (string) on which this connection point resides. */ + layer: string; + }>; +} +``` +* **`name`**: A unique string identifier for the net. This is used to link `Obstacle` objects (pads) to their respective nets. +* **`pointsToConnect`**: An array listing the specific locations (`x`, `y`, `layer`) that the router must connect. These points usually align with the `center` coordinates and `layers` of the corresponding `Obstacle` objects linked via the `name`. + +### `bounds` + +* **Type:** `object` +* **Description:** Defines the rectangular boundary of the area where routing is permitted. Traces should generally not extend beyond these limits. +* **Structure:** + * `minX`: The minimum x-coordinate of the routing area. + * `maxX`: The maximum x-coordinate of the routing area. + * `minY`: The minimum y-coordinate of the routing area. + * `maxY`: The maximum y-coordinate of the routing area. +* **Units:** Must be consistent with other dimensional values in the file. + +### `traces` (Optional) + +* **Type:** `Array` +* **Description:** This array represents the output of an autorouter – the actual geometric paths (traces and vias) that implement the required connections. It is typically **not present** in the input SRJ file given to the router. +* **Presence:** Included in the SRJ file *after* routing has been successfully completed. + +```typescript +export type SimplifiedPcbTrace = { + /** Identifier indicating the object type. Always "pcb_trace". */ + type: "pcb_trace"; + + /** A unique identifier for this specific trace path. */ + pcb_trace_id: string; + + /** [Optional] The name of the connection/net this trace belongs to. Links the solved route back to the SimpleRouteConnection definition. */ + connection_name?: string; + + /** An array defining the geometry of the trace path, composed of wire segments and vias. */ + route: Array< + | { + /** Indicates a straight wire segment on a single layer. */ + route_type: "wire"; + /** The x-coordinate of the *end* point of the wire segment. */ + x: number; + /** The y-coordinate of the *end* point of the wire segment. */ + y: number; + /** The width of this wire segment. */ + width: number; + /** The layer name (string) this wire segment is on. */ + layer: string; + } + | { + /** Indicates a via connecting two layers. */ + route_type: "via"; + /** The x-coordinate of the via's center. */ + x: number; + /** The y-coordinate of the via's center. */ + y: number; + /** The layer name (string) the via transitions *to*. */ + to_layer: string; + /** The layer name (string) the via transitions *from*. */ + from_layer: string; + } + >; +}; +``` +* **`type`**: Always `"pcb_trace"`. +* **`pcb_trace_id`**: Unique ID for the trace. +* **`connection_name`**: Links trace to the net name from `connections`. +* **`route`**: An ordered array describing the path: + * **`wire`**: Represents a straight segment of copper trace. The segment runs from the end point of the previous element in the `route` array (or an initial connection point) to the specified `(x, y)` coordinate on the given `layer` with the specified `width`. + * **`via`**: Represents a vertical connection between layers at `(x, y)`, transitioning from `from_layer` to `to_layer`. Note that physical via characteristics (drill size, annular ring) are not detailed in this simplified format. + +## Example + +```json +{ + "layerCount": 2, + "minTraceWidth": 0.15, + "obstacles": [ + { + "type": "rect", + "layers": ["top"], + "center": { "x": 10, "y": 10 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["VCC"] + }, + { + "type": "rect", + "layers": ["top"], + "center": { "x": 30, "y": 10 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["VCC"] + }, + { + "type": "rect", + "layers": ["bottom"], + "center": { "x": 20, "y": 25 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["GND"] + }, + { + "type": "rect", + "layers": ["bottom"], + "center": { "x": 40, "y": 25 }, + "width": 1.2, + "height": 1.2, + "connectedTo": ["GND"] + }, + { + "type": "rect", + "layers": ["top", "bottom"], // Keepout on both layers + "center": { "x": 25, "y": 15 }, + "width": 5, + "height": 3, + "connectedTo": [] // Empty means it's a keepout + } + ], + "connections": [ + { + "name": "VCC", + "pointsToConnect": [ + { "x": 10, "y": 10, "layer": "top" }, + { "x": 30, "y": 10, "layer": "top" } + ] + }, + { + "name": "GND", + "pointsToConnect": [ + { "x": 20, "y": 25, "layer": "bottom" }, + { "x": 40, "y": 25, "layer": "bottom" } + ] + } + ], + "bounds": { + "minX": 0, + "maxX": 50, + "minY": 0, + "maxY": 40 + }, + // --- TRACES SECTION (added by router) --- + "traces": [ + { + "type": "pcb_trace", + "pcb_trace_id": "trace_vcc_1", + "connection_name": "VCC", + "route": [ + { "route_type": "wire", "x": 10, "y": 10, "width": 0.15, "layer": "top" }, // Start implicitly at first point + { "route_type": "wire", "x": 20, "y": 5, "width": 0.15, "layer": "top" }, + { "route_type": "wire", "x": 30, "y": 10, "width": 0.15, "layer": "top" } // End at second point + ] + }, + { + "type": "pcb_trace", + "pcb_trace_id": "trace_gnd_1", + "connection_name": "GND", + "route": [ + { "route_type": "wire", "x": 20, "y": 25, "width": 0.15, "layer": "bottom" }, // Start implicitly at first point + // Example with a via + { "route_type": "wire", "x": 30, "y": 25, "width": 0.15, "layer": "bottom" }, + { "route_type": "via", "x": 30, "y": 25, "from_layer": "bottom", "to_layer": "top" }, + { "route_type": "wire", "x": 30, "y": 20, "width": 0.15, "layer": "top" }, // Segment on top layer + { "route_type": "via", "x": 30, "y": 20, "from_layer": "top", "to_layer": "bottom" }, + { "route_type": "wire", "x": 40, "y": 25, "width": 0.15, "layer": "bottom" } // End at second point + ] + } + ] +} +``` + +## Units and Coordinate System + +The Simple Route JSON format does **not** enforce specific units (e.g., mm, mil, inches) or a coordinate system origin (e.g., top-left, bottom-left). + +* **Consistency is Key:** All dimensional values (`minTraceWidth`, obstacle `width`/`height`, `bounds`, all `x`/`y` coordinates in `obstacles`, `connections`, and `traces`) within a single SRJ file **must** use the same units. +* **Common Practice:** Millimeters (mm) are frequently used. +* **Origin:** The coordinate system origin is typically assumed to be top-left or bottom-left, with X increasing to the right and Y increasing downwards (top-left) or upwards (bottom-left). Consistency within the file and between the SRJ generator and consumer (the autorouter) is essential. + +## Relationship to Other Formats + +* **Circuit JSON:** Simple Route JSON is a simplified derivative of Circuit JSON. Tools can convert Circuit JSON to SRJ by extracting layer stackup information, component pad locations and net assignments, board outlines, and any defined keep-out areas. Information not relevant to routing (e.g., schematic IDs, component values, 3D models) is omitted. +* **Specctra DSN:** SRJ serves a similar purpose to DSN files – describing a routing problem. However, SRJ uses a modern JSON structure, which is often easier to parse and generate in web-based and JavaScript/TypeScript environments compared to the text-based, keyword-driven DSN format. The `dsn-converter` tool ([link](https://github.com/tscircuit/dsn-converter)) can facilitate conversion between DSN and SRJ or similar formats. + +## Usage + +The primary use case for Simple Route JSON is as the input and output format for `tscircuit` autorouting tools. + +1. **Input:** A PCB design tool or conversion script generates an SRJ file describing the board, obstacles, and connections. This file is fed into an autorouter. +2. **Output:** The autorouter processes the input SRJ, computes the trace paths, and outputs a new SRJ file that includes the original data plus the `traces` array detailing the solution. +3. **Post-processing:** The output SRJ (with traces) can then be converted back into a format compatible with PCB design software (like Circuit JSON, KiCad, Eagle, etc.) to integrate the routing solution into the full PCB design. +``` diff --git a/docs/advanced/units.md b/docs/advanced/units.md index c867590a..f506091c 100644 --- a/docs/advanced/units.md +++ b/docs/advanced/units.md @@ -1,10 +1,11 @@ --- title: tscircuit Units +description: Understanding default units in tscircuit for length, electrical properties, and other measurements. --- In tscircuit you can specify a unit explicitly with a string e.g. "0.1mm", but you can also also specify numbers without units and the unit will be inferred -from [platform](../guides/platform-configuration.md), [board configuration](../elements/board.mdx), [subcircuit configuration](../elements/subcircuit.mdx) +from [platform](../guides/running-tscircuit/platform-configuration.md), [board configuration](../elements/board.mdx), [subcircuit configuration](../elements/subcircuit.mdx) or the defaults below ## Default Units diff --git a/docs/building-electronics/designing-electronics-from-scratch.md b/docs/building-electronics/designing-electronics-from-scratch.md index e5bfad10..15ad19c3 100644 --- a/docs/building-electronics/designing-electronics-from-scratch.md +++ b/docs/building-electronics/designing-electronics-from-scratch.md @@ -1,6 +1,7 @@ --- title: Designing Electronics from Scratch sidebar_position: 2 +description: A comprehensive guide to electronics design workflow - from requirements analysis through system diagramming, schematic capture, PCB layout, to final manufacturing --- ## Overview @@ -72,7 +73,7 @@ In this phase we create a layout of the circuit on a PCB. tscircuit automatically autoroutes the circuit for you, but you may still need to "drag'n'drop" components in the PCB viewer to the locations you want them to -be in. Use [manual editing](../guides/manual-edits.mdx) to drag'n'drop +be in. Use [manual editing](../guides/tscircuit-essentials/manual-edits.mdx) to drag'n'drop components on the PCB. ## Ordering @@ -84,3 +85,5 @@ and "dragging and dropping" them into a manufacturer's website. Sometimes you'll want to assemble the PCB yourself (or sometimes just a single component that your manufacturer doesn't have!). In this case, you'll need a lab setup to facilitate soldering. + +Check out our guide on [Ordering Prototypes](./ordering-prototypes.mdx) to learn more. diff --git a/docs/building-electronics/ordering-prototypes.md b/docs/building-electronics/ordering-prototypes.md deleted file mode 100644 index 90635f9a..00000000 --- a/docs/building-electronics/ordering-prototypes.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Ordering Prototypes -sidebar_position: 4 ---- - -## Overview - -After [you've designed your device](./designing-electronics-from-scratch.md), -you can use [fabrication files](../guides/understanding-fabrication-files.md) -to get your device fully assembled. - -
- -
Many fabricators allow you to directly drop fabrication files on their website!
-
diff --git a/docs/building-electronics/ordering-prototypes.mdx b/docs/building-electronics/ordering-prototypes.mdx new file mode 100644 index 00000000..f653df98 --- /dev/null +++ b/docs/building-electronics/ordering-prototypes.mdx @@ -0,0 +1,107 @@ +--- +title: Ordering Prototypes +sidebar_position: 4 +description: After you've designed your device, you can use fabrication files to get your device fully assembled. The two most popular services for ordering prototypes are JLCPCB and PCBWay. +--- + +## Overview + +After [you've designed your device](./designing-electronics-from-scratch.md), +you can use [fabrication files](../guides/understanding-fabrication-files.md) +to get your device fully assembled. + +The two most popular services for +ordering prototypes are [JLCPCB](https://jlcpcb.com) and [PCBWay](https://pcbway.com). + +## Ordering Through tscircuit Platform + +The easiest way to order your prototypes is through the tscircuit platform, which handles the entire ordering process for you. + +### Ordering Steps + +Here's how the ordering process works: + +### 1. Get Order Quotes + +Navigate to the view packages page where you'll find the order button for your circuit. + +
+ +
The order button is present on your project's view packages page
+
+ +### 2. Select Your Vendor and Quote + +When you click the order button, a dialog will appear showing quotes from different vendors. Currently, JLCPCB is the only available vendor, with more vendors coming soon. Compare the prices, lead times, and shipping options, then select your preferred vendor and click continue. + +
+ +
Compare quotes from multiple vendors and select the best option for your needs
+
+ +### 3. Complete Your Order + +Finally, you'll be redirected to a secure Stripe checkout page where you can enter your payment details and shipping address. Your PCB will be delivered directly to your specified address. + +
+ +
Secure checkout with Stripe handles payment and shipping details
+
+ +## Uploading [Fabrication Files](../guides/understanding-fabrication-files.md) + +Most fabrication or turn-key assembly services allow you to directly upload 3 types of files: + +- Gerbers +- Bill of Materials (BOM CSV) +- Pick'n'Place File (CSV) + +These files are all available inside your [Fabrication Files zip file](../guides/understanding-fabrication-files.md) when +you export from tscircuit. + +
+ +
Many fabricators allow you to directly drop fabrication files on their website!
+
+ +## Assembling your own boards + +It can sometimes be easier to assemble your own boards, this gives you more +control over your inventory and can lower the cost of your prototypes since +assembly services often have a minimum order quantity. + +Even if you're assembling your own board, you should still order your PCB +from a fabrication service. PCBs require a chemical etching process to do +at home and it's rarely worth the hassle to do it yourself. + +When you're assembling your own board, you can create a printout of your +Assembly View to make it easier to place components. In an assembly view, +the "pin1" location is marked with a small triangle indicator. This can help you verify +the orientation of each component as you place it. + +
+ +
+ +## Controlling Part Selection + +Before placing your order, there are two important component properties that affect the ordering process. The `supplierPartNumbers` prop allows you to specify exact part numbers from suppliers, helping to ensure the correct components are selected during ordering. This is particularly useful for specific or critical components. + +```tsx + +``` + +## Do Not Place Components + +Components with the `doNotPlace` prop set to `true` will not be included in the parts selection for ordering. This is useful for components that you plan to solder manually or that are not available through the supplier. + +```tsx + +``` diff --git a/docs/building-electronics/what-are-electronics-made-of.mdx b/docs/building-electronics/what-are-electronics-made-of.mdx index d273ba87..9cf25758 100644 --- a/docs/building-electronics/what-are-electronics-made-of.mdx +++ b/docs/building-electronics/what-are-electronics-made-of.mdx @@ -1,6 +1,10 @@ --- title: What are electronics made of? sidebar_position: 1 +description: >- + In this tutorial, we're going to be talking about the different elements that + make up a Printed Circuit Board (PCB). For each element, we'll show different + ways that the element can be represented in tscircuit. --- import CircuitPreview from "@site/src/components/CircuitPreview" @@ -54,10 +58,11 @@ the top layer can pass to the bottom.
Vias connect different layers of a PCB
- ( + ( outerDiameter="0.6mm" /> + ) `} /> @@ -79,18 +85,20 @@ holes. Chips with big pins that must go through holes are called "through-hole" chips, and chips with small pins are called "surface-mount" chips. - ( - - - + + + + + ) `} /> @@ -101,12 +109,14 @@ Unplated holes or "regular holes" are just holes in the printed circuit board without any copper around them. They don't electrically connect anything, but can be very helpful for mounting the printed circuit board. - ( - - - + + + + + ) `} /> diff --git a/docs/command-line/tsci-add.mdx b/docs/command-line/tsci-add.mdx index b49f7db6..3914e862 100644 --- a/docs/command-line/tsci-add.mdx +++ b/docs/command-line/tsci-add.mdx @@ -1,5 +1,6 @@ --- title: tsci add +description: Install tscircuit registry packages using the tsci add command --- `tsci add` is the same as `npm add` or `bun add`, but defaults to the tscircuit @@ -27,4 +28,4 @@ export default () => ( ) `} -/> \ No newline at end of file +/> diff --git a/docs/command-line/tsci-auth-print-token.md b/docs/command-line/tsci-auth-print-token.md new file mode 100644 index 00000000..5f6fcc74 --- /dev/null +++ b/docs/command-line/tsci-auth-print-token.md @@ -0,0 +1,14 @@ +--- +title: tsci auth print-token +description: Print your current tscircuit API token for use with web services +--- + +`tsci auth print-token` prints your current tscircuit API token. This token can be used with the advanced web APIs such as the [Datasheet API](../web-apis/datasheet-api.md). + +## Usage + +```bash +tsci auth print-token +``` + +Make sure you have previously logged in with [`tsci login`](./tsci-login.md). The command will output a token string that you can pass in the `Authorization: Bearer ` header of API requests. diff --git a/docs/command-line/tsci-build.md b/docs/command-line/tsci-build.md new file mode 100644 index 00000000..7b70117f --- /dev/null +++ b/docs/command-line/tsci-build.md @@ -0,0 +1,191 @@ +--- +title: tsci build +description: Generate circuit JSON from your source files +--- + +`tsci build` runs the TSCircuit evaluator and writes `circuit.json` files. + +## Usage + +```bash +tsci build [file] [options] +``` + +### Arguments +- `file` *(optional)* – path to a source file or directory. If omitted, the command searches for a project entrypoint such as `index.tsx` or the `mainEntrypoint` defined in `tscircuit.config.json`. In addition, all files matching the `*.circuit.tsx` pattern are built automatically. + +### Output +Output files are placed in a `dist/` directory relative to your project. Each successful build writes to its own output directory: + +- `dist//circuit.json` +- `dist//pcb.svg` +- `dist//schematic.svg` +- `dist//3d.png` + +For example, `src/blink.circuit.tsx` becomes `dist/src/blink/circuit.json`. + +### Options + +#### Error Handling +- `--ignore-errors` – do not exit with code `1` on evaluation errors. +- `--ignore-warnings` – suppress warning messages. +- `--ignore-netlist-drc` – ignore netlist DRC errors and warnings. +- `--ignore-pin-specification-drc` – ignore pin-specification DRC errors and warnings. +- `--ignore-placement-drc` – ignore placement DRC errors and warnings. +- `--ignore-routing-drc` – ignore routing DRC errors and warnings. +- `--ignore-config` – ignore options from `tscircuit.config.json`. + +#### Build Control +- `--ci` – run install and optional prebuild/build commands (or default CI build). +- `--disable-pcb` – disable PCB outputs. +- `--routing-disabled` – disable routing during circuit generation. +- `--disable-parts-engine` – disable the parts engine. +- `--concurrency ` – number of files to build in parallel (default: 1). + +#### Output Formats + +##### Images & 3D Models +- `--preview-images` – generate images for one selected build output. +- `--all-images` – generate images for every successful build output. +- `--pngs` – generate PNG outputs during build generation. +- `--pcb-png` – generate PCB PNG outputs during build generation. +- `--svgs` – generate both `pcb.svg` and `schematic.svg`. +- `--pcb-svgs` – generate only `pcb.svg`. +- `--schematic-svgs` – generate only `schematic.svg`. +- `--3d-png` – generate `3d.png`. +- `--3d` – alias for `--3d-png`. +- `--pcb-only` – generate only `pcb.svg` from the selected SVG outputs. +- `--schematic-only` – generate only `schematic.svg` from the selected SVG outputs. +- `--preview-gltf` – generate a GLTF file from the preview entrypoint. +- `--glbs` – generate GLB 3D model files for every successful build output. +- `--show-courtyards` – show courtyard outlines in PCB SVG outputs. + +##### KiCad Export +- `--kicad-project` – generate KiCad project directories (`.kicad_sch`, `.kicad_pcb`, `.kicad_pro`) for each successful build output. +- `--kicad-project-zip` – generate a zipped KiCad project for each successful build output. +- `--kicad-library` – generate KiCad symbol/footprint library in `dist/kicad-library`. +- `--kicad-library-name ` – specify the name of the KiCad library. +- `--kicad-pcm` – generate KiCad PCM (Plugin and Content Manager) assets in `dist/pcm`. + +##### Diagnostics +- `--profile` – log per-circuit `circuit.json` generation time during build. + +##### Library & Site Generation +- `--transpile` – transpile the entry file to JavaScript for use as a library. +- `--site` – generate a static site in the dist directory. +- `--use-cdn-javascript` – use CDN-hosted JavaScript instead of bundled standalone file for `--site`. + +##### Injecting Props +- `--inject-props ` – inject JSON props into the built file's default export. +- `--inject-props-file ` – load injected props JSON from a file. + +### Targeting specific sources +- `tsci build path/to/file.circuit.tsx` – builds the given file, even if it does not match the `includeBoardFiles` glob in `tscircuit.config.json`. +- `tsci build path/to/directory` – scans only the files inside `path/to/directory` that both satisfy the `includeBoardFiles` glob and reside within the directory. Files outside the directory or filtered out by the glob are skipped. + +Use this command before publishing or in CI to ensure your circuits evaluate correctly. + +## Image generation behavior + +`--preview-images` and `--all-images` choose which build outputs receive images: + +- `--preview-images` writes image files for one selected build. +- `--all-images` writes image files for every successful build. + +The image selection flags choose which files are written for each selected build: + +- If you do not pass any image selection flags, the default image set is `pcb.svg`, `schematic.svg`, and `3d.png`. +- If you pass any image selection flags, those flags explicitly control which files are written. +- `--pcb-only` and `--schematic-only` filter SVG outputs. +- `--3d` can be combined with the newer flags and adds `3d.png`. +- Use the image selection flags with either `--preview-images` or `--all-images`. + +Preview target selection uses this precedence: + +1. `previewComponentPath` +2. `mainEntrypoint` +3. The first successful build + +## Output Directory Structure + +When using various build options, the output structure looks like: + +```text +dist/ +├── my-circuit/ +│ ├── circuit.json # Always generated for that build output +│ ├── pcb.svg # With --preview-images/--all-images, --svgs, --pcb-svgs, etc. +│ ├── schematic.svg # With --preview-images/--all-images, --svgs, --schematic-svgs, etc +│ ├── 3d.png # With --preview-images/--all-images, --pngs, or --3d +│ ├── 3d.glb # With --glbs +│ └── kicad/ +│ ├── my-circuit.kicad_sch # With --kicad-project +│ ├── my-circuit.kicad_pcb # With --kicad-project +│ └── my-circuit.kicad_pro # With --kicad-project +├── my-circuit.gltf # With --preview-gltf (preview entrypoint only) +├── kicad-library/ # With --kicad-library +├── pcm/ # With --kicad-pcm +├── index.html # With --site +├── standalone.min.js # With --site (unless --use-cdn-javascript) +├── index.js # With --transpile +├── index.cjs # With --transpile +└── index.d.ts # With --transpile +``` + +## Transpiling circuit entrypoints + +Pass the `--transpile` flag when you want your codebase to be a reusable module that can be imported into other projects. Your "entrypoint", usually `lib/index.tsx` will be the source for the bundle. Export any circuits you'd like out of that file + +- `dist//index.js` – an ESM bundle +- `dist/.cjs` – a CommonJS bundle +- `dist/.d.ts` – generated type declarations that reflect the JSX surface of your entry file + +### Example project + +Spin up a scratch directory with `tsci init` to reproduce the transpile flow locally: + +```bash +mkdir tsci-transpile-demo +cd tsci-transpile-demo +tsci init +``` + +Replace the generated `index.tsx` with a tiny RC circuit: + +```tsx title="index.tsx" +import React from "react" + +export default () => ( + + + + + +) +``` + +Then run the transpile build: + +```bash +tsci build --transpile +``` + +The build writes `dist/index/circuit.json` as usual, then finishes by bundling the entrypoint and printing the paths to the emitted ESM, CJS, and type declaration artifacts. + + +```text +dist +├── index +│ └── circuit.json +├── index.cjs +├── index.d.ts +└── index.js + +2 directories, 4 files +``` diff --git a/docs/command-line/tsci-check.md b/docs/command-line/tsci-check.md new file mode 100644 index 00000000..159afd7c --- /dev/null +++ b/docs/command-line/tsci-check.md @@ -0,0 +1,46 @@ +--- +title: tsci check +description: Partially build and validate circuit artifacts +--- + +`tsci check` partially builds your circuit and validates specific aspects of the output. It is useful for catching issues early without running a full build. + +## Usage + +```bash +tsci check [options] +``` + +## Subcommands + +### `tsci check netlist` + +Partially build and validate the netlist. + +```bash +tsci check netlist [refdeses] +``` + +- `refdeses` *(optional)* – reference designators to scope the check (e.g. `R1 C1`) + +### `tsci check placement` + +Partially build and validate component placement. + +```bash +tsci check placement [refdeses] +``` + +- `refdeses` *(optional)* – reference designators to scope the check + +### `tsci check routing` + +Partially build and validate the routing. + +```bash +tsci check routing +``` + +:::note +These subcommands are currently under development and may not be fully implemented yet. +::: diff --git a/docs/command-line/tsci-clone.md b/docs/command-line/tsci-clone.md new file mode 100644 index 00000000..6f395136 --- /dev/null +++ b/docs/command-line/tsci-clone.md @@ -0,0 +1,53 @@ +--- +title: tsci clone +description: Clone a package from the tscircuit registry to your local machine +--- + +`tsci clone` downloads a package from the [tscircuit registry](https://tscircuit.com/trending) into a local directory so you can inspect, modify, or build on top of it. + +## Usage + +```bash +tsci clone [package] [options] +``` + +### Arguments +- `package` – package identifier in one of these forms: + - `author/packageName` + - `@tsci/author.packageName` + - `https://tscircuit.com/author/packageName` + +### Options +- `-a, --include-author` – include the author name in the directory path (creates `author.packageName/` instead of `packageName/`) +- `--bug-report ` – clone a bug report project instead of a regular package + +## Examples + +Clone a package by name: +```bash +tsci clone seveibar/PICO_W +``` + +Clone using a URL: +```bash +tsci clone https://tscircuit.com/seveibar/PICO_W +``` + +Clone with the author prefix in the directory name: +```bash +tsci clone seveibar/PICO_W --include-author +# Creates seveibar.PICO_W/ +``` + +Clone a bug report: +```bash +tsci clone --bug-report abc123 +``` + +## Configuration + +You can set the `alwaysCloneWithAuthorName` config key to always include the author name without passing `-a`: + +```bash +tsci config set alwaysCloneWithAuthorName true +``` diff --git a/docs/command-line/tsci-config.md b/docs/command-line/tsci-config.md new file mode 100644 index 00000000..8a3a19be --- /dev/null +++ b/docs/command-line/tsci-config.md @@ -0,0 +1,56 @@ +--- +title: tsci config +description: Manage tscircuit CLI configuration +--- + +`tsci config` lets you view and modify tscircuit CLI configuration values. There are two types of configuration: **global** CLI settings and **project-specific** settings stored in `tscircuit.config.json`. + +## Subcommands + +### `tsci config print` + +Print the current global CLI configuration as JSON. + +```bash +tsci config print +``` + +### `tsci config set` + +Set a configuration value. + +```bash +tsci config set +``` + +#### Global Configuration Keys + +| Key | Type | Description | +|-----|------|-------------| +| `alwaysCloneWithAuthorName` | boolean | Always include author name when cloning packages | + +#### Project Configuration Keys + +These keys are saved to `tscircuit.config.json` in your project directory: + +| Key | Description | +|-----|-------------| +| `mainEntrypoint` | Path to the main circuit entrypoint file | +| `kicadLibraryEntrypointPath` | Path to the KiCad library entrypoint | +| `previewComponentPath` | Path to the preview component | +| `siteDefaultComponentPath` | Default component for static site generation | +| `prebuildCommand` | Command to run before building | +| `buildCommand` | Custom build command | + +## Examples + +```bash +# Always include author in clone directory names +tsci config set alwaysCloneWithAuthorName true + +# Set the project entrypoint +tsci config set mainEntrypoint lib/index.tsx + +# View current config +tsci config print +``` diff --git a/docs/command-line/tsci-convert.md b/docs/command-line/tsci-convert.md new file mode 100644 index 00000000..d3e2fb2f --- /dev/null +++ b/docs/command-line/tsci-convert.md @@ -0,0 +1,32 @@ +--- +title: tsci convert +description: Convert a KiCad footprint file to a tscircuit component +--- + +`tsci convert` takes a `.kicad_mod` footprint file and converts it into a tscircuit TSX component, making it easy to reuse existing KiCad footprints in your tscircuit projects. + +## Usage + +```bash +tsci convert [options] +``` + +### Arguments +- `file` *(required)* – path to the `.kicad_mod` file + +### Options +- `-o, --output ` – output TSX file path (defaults to the same directory as the input file) +- `-n, --name ` – component name for the export (defaults to the input filename without extension) + +## Examples + +Convert a footprint using defaults: +```bash +tsci convert MyFootprint.kicad_mod +# Creates MyFootprint.tsx in the same directory +``` + +Convert with a custom component name and output path: +```bash +tsci convert MyFootprint.kicad_mod --name CustomPad --output src/components/CustomPad.tsx +``` diff --git a/docs/command-line/tsci-dev.md b/docs/command-line/tsci-dev.md index 78b68a1a..e59cfeb2 100644 --- a/docs/command-line/tsci-dev.md +++ b/docs/command-line/tsci-dev.md @@ -1,14 +1,67 @@ --- title: tsci dev +description: Run a local preview server for your tscircuit project sidebar_position: 2 --- `tsci dev` runs a web server that lets you see a preview of your electronics in your web browser. +## Usage + +```bash +tsci dev [file] [options] +``` + +### Arguments +- `file` *(optional)* – path to a package file or directory + +### Options +- `-p, --port ` – port to run the server on (default: `3020`) +- `--kicad-pcm` – enable KiCad PCM proxy server at `/pcm/*` + After you run `tsci dev` you should see a preview of your entrypoint file in -your web browser on https://localhost:3020 +your web browser on http://localhost:3020 ![tsci dev result](../../static/img/tsci-dev.png) ![browser](../../static/img/pcb-runframe.png) + +## KiCad PCM Server + +The `--kicad-pcm` flag starts a KiCad Plugin and Content Manager (PCM) server in +the background alongside the development server. This allows you to install your +tscircuit components directly into KiCad as a library. + +```bash +tsci dev --kicad-pcm +``` + +Example output: + +``` +➜ library tsci dev --kicad-pcm + @tscircuit/cli@0.1.851 ready in 1067ms + + ➜ Local: http://localhost:3023/#file=lib%2Findex.ts + +Watching "my-project" for changes... + + ➜ Auto-updating KiCad PCM Server: http://localhost:3023/pcm/repository.json +``` + +### Adding the PCM Repository to KiCad + +To use your tscircuit components in KiCad: + +1. Open KiCad and go to **Plugin and Content Manager** +2. Click **Manage Repositories** +3. Click the **Add** button (plus icon) +4. Enter the PCM URL shown in your terminal (e.g., `http://localhost:3023/pcm/repository.json`) +5. Click **OK** to save + +![Adding the PCM repository URL in KiCad](../../static/img/kicad_pcm.png) + +Once added, your tscircuit library will appear in KiCad's Plugin and Content +Manager. The library automatically updates as you make changes to your tscircuit +project, so you can iterate on your designs without needing to re-export. diff --git a/docs/command-line/tsci-doctor.md b/docs/command-line/tsci-doctor.md new file mode 100644 index 00000000..38b45d87 --- /dev/null +++ b/docs/command-line/tsci-doctor.md @@ -0,0 +1,14 @@ +--- +title: tsci doctor +description: Run diagnostic checks for your tscircuit setup +--- + +`tsci doctor` runs a series of diagnostic checks to verify that your local tscircuit development environment is set up correctly. Use it to troubleshoot issues with your configuration, dependencies, or authentication. + +## Usage + +```bash +tsci doctor +``` + +The command will print the status of each check and highlight any problems it finds. diff --git a/docs/command-line/tsci-export.md b/docs/command-line/tsci-export.md index 27907878..38382203 100644 --- a/docs/command-line/tsci-export.md +++ b/docs/command-line/tsci-export.md @@ -1,9 +1,129 @@ --- title: tsci export +description: Export tscircuit files to various formats including SVG schematics, PCB layouts, and fabrication files. --- +import ImageWithCaption from "../../src/components/ImageWithCaption" + ## Overview `tsci export` can be used to convert a `tsx` file or `circuit.json` file into -schematic PDFs, fabrication files, gerbers, pick'n'place files, netlists and -many more formats. +various output formats including schematics, PCB layouts, fabrication files, and more. + + + +## Usage + +```bash +tsci export [options] +``` + +### Arguments +- ``: Path to the source file (`.tsx` or `.circuit.json`) + +### Options +- `-f, --format `: Output format (defaults to "json") +- `-o, --output `: Custom output file path +- `--disable-parts-engine`: Disable the parts engine during circuit evaluation +- `--show-courtyards`: Show courtyard outlines in PCB SVG output + +## Supported Formats + +The following export formats are supported: + +| Format | Description | +|--------|-------------| +| `json` | Circuit JSON format (alias for `circuit-json`) | +| `circuit-json`| Circuit JSON format | +| `schematic-svg` | Schematic view as SVG | +| `pcb-svg` | PCB layout as SVG | +| `assembly-svg` | Assembly view as SVG | +| `gerbers` | Gerber fabrication files (zipped) | +| `readable-netlist` | Human-readable netlist | +| `specctra-dsn` | Specctra DSN format for autorouting | +| `gltf` | Text-based 3D scene (glTF 2.0) that references board meshes and textures | +| `glb` | Binary glTF bundle that packs geometry, materials, and textures into a single file | +| `step` | STEP 3D model (ISO-10303-21) for high-fidelity CAD integration | +| `kicad_sch` | KiCad schematic file | +| `kicad_pcb` | KiCad PCB layout file | +| `kicad_zip` | Zipped KiCad project (schematic + PCB) | +| `kicad-library` | KiCad library with symbols, footprints, and 3D models (see [Exporting KiCad Library](../guides/kicad/exporting-kicad-library.md)) | +| `spice` | SPICE netlist with simulation results exported as `.spice.cir` and `.csv` | + +## Examples + +Export to circuit JSON: +```bash +tsci export circuit.tsx +``` + +Export as schematic SVG: +```bash +tsci export circuit.tsx -f schematic-svg +``` + +Export as assembly SVG: + +```bash +tsci export circuit.tsx -f assembly-svg +``` + +Export PCB layout with custom output path: +```bash +tsci export circuit.tsx -f pcb-svg -o my-pcb-layout.svg +``` + +Export PCB SVG with courtyard outlines: + +```bash +tsci export circuit.tsx -f pcb-svg --show-courtyards +``` + +Export to Specctra DSN format: +```bash +tsci export circuit.tsx -f specctra-dsn +``` + +## Exporting 3D models + +Use the `gltf`, `glb`, or `step` formats when you want a 3D representation of your board for use in CAD tools, AR viewers, or when embedding on the web. + +### Export as glTF + +```bash +tsci export circuit.tsx --format gltf +``` + +This produces a `.gltf` file (plus any referenced texture files) that follows the [glTF 2.0](https://www.khronos.org/gltf/) spec. Because the assets stay separate, glTF exports are easier to diff in git and you can selectively optimize textures. + +### Export as GLB + +```bash +tsci export circuit.tsx --format glb +``` + +The `glb` format wraps the same data into a single binary so you can upload one file to a web viewer (for example, https://gltf.report/ or `model-viewer`). This is handy for sharing previews or attaching a lightweight CAD model to a manufacturing request. + +Both commands work with `.tsx` source files as well as `.circuit.json` files, so you can export whichever representation you already have. Each command writes the 3D model next to the input file unless you override the location with `--output `. + +### Export as STEP + +```bash +tsci export circuit.tsx --format step +``` + +This produces a `.step` file that can be imported into most mechanical CAD tools. + +## Output Files + +By default, the exported file will be saved in the same directory as the input file, with a filename based on the input filename and the chosen format. For example: + +- Input: `my-circuit.tsx` +- Format: `pcb-svg` +- Default output: `my-circuit-pcb.svg` + +You can override the output location using the `-o` or `--output` option. diff --git a/docs/command-line/tsci-import.md b/docs/command-line/tsci-import.md new file mode 100644 index 00000000..b6539098 --- /dev/null +++ b/docs/command-line/tsci-import.md @@ -0,0 +1,69 @@ +--- +title: tsci import +description: Search JLCPCB or the tscircuit registry and import a component into your project +--- + +`tsci import` searches for components across JLCPCB and the tscircuit registry, then lets you interactively select and install one into your project. It is a convenient way to discover and add parts without leaving the terminal. + +## Usage + +```bash +tsci import [options] +``` + +### Arguments +- `query` *(required)* – chip name, part number, or package name to search for + +### Options +- `--jlcpcb` – search JLCPCB components only +- `--lcsc` – alias for `--jlcpcb` +- `--tscircuit` – search tscircuit registry packages only +- `--download` – download JLCPCB 3D model assets (`.obj` and `.step` files) and reference them locally in the component + +When no filter options are provided, both JLCPCB and the tscircuit registry are searched. + +## Examples + +Search everywhere and pick a component interactively: +```bash +$ tsci import "ESP32-S3" +✔ Select a part to import › seveibar/esp32-s3-mini-1-n8 - Generated from JLCPCB part number C2913206 +⠋ Installing seveibar/esp32-s3-mini-1-n8...Adding @tsci/seveibar.esp32-s3-mini-1-n8... +> bun add @tsci/seveibar.esp32-s3-mini-1-n8 +bun add v1.3.3 (274e01c7) + +installed @tsci/seveibar.esp32-s3-mini-1-n8@0.1.0 + +1 package installed [1.91s] +✓ Added @tsci/seveibar.esp32-s3-mini-1-n8 successfully +✔ Installed seveibar/esp32-s3-mini-1-n8 +``` + +Search only JLCPCB: +```bash +$ tsci import "C16040" --jlcpcb +✔ Imported /home/rushabh/testing/imports/MCP4822_E_SN.tsx +``` + +Download 3D model assets (.obj and .step) alongside the component: +```bash +$ tsci import "C2934569" --jlcpcb --download +✔ Imported imports/ESP32_C3_MINI_1_H4/ESP32_C3_MINI_1_H4.tsx +``` + +Search only the tscircuit registry: +```bash +$ tsci import "usb-c" --tscircuit +✔ Select a part to import › seveibar/smd-usb-c +⠋ Installing seveibar/smd-usb-c...Adding @tsci/seveibar.smd-usb-c... +> bun add @tsci/seveibar.smd-usb-c +bun add v1.3.3 (274e01c7) + +installed @tsci/seveibar.smd-usb-c@0.0.2 + +1 package installed [18.02s] +✓ Added @tsci/seveibar.smd-usb-c successfully +✔ Installed seveibar/smd-usb-c +``` + +After selecting a component, `tsci import` will automatically install it into your project. diff --git a/docs/command-line/tsci-init.md b/docs/command-line/tsci-init.md index 6e472237..848c6dd7 100644 --- a/docs/command-line/tsci-init.md +++ b/docs/command-line/tsci-init.md @@ -1,3 +1,52 @@ --- title: tsci init +sidebar_position: 0 +description: Initialize a new TSCircuit project --- + +`tsci init` bootstraps a fresh project in the current directory. It creates the +basic files needed to start developing a board, including: + +- `index.tsx` – your main circuit entrypoint +- `package.json` with the required dependencies +- `tsconfig.json` +- `.gitignore` and other configuration files + +You can run the command interactively or pass `-y` to accept all defaults. + +### Options +- `-y, --yes` – use defaults and skip prompts +- `--no-install` – skip installing dependencies after initialization + +```bash +mkdir my-circuit +cd my-circuit +# Initialize with prompts +tsci init +# or skip prompts +tsci init -y +# skip dependency installation +tsci init -y --no-install +``` + +After initialization you will see a directory structure similar to the following: + +```text +my-circuit/ +├─ index.tsx +├─ package.json +├─ tsconfig.json +└─ tscircuit.config.json +``` + +import tsciInitImage from "../../static/img/tsci-init.png"; +import ImageWithCaption from "../../src/components/ImageWithCaption"; + + + +Next, run `tsci dev` to start the development server and view your circuit in the +browser. diff --git a/docs/command-line/tsci-install.md b/docs/command-line/tsci-install.md new file mode 100644 index 00000000..8dcf2233 --- /dev/null +++ b/docs/command-line/tsci-install.md @@ -0,0 +1,34 @@ +--- +title: tsci install +description: Install project dependencies or a specific package +--- + +`tsci install` installs all project dependencies when called without arguments, or installs a specific package when given a package specifier. It supports npm packages, GitHub URLs, and KiCad libraries. + +## Usage + +```bash +tsci install [packageSpec] +``` + +### Arguments +- `packageSpec` *(optional)* – a package to install. Can be an npm package name, a GitHub URL, or a KiCad library URL. When omitted, installs all project dependencies. + +## Examples + +Install all project dependencies: +```bash +$ tsci install +Found existing package.json. +Installing dependencies using bun... +> bun install +bun install v1.3.3 (274e01c7) + +Checked 307 installs across 338 packages (no changes) [121.00ms] +Dependencies installed successfully. +``` + +Install a specific package from a GitHub URL: +```bash +tsci install https://github.com/espressif/kicad-libraries +``` diff --git a/docs/command-line/tsci-login.md b/docs/command-line/tsci-login.md index 61416f7a..e5dbe483 100644 --- a/docs/command-line/tsci-login.md +++ b/docs/command-line/tsci-login.md @@ -1,5 +1,6 @@ --- title: tsci login +description: Sign in to the tscircuit registry to enable publishing and cloud tools sidebar_position: 1 --- @@ -24,5 +25,30 @@ To logout again, just run `tsci logout` ## Other Auth Functions -Run `tsci auth --help` to see other auth functions, such as printing your token -for use with the [Registry API](../web-apis/the-registry-api.md) +Run `tsci auth --help` to see all available auth subcommands. + +### `tsci auth whoami` + +Show information about the currently authenticated user, including your tscircuit handle, email, account ID, and session details. + +```bash +tsci auth whoami +``` + +### `tsci auth set-token` + +Manually set your authentication token (must be a valid JWT). + +```bash +tsci auth set-token +``` + +### `tsci auth setup-npmrc` + +Configure your global `.npmrc` file with authentication for tscircuit private packages. You must be logged in first. + +```bash +tsci auth setup-npmrc +``` + +See also: [`tsci auth print-token`](./tsci-auth-print-token.md) for printing your token for use with the [Registry API](../web-apis/the-registry-api.md). diff --git a/docs/command-line/tsci-push.md b/docs/command-line/tsci-push.md new file mode 100644 index 00000000..3c893b02 --- /dev/null +++ b/docs/command-line/tsci-push.md @@ -0,0 +1,38 @@ +--- +title: tsci push +sidebar_position: 2 +description: | + tsci push uploads your package to the tscircuit registry for module re-use +--- + +tscircuit code, like React code, is distributed as a "package". `tsci push` uploads your package to the [tscircuit registry](https://tscircuit.com/trending) to enable sharing with your team. + +After publishing, you can use the [tsci add](https://docs.tscircuit.com/command-line/tsci-add) command to install your package as part of a larger circuit. + +## Usage + +```bash +tsci push [options] +``` + +## Options + +- `--compress` – Compresses the payload before upload. This is useful for large projects and slower connections because it reduces upload size. + +After running `tsci push` you can see your package on your tscircuit registry page. Packages default to private visibility, but you can change this from your registry page to enable sharing your package with the broader ecosystem. + +import tsciPushImage from "../../static/img/tsci-push.png" +import registrySnippetImage from "../../static/img/registry-snippet.png" +import ImageWithCaption from "../../src/components/ImageWithCaption"; + + + + diff --git a/docs/command-line/tsci-remove.md b/docs/command-line/tsci-remove.md new file mode 100644 index 00000000..98ff0a27 --- /dev/null +++ b/docs/command-line/tsci-remove.md @@ -0,0 +1,23 @@ +--- +title: tsci remove +description: Remove a tscircuit package from your project +--- + +`tsci remove` removes a tscircuit package from your project, the inverse of [`tsci add`](./tsci-add.mdx). + +## Usage + +```bash +tsci remove +``` + +### Arguments +- `package` *(required)* – the package to remove (e.g. `author/package-name`) + +## Example + +```bash +$ tsci remove seveibar/PICO_W +# Removing @tsci/seveibar.PICO_W... +# Removed @tsci/seveibar.PICO_W successfully. +``` diff --git a/docs/command-line/tsci-search.md b/docs/command-line/tsci-search.md new file mode 100644 index 00000000..50b50ccb --- /dev/null +++ b/docs/command-line/tsci-search.md @@ -0,0 +1,76 @@ +--- +title: tsci search +description: Discover footprints and packages across the tscircuit ecosystem +--- + +`tsci search` finds footprints and packages from across the tscircuit ecosystem. + +### Options +- `--kicad` – search KiCad footprints +- `--jlcpcb` – search JLCPCB components +- `--lcsc` – alias for `--jlcpcb` +- `--tscircuit` – search tscircuit registry packages +- `--json` – output search results as JSON + +When no filter options are provided, all sources are searched. + +## Usage + +```bash +$ tsci search resistor +Found 10 footprint(s) from KiCad: + 1. Resistor_SMD/R_01005_0402Metric_Pad0.57x0.30mm_HandSolder + 2. Resistor_SMD/R_01005_0402Metric + 3. Resistor_SMD/R_0201_0603Metric_Pad0.64x0.40mm_HandSolder + 4. Resistor_SMD/R_0201_0603Metric + 5. Resistor_SMD/R_0402_1005Metric_Pad0.72x0.64mm_HandSolder + 6. Resistor_SMD/R_0402_1005Metric + 7. Resistor_SMD/R_0603_1608Metric_Pad0.98x0.95mm_HandSolder + 8. Resistor_SMD/R_0603_1608Metric + 9. Resistor_SMD/R_0612_1632Metric_Pad1.18x3.40mm_HandSolder +10. Resistor_SMD/R_0612_1632Metric +Found 11 package(s) in the tscircuit registry: +1. seveibar/usb-c-flashlight (vundefined) - Stars: 5 - A compact USB-C powered push button board with a red LED, utilizing a single current-limiting resistor for the LED indicator. +2. ArnavK-09/OPT4048DTSR (vundefined) - Stars: 3 - Sparkfun schematic with an 8-pin SOIC-8 IC (OPT4048) connected to a 3.3V power supply, ground, I2C bus lines (SCL, SDA), an address pin, an interrupt pin, plus a pull-up resistor and a decoupling capacitor. +... +``` + +Use any search term to discover related footprints or published projects. + +### JSON Output Example + +You can output search results as JSON by using the `--json` flag. + +```bash +$ tsci search --jlcpcb "RP2040" --json +``` + +```json +{ + "query": "RP2040", + "results": [ + { + "source": "jlcpcb", + "lcsc": 2040, + "mfr": "RP2040", + "package": "LQFN-56(7x7)", + "is_basic": false, + "is_preferred": false, + "description": "", + "stock": 42449, + "price": 0.872857143 + }, + { + "source": "jlcpcb", + "lcsc": 5350143, + "mfr": "RP2040-Zero", + "package": "-", + "is_basic": false, + "is_preferred": false, + "description": "", + "stock": 51, + "price": 5.091428571 + } + ] +} +``` diff --git a/docs/command-line/tsci-simulate.md b/docs/command-line/tsci-simulate.md new file mode 100644 index 00000000..821c82c3 --- /dev/null +++ b/docs/command-line/tsci-simulate.md @@ -0,0 +1,58 @@ +--- +title: tsci simulate +description: Run circuit simulations from the command line +--- + +`tsci simulate` runs circuit simulations on your tscircuit designs. Currently it supports analog SPICE simulations. + +## Usage + +```bash +tsci simulate [options] +``` + +## Subcommands + +### `tsci simulate analog` + +Run an analog SPICE simulation on a circuit file. + +```bash +tsci simulate analog [options] +``` + +#### Arguments +- `file` *(required)* – path to a tscircuit `.tsx` or `.circuit.json` file + +#### Options +- `--disable-parts-engine` – disable the parts engine during circuit evaluation + +The command generates a SPICE netlist from your circuit, runs the simulation, and prints the results in a table format. + +## Example + +```bash +$ tsci simulate analog my-circuit.circuit.tsx +ngspice 1 -> ngspice 1 -> +Note: No compatibility mode selected! + + +Circuit: * circuit json to spice netlist + +ngspice 2 -> Doing analysis at TEMP = 27.000000 and TNOM = 27.000000 + +Using SPARSE 1.3 as Direct Linear Solver +Operating point simulation skipped by 'uic', + now using transient initial conditions. + +No. of Data Rows : 1011 +ngspice 3 -> binary raw file "out.raw" + +Index time v(n1) v(n2) v(vp_in1) i(vsimulation_voltage_source_0) +0 1.000000e-6 6.283184e-4 6.283184e-4 1.256637e-3 -1.742483e-15 +1 2.000000e-6 1.256637e-3 1.256637e-3 2.513274e-3 -3.485349e-15 +2 4.000000e-6 2.513273e-3 2.513273e-3 5.026547e-3 -6.972993e-15 +3 8.000000e-6 5.026544e-3 5.026544e-3 1.005309e-2 -1.396437e-14 +4 1.600000e-5 1.005307e-2 1.005307e-2 2.010614e-2 -2.807686e-14 +5 3.200000e-5 2.010598e-2 2.010598e-2 4.021195e-2 -5.737260e-14 +``` diff --git a/docs/command-line/tsci-snapshot.md b/docs/command-line/tsci-snapshot.md new file mode 100644 index 00000000..4dbce6a9 --- /dev/null +++ b/docs/command-line/tsci-snapshot.md @@ -0,0 +1,47 @@ +--- +title: tsci snapshot +description: Generate schematic and PCB snapshots for regression tests +--- + +`tsci snapshot` renders your boards to SVG images and compares them with saved snapshots. + +## Usage + +```bash +tsci snapshot [options] [path] +``` + +### Options +- `-u, --update` – write new snapshots to disk. +- `--force-update` – force writing snapshots even when no visual diff is detected. +- `--3d` – also generate 3D preview snapshots. +- `--pcb-only` – generate only PCB snapshots. +- `--schematic-only` – generate only schematic snapshots. +- `--disable-parts-engine` – disable the parts engine while rendering snapshots. +- `--show-courtyards` – show courtyard outlines in PCB snapshots. +- `--camera-preset ` – choose the camera angle preset for 3D snapshots. This also implies `--3d`. +- `--ci` – enable CI mode and generate diff artifacts. +- `--test` – enable test mode and generate diff artifacts. +- `--concurrency ` – number of files to snapshot in parallel (default: `1`). + +### Arguments +- `[path]` – optional file path, directory, or glob pattern used to limit what gets snapshotted. + +### Which files are snapped? +The command searches the current project for: +- the detected entrypoint (using the same logic as `tsci build`) +- any files matching `*.board.tsx` or `*.circuit.tsx` + +This pattern allows standalone board files (ending in `.circuit.tsx`) to be tested alongside your main project. + +### Snapshot location +Snapshots are stored next to each source file in a `__snapshots__` directory. For a file `test.board.tsx` you will see: + +``` +__snapshots__/test.board-pcb.snap.svg +__snapshots__/test.board-schematic.snap.svg +``` + +If `--3d` is specified, a `-3d.snap.svg` is also produced. + +Running without `--update` verifies that the generated output matches the existing snapshots. Differences cause a non-zero exit code. diff --git a/docs/command-line/tsci-transpile.md b/docs/command-line/tsci-transpile.md new file mode 100644 index 00000000..6042412e --- /dev/null +++ b/docs/command-line/tsci-transpile.md @@ -0,0 +1,29 @@ +--- +title: tsci transpile +description: Transpile TypeScript/TSX to JavaScript for distribution as a reusable library +--- + +`tsci transpile` converts your TypeScript/TSX circuit files into distributable JavaScript bundles (ESM, CommonJS, and type declarations). This is useful when you want to publish your circuit as a reusable module. + +## Usage + +```bash +tsci transpile [file] +``` + +### Arguments +- `file` *(optional)* – path to the entry file. If omitted, the command uses the detected entrypoint (same logic as `tsci build`). + +## Output + +The transpile command generates three files in the `dist/` directory: + +| File | Format | +|------|--------| +| `index.js` | ESM bundle | +| `index.cjs` | CommonJS bundle | +| `index.d.ts` | TypeScript type declarations | + +:::tip +`tsci transpile` is equivalent to running `tsci build --transpile` without the circuit JSON generation step. Use `tsci build --transpile` when you want both `circuit.json` and the transpiled output. +::: diff --git a/docs/contributing/bounties-and-sponsorship.md b/docs/contributing/bounties-and-sponsorship.md index 41b0735c..1d510557 100644 --- a/docs/contributing/bounties-and-sponsorship.md +++ b/docs/contributing/bounties-and-sponsorship.md @@ -1,21 +1,48 @@ --- -title: Bounties and Sponsorship +title: Sponsorships +description: Understand how tscircuit contributor sponsorships are awarded --- -tscircuit has thousands dollars (USD) of bounties opened every month in over -50 new weekly issues. We also automatically sponsor regular contributors -hundreds of dollars each based on their contributions, which we track with Github's API -in our weekly [contribution-tracker](https://github.com/tscircuit/contribution-tracker) -(resets every Wednesday) +tscircuit automatically sponsors regular contributors based on the impact of +their work. This activity is tracked in the open-source +[contribution-tracker](https://github.com/tscircuit/contribution-tracker), +which powers [contributions.tscircuit.com](https://contributions.tscircuit.com) +and resets every Wednesday. -Many people follow the [bounties channel on discord](https://discord.com/channels/1233487248129921135/1301957862762872832) or our [bounty board](https://console.algora.io/org/tscircuit/bounties?status=open) -to find issues to contribute to, but **this is actually the hardest way to get bounties!** +## How the contribution tracker works -**The easiest way to get bounties and sponsorship is to _actually use tscircuit and try to build a circuit_.** When you -find something confusing or buggy, create an issue. When you create an issue that -gets bountied, you get extra points on the contribution tracker and you become -the best person to fix the issue because you understand it so well! If you -continually do this, you'll find that their are infinite issues to be done! +- Every PR across the tscircuit GitHub org is scanned and summarized via an LLM + so we can consistently understand the scope of each change. +- The LLM classifies each diff/PR into attributes such as **🐳 Major**, + **🐙 Minor**, and **🐌 Tiny** impact levels and assigns a star rating that feeds + the weekly score shown on the sponsorship leaderboard. +- The resulting data is organized into the sections you see on the tracker—such + as Contributor Overview, PRs by Repository, and PRs by Contributor—so you can + quickly understand where impactful work is happening across the ecosystem. +- Historical exports, including weekly contribution overviews and AI-generated + monthly changelogs, are kept directly in the + [contribution-tracker repo](https://github.com/tscircuit/contribution-tracker) + if you want to dig deeper into past activity. + +**The best way to increase sponsorship eligibility is to consistently contribute +high-impact improvements.** A great approach is to actively use tscircuit, +report confusing or buggy behavior, and submit fixes for the issues you uncover. +Contributors who repeatedly do this tend to build deep product context and +deliver meaningful improvements over time. + +## How sponsorship amounts are calculated + +Sponsorship payouts are based on the last four weeks of star ratings captured by +the tracker. The algorithm takes the median, minimum, and maximum weekly star +counts to decide on a base amount—ranging from $15 for occasional stars up to +$500 for consistently high-impact weeks—with a $5 safety net for anyone whose +historical high score stays above 3. You can read the current logic directly in +[`getSponsorshipAmount.ts`](https://github.com/tscircuit/contribution-tracker/blob/main/lib/scoring/getSponsorshipAmount.ts) +for the exact thresholds. + +Maintainers receive an additional fixed monthly sponsorship on top of the weekly +calculation so their support stays stable. Those maintainer bonuses are defined +alongside the algorithm in the tracker codebase. To be eligible for Github Sponsorship, you must be in a supported country and have Github Sponsors enabled on your Github profile. diff --git a/docs/contributing/getting-started-as-a-contributor.md b/docs/contributing/getting-started-as-a-contributor.md index b1694724..cc0e62de 100644 --- a/docs/contributing/getting-started-as-a-contributor.md +++ b/docs/contributing/getting-started-as-a-contributor.md @@ -1,11 +1,19 @@ --- title: Getting Started as a Contributor +description: Learn how to set up your environment and find issues in the tscircuit ecosystem sidebar_position: 1 --- tscircuit is a great project to contribute to if you're familiar with Typescript and React. +:::tip + +Make sure you've [joined the discord server](https://tscircuit.com/join) so we +can help you get started and reviewed quickly! + +::: + tscircuit is composed of over 200 repositories, but every project uses [bun](https://bun.sh), so make sure to install bun before you start contributing. @@ -16,6 +24,32 @@ To contribute to tscircuit, you need to make [Pull Requests](https://docs.github 1. Make sure bun is installed on your system 2. Make sure you've signed up at [tscircuit.com](https://tscircuit.com) and have followed a tutorial in the docs to create a circuit board +## Contribution Philosophy: Practice Being a User + +The best contributors spend time using tscircuit like real users do. + +- Build something practical, then notice where AI struggles to produce useful results. +- Watch for places where the UI feels confusing, unclear, or hard to navigate. +- Report and fix obvious bugs you hit while trying to complete a normal task. + +If you need project ideas, try cloning a real product you already use in daily life. +Look around your desk or home for small electronic devices and recreate one as a board: + +- a fan +- a rice cooker +- a keyboard +- a phone charger +- a digital weighing scale +- a smart lock + +:::tip Need an idea? + +Try picking a random idea from [electronics-ideas/IDEAS.txt](https://github.com/tscircuit/electronics-ideas/blob/main/IDEAS.txt). + +::: + +This "practice being a user" approach quickly reveals high-impact improvements. + ## Recommended Contribution Order We recommend the following order for contributing to tscircuit. Contributing to repositories in this order will make sure you have a good understanding of the tscircuit ecosystem. diff --git a/docs/contributing/making-lab-boards.mdx b/docs/contributing/making-lab-boards.mdx new file mode 100644 index 00000000..3e474f1b --- /dev/null +++ b/docs/contributing/making-lab-boards.mdx @@ -0,0 +1,29 @@ +--- +title: Making Lab Boards +description: Overview of the lab process and board template for making lab boards. +sidebar_position: 7 +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +The tscircuit lab features a Commarker Omni X UV Laser capable of ablating copper +clad. + +The standard copper clad in the lab is single-sided at 100mmx70mm. You should +generally try to use the entire board to make post-processing simpler. Our internal +available area is generally 88x58mm (approximately credit card sized) + + ( + + {/* ... */} + +) +`} /> + +We maintain a [lab inventory full of components](https://links.tscircuit.com/), +please prefer to use stocked components. + +Our standard lab process involves ablating copper clad, applying a Solder Mask +to the entire board, curing mask, then ablating the exposed pads (laser off the +negative solder mask layer). We then apply solder paste manually and assemble on +a hot plate. diff --git a/docs/contributing/overview-of-projects.md b/docs/contributing/overview-of-projects.md index c1a05455..c13af95c 100644 --- a/docs/contributing/overview-of-projects.md +++ b/docs/contributing/overview-of-projects.md @@ -1,6 +1,7 @@ --- title: Overview of Projects sidebar_position: 2 +description: Explore the key tscircuit repositories including core libraries, tools, and web components that power the ecosystem. --- | Repo | Description | Open Issues | @@ -9,9 +10,11 @@ sidebar_position: 2 | [tscircuit/schematic-symbols](https://github.com/tscircuit/schematic-symbols) | Library of schematic symbols used across tscircuit | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/schematic-symbols)](https://github.com/tscircuit/schematic-symbols/issues) | | [tscircuit/footprinter](https://github.com/tscircuit/footprinter) | Generates PCB footprints from string descriptions | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/footprinter)](https://github.com/tscircuit/footprinter/issues) | | [tscircuit/circuit-to-svg](https://github.com/tscircuit/circuit-to-svg) | Converts Circuit JSON into SVG files | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/circuit-to-svg)](https://github.com/tscircuit/circuit-to-svg/issues) | +| [tscircuit/circuit-json](https://github.com/tscircuit/circuit-json) | Underlying assembly language format that represents tscircuit circuits | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/circuit-json)](https://github.com/tscircuit/circuit-json/issues) | | [tscircuit/tscircuit.com](https://github.com/tscircuit/tscircuit.com) | Main website and circuit board editor | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/tscircuit.com)](https://github.com/tscircuit/tscircuit.com/issues) | | [tscircuit/cli](https://github.com/tscircuit/cli) | Main development tool for tscircuit, provides local development server and package management | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/cli)](https://github.com/tscircuit/cli/issues) | | [tscircuit/runframe](https://github.com/tscircuit/runframe) | React component to preview and run tscircuit circuits | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/runframe)](https://github.com/tscircuit/runframe/issues) | | [tscircuit/pcb-viewer](https://github.com/tscircuit/pcb-viewer) | React component for viewing PCBs | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/pcb-viewer)](https://github.com/tscircuit/pcb-viewer/issues) | | [tscircuit/3d-viewer](https://github.com/tscircuit/3d-viewer) | React component for viewing 3D previews | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/3d-viewer)](https://github.com/tscircuit/3d-viewer/issues) | +| [tscircuit/props](https://github.com/tscircuit/props) | Specification for the definitions of every React component supported by tscircuit | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/props)](https://github.com/tscircuit/props/issues) | | [tscircuit/easyeda-converter](https://github.com/tscircuit/easyeda-converter) | Command line utility for converting JLCPCB footprints to tscircuit | [![GitHub issues](https://img.shields.io/github/issues/tscircuit/easyeda-converter)](https://github.com/tscircuit/easyeda-converter/issues) | diff --git a/docs/contributing/package-dependencies-and-auto-updates.mdx b/docs/contributing/package-dependencies-and-auto-updates.mdx new file mode 100644 index 00000000..3a4875b7 --- /dev/null +++ b/docs/contributing/package-dependencies-and-auto-updates.mdx @@ -0,0 +1,102 @@ +--- +title: Package Dependencies and Auto-Updates +description: Understanding the tscircuit package ecosystem and automated dependency update workflow +--- + +# Package Dependencies and Auto-Updates + +The tscircuit ecosystem consists of multiple interconnected packages that automatically update each other when changes are merged. This guide explains the dependency chain and how the auto-update workflow functions. + +## Package Dependency Flow + +The following diagram shows how packages in the tscircuit ecosystem depend on and trigger updates to each other: + +```mermaid +flowchart TD + + %% Checks to Core + checks[tscircuit/checks] --> core[tscircuit/core] + + %% Core to Eval + core[tscircuit/core] --> eval[tscircuit/eval] + + %% Eval to Runframe + eval --> runframe[tscircuit/runframe] + + %% 3D Viewer to Runframe + viewer3d[tscircuit/3d-viewer] --> runframe + + %% PCB Viewer to Runframe + pcbviewer[tscircuit/pcb-viewer] --> runframe + + %% Schematic Viewer to Runframe + schemaviewer[tscircuit/schematic-viewer] --> runframe + + %% Circuit JSON to Gerber to Runframe + circuitjsontogerber[circuit-json-to-gerber] --> runframe + + %% Circuit JSON to KiCad to Runframe + circuitjsontokicad[circuit-json-to-kicad] --> runframe + + %% Runframe to CLI + runframe --> cli[tscircuit/cli] + + %% Runframe to tscircuit.com + runframe --> tscircuitcom[tscircuit/tscircuit.com] + + %% Runframe to circuitjson.com + runframe --> circuitjsoncom[tscircuit/circuitjson.com] + + %% CLI to Tscircuit + cli --> tscircuit[tscircuit/tscircuit] + + %% Tscircuit to web services + tscircuit --> svg[tscircuit/svg.tscircuit.com] + tscircuit --> usercode[tscircuit/usercode.tscircuit.com] +``` + +## Workflow Implementation + +The auto-update system consists of coordinated workflows across multiple repositories. Here's how it works in detail: + +## Adding Dependencies to the Automerge Pipeline + +If dependencies frequently need to be updated and are relatively stable, they can be added to the automerge pipeline. To add a new dependency, follow this process: + +1. Propose a change to the Mermaid diagram in [this doc on GitHub](https://github.com/tscircuit/docs/blob/main/docs/contributing/package-dependencies-and-auto-updates.mdx) to include the new package relationship. +2. Add a workflow dispatch from the [`bun-pver-release.yml` file](https://github.com/tscircuit/plop/blob/main/template-files/bun-pver-release.yml) for the repository that should trigger updates in downstream packages. +3. Use [`@tscircuit/plop`](https://github.com/tscircuit/plop) to add the [`update-package.yml`](https://github.com/tscircuit/plop/blob/main/template-files/update-package.yml) workflow to the target repository that should receive automated updates. +4. Monitor the automerge pipeline to confirm it correctly opens and closes PRs as updates are released. + +### Example: `tscircuit/core` to `tscircuit/eval` Update Flow + +**Step 1: Publish and Trigger (Upstream Repository)** +When a PR is merged to `tscircuit/core`, the [`bun-pver-release.yml`](https://github.com/tscircuit/plop/blob/main/template-files/bun-pver-release.yml) workflow: +- Builds and publishes the new package version to npm using `pver release` +- Triggers a `workflow_dispatch` event to downstream repositories like `tscircuit/eval` + +**Step 2: Update Dependencies (Downstream Repository)** +The [`update-package.yml`](https://github.com/tscircuit/plop/blob/main/template-files/update-package.yml) workflow in `tscircuit/eval`: +- Receives the dispatch with package names to update (e.g., `@tscircuit/core`) +- Runs `bun update --latest` for each specified package +- Closes any existing update PRs from `@tscircuitbot` to avoid conflicts +- Creates a new PR with the updated dependencies and enables auto-merge + +**Step 3: Auto-Merge Process** +After the PR is created: +- All CI tests and checks must pass +- If tests pass, the PR automatically merges +- The merge triggers the next workflow in the chain (eval → runframe) + +## Key Design Principles + +### No Circular Dependencies +The workflow is carefully designed to avoid circular dependencies: +- Updates flow in one direction only +- Each package has a clear position in the dependency hierarchy +- No package updates its own dependencies' dependencies + +### Test-Gated Merging +- Auto-merge only occurs when all tests and CI checks pass +- Broken builds are prevented from propagating +- Manual intervention required if tests fail diff --git a/docs/contributing/report-autorouter-bugs.md b/docs/contributing/report-autorouter-bugs.md new file mode 100644 index 00000000..0f87663f --- /dev/null +++ b/docs/contributing/report-autorouter-bugs.md @@ -0,0 +1,31 @@ +--- +title: Report an Autorouter Bug +description: Learn how to report an autorouter bug so that the tscircuit team can fix it. +--- + +import YouTubeEmbed from '../../src/components/YouTubeEmbed'; + +## Overview + +You can report autorouter bugs by going to `Errors -> Open Autorouter Log -> Report Bug` inside the tscircuit interface. + +When you report a bug, your autorouting data is sent to the tscircuit API so that the autorouting developers can debug the issue. + + + +## Simulating your bug with the Autorouting Debugger + +After you've created a bug report, you can take things a step further by +downloading your reproduction to the codebase. To do this, you should do +the following: + +1. Clone the [tscircuit-autorouter](https://github.com/tscircuit/tscircuit-autorouter) repository. +2. Run `bun i` to install the dependencies. +3. Run `bun run bug-report ` to download the reproduction. This will output the name of your bug report directory +4. Run `bun run start` and search for your bug report directory, it will + appear inside the autorouting debugger. + + +## Helping Contributors solve your autorouting bug + +- [Create a high density solving fixture for your problem](https://youtu.be/cANWCNp_ggg) diff --git a/docs/contributing/the-contributor-handbook.md b/docs/contributing/the-contributor-handbook.md index c662c2cd..60f9f4e1 100644 --- a/docs/contributing/the-contributor-handbook.md +++ b/docs/contributing/the-contributor-handbook.md @@ -1,5 +1,6 @@ --- title: The Contributor Handbook +description: Essential patterns and guidelines for contributing to tscircuit, including development tools and coding standards. --- We have some important patterns that make contributing to diff --git a/docs/elements/_category_.json b/docs/elements/_category_.json index 94acedf0..032fcae9 100644 --- a/docs/elements/_category_.json +++ b/docs/elements/_category_.json @@ -4,5 +4,7 @@ "link": { "type": "generated-index", "description": "Learn how to use the builtin tscircuit elements" - } + }, + "collapsible": true, + "collapsed": false } diff --git a/docs/elements/analogsimulation.mdx b/docs/elements/analogsimulation.mdx new file mode 100644 index 00000000..9b09dae3 --- /dev/null +++ b/docs/elements/analogsimulation.mdx @@ -0,0 +1,52 @@ +--- +title: +description: Configure and run SPICE simulations for a tscircuit board. +--- + +## Overview + +`` enables SPICE simulation for a `` and sets the simulation parameters, such as duration and time step. Place this element inside +your board alongside sources and probes to generate simulation results. + +If you're new to simulation workflows, check out the [SPICE simulation guide](/category/spice-simulation) for step-by-step examples. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + + + + + +) +`} +/> + +## Properties + +| Property | Description | Example | +| --- | --- | --- | +| `duration` | Total simulation time. Accepts numbers or time strings. | `"10ms"` | +| `timePerStep` | Time interval between simulation steps. | `"0.1ms"` | +| `spiceEngine` | SPICE engine to use. Typically `"ngspice"` or `"spicey"`. | `"ngspice"` | + +Use `` once per `` to define how the simulation +runs. Combine it with `` and `` elements to +create and observe waveforms. + +For more end-to-end examples and best practices, we recommend reviewing the +[SPICE simulation guide](/category/spice-simulation). diff --git a/docs/elements/autoroutingphase.mdx b/docs/elements/autoroutingphase.mdx new file mode 100644 index 00000000..fa74c384 --- /dev/null +++ b/docs/elements/autoroutingphase.mdx @@ -0,0 +1,251 @@ +--- +title: +description: Split PCB routing into ordered phases and reroute a region after an earlier route pass. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +export const squigglyAutorouterFile = `import type { SimpleRouteJson } from "tscircuit" + +type Point = { x: number; y: number; layer?: string } + +const wire = (point: Point, width: number) => ({ + route_type: "wire" as const, + x: point.x, + y: point.y, + width, + layer: point.layer ?? "top", +}) + +export const createSquigglyAutorouter = async ( + simpleRouteJson: SimpleRouteJson, +) => { + let complete: ((event: any) => void) | undefined + + const solveSync = () => + simpleRouteJson.connections.map((connection) => { + const [start, end] = connection.pointsToConnect as [Point, Point] + const width = connection.nominalTraceWidth ?? 0.15 + const dx = end.x - start.x + const dy = end.y - start.y + const length = Math.hypot(dx, dy) || 1 + const normal = { x: -dy / length, y: dx / length } + const waveCount = 4 + const amplitude = 0.65 + + return { + type: "pcb_trace", + pcb_trace_id: connection.name + "_squiggle", + connection_name: connection.source_trace_id ?? connection.name, + route: Array.from({ length: 49 }, (_, i) => { + const t = i / 48 + const offset = Math.sin(t * Math.PI * 2 * waveCount) * amplitude + return wire( + { + x: start.x + dx * t + normal.x * offset, + y: start.y + dy * t + normal.y * offset, + layer: start.layer ?? end.layer, + }, + width, + ) + }), + } + }) + + return { + isRouting: false, + on: (event: string, callback: any) => { + if (event === "complete") complete = callback + }, + start: () => complete?.({ type: "complete", traces: solveSync() }), + stop: () => {}, + solveSync, + } as any +} +` + +export const withRerouteFiles = { + "with-reroute.circuit.tsx": `import { createSquigglyAutorouter } from "./demo-autorouter" + +export default () => ( + + + + + + + + + + + + + + +)`, + "demo-autorouter.ts": squigglyAutorouterFile, +} + +export const connectionRerouteFiles = { + "connection-reroute.circuit.tsx": `import { createSquigglyAutorouter } from "./demo-autorouter" + +export default () => ( + + + + + + + + + + + + + + + +)`, + "demo-autorouter.ts": squigglyAutorouterFile, +} + +export const withoutRerouteCode = `export default () => ( + + + + + + + + + + + + +)` + +The `` element lets you split PCB autorouting into ordered +passes. Use it when some traces should route before others, when a net should be +routed in a dedicated pass, or when you want to reroute only a region after an +earlier route is complete. + +## Reroute a Region + +Add a normal phase first, assign traces or nets to that phase with +`routingPhaseIndex`, then add a later phase with `reroute` and a rectangular +`region`. The reroute phase uses the routes from previous phases, extracts the +connections that cross the region, and replaces the route inside that rectangle. + +### Without Reroute + +This board uses the default autorouter for phase `0`. + + + +### With Reroute + +Adding the second phase reroutes only the right half of the board. The second +phase uses a custom autorouter that returns a squiggly line, so the changed +route segment is easy to see. + + + +In this example, the default routing pass routes the three traces across the +board. The reroute phase does not need traces assigned to it because `reroute` +creates a reroute pass from the previous output. Only routes crossing the +rectangle from `x=0` to `x=8` and `y=-5` to `y=5` are reconsidered. + +## Reroute Selected Connections + +Use `connection` or `connections` when a phase should target traces by endpoint +instead of by region. The selector may use normal port selector syntax, such as +`"U1.pin1"` or `".U1 > .pin1"`. + +When `reroute` is set without `region`, only matching connections are routed in +that phase. Previously routed traces remain in place and are treated as +obstacles. + + + +```tsx + +``` + +Use `connections` to target more than one connection in the same phase: + +```tsx + +``` + +## Assign Traces and Nets to Phases + +Use `routingPhaseIndex` on a `` to put that trace into a phase: + +```tsx + + +``` + +You can also assign a `` to a phase. Traces connected to that net inherit +the net's routing phase unless the trace sets its own `routingPhaseIndex`. + +```tsx + + + +``` + +Phases run in ascending `phaseIndex` order. Traces and nets without a +`routingPhaseIndex` run after numbered phases. + +## Props + +| Prop | Type | Description | +| --- | --- | --- | +| `phaseIndex` | `number` | The routing pass configured by this element. Matches `routingPhaseIndex` on traces and nets. | +| `autorouter` | `string \| AutorouterConfig` | Optional autorouter preset or configuration for this phase. Omit it to use the parent board or subcircuit autorouter. | +| `reroute` | `boolean` | Makes this phase reroute traces produced by earlier phases instead of routing newly assigned traces. | +| `region` | `{ shape: "rect"; minX: number; maxX: number; minY: number; maxY: number }` | Rectangular PCB region to reroute. Required for `reroute`. | +| `connection` | `string` | Port selector for a connection to include in this phase. With `reroute`, reroutes only that connection. | +| `connections` | `string[]` | Port selectors for multiple connections to include in this phase. With `reroute`, reroutes only those connections. | + +For custom phase autorouters with `algorithmFn`, see +[Create or Use a Custom Autorouter](../advanced/create-or-use-custom-autorouter.mdx). diff --git a/docs/elements/battery.mdx b/docs/elements/battery.mdx new file mode 100644 index 00000000..5969ae7e --- /dev/null +++ b/docs/elements/battery.mdx @@ -0,0 +1,125 @@ +--- +title: +sidebar_position: 4 +description: >- + A `` is a power source that provides electrical energy through + electrochemical reactions. Batteries are essential components that supply + power to electronic circuits and devices. They have a positive and negative + terminal and must be connected with correct polarity. +--- + +## Overview + +A `` is a power source that provides electrical energy through electrochemical reactions. Batteries are essential components that supply power to electronic circuits and devices. They have a positive and negative terminal and must be connected with correct polarity. + +A battery element has two pins and is polarized, meaning it has a positive terminal (cathode) and a negative terminal (anode). The voltage and capacity of the battery determine how much power it can provide and for how long. + +When specifying a battery, you'll need to provide the voltage rating and optionally the capacity. Common battery types include AA, AAA, 9V, coin cells, and lithium-ion batteries. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + ) + + `} +/> + +## Pins + +A battery has the following pins and aliases: + +| Pin # | Aliases | Description | +| ---------- | ------- | ----------- | +| pin1 | pos, positive, cathode | The positive terminal that provides current | +| pin2 | neg, negative, anode | The negative terminal that completes the circuit | + +:::warning +Batteries are polarized components! You must connect the positive and negative terminals correctly. Reversing polarity can damage your circuit or the battery itself. +::: + +## Specifications + +Batteries can be configured with these key properties: + +- **capacity** - The energy storage capacity specified in mAh or Ah e.g. `"2500mAh"`, `"1.2Ah"` + +## Common Battery Types + +Here are some common battery types and their typical specifications: + +| Battery Type | Voltage | Typical Capacity | Chemistry | +| ------------ | ------- | --------------- | --------- | +| AA | 1.5V | 2000-3000mAh | Alkaline | +| AAA | 1.5V | 800-1200mAh | Alkaline | +| 9V | 9V | 400-600mAh | Alkaline | +| CR2032 | 3V | 200-250mAh | Lithium coin cell | +| 18650 | 3.7V | 2500-3500mAh | Lithium-ion | + +## Schematic Orientation + +Batteries can display their positive and negative terminals in different orientations. Use the `schOrientation` property to control the symbol orientation. + +Valid orientation values are: + +- `horizontal` +- `vertical` +- `pos_left` +- `pos_right` +- `pos_top` +- `pos_bottom` +- `neg_left` +- `neg_right` +- `neg_top` +- `neg_bottom` + +```tsx + +``` + +## Usage Examples + +### Basic Power Supply + +```tsx + +``` + +### High Capacity Battery + +```tsx + +``` + +### Small Capacity Battery + +```tsx + +``` + +:::tip +When designing battery-powered circuits, consider adding battery monitoring circuitry to track voltage levels and prevent over-discharge, especially for rechargeable batteries. +::: diff --git a/docs/elements/board.mdx b/docs/elements/board.mdx index 46185a1c..ccf6e67b 100644 --- a/docs/elements/board.mdx +++ b/docs/elements/board.mdx @@ -1,5 +1,8 @@ --- title: +sidebar_position: 1 +description: >- + Root element that contains all chips and traces to create a printed circuit board. --- The `` element is a root element that contains all the chips and traces @@ -13,20 +16,340 @@ import CircuitPreview from '@site/src/components/CircuitPreview' ( - - - -) + export default () => ( + + + + ) `} /> -## Customizing the Size of the Board +## Board Properties + +| Prop | Type | Description | +| --- | --- | --- | +| `width`, `height` | `string \| number` | Define the board's bounding box dimensions in millimeters. | +| `borderRadius` | `string \| number` | Round the corners of rectangular outlines by the specified radius. | +| `layers` | `1 \| 2 \| 4 \| 6 \| 8` | Specify the number of copper layers in the board stackup. Defaults to 2 layers. | +| `autorouter` | `'auto' \| 'sequential-trace' \| 'auto-local' \| 'auto-cloud' \| 'laser_prefab' \| 'auto_jumper' \| AutorouterConfig` | Select a built-in autorouter preset or provide a configuration object. | +| `autorouterEffortLevel` | `'1x' \| '2x' \| '5x' \| '10x' \| '100x'` | Increase autorouter compute effort for harder routing problems (higher values are slower and can improve completion rate). | +| `autorouterVersion` | `'v1' \| 'v2' \| 'v3' \| 'v4' \| 'v5' \| 'latest'` | Pin routing to a specific autorouter implementation when comparing routing behavior across versions. | +| `routingDisabled` | `boolean` | Skip routing to speed up development. | +| `bomDisabled` | `boolean` | Skip bill-of-material generation for this board. | +| `schematicDisabled` | `boolean` | Skip schematic generation for boards that only need the PCB view. | +| `schAutoLayoutEnabled` | `boolean` | Enable automatic schematic layout for supported grouped circuits. | +| `schTraceAutoLabelEnabled` | `boolean` | Automatically create schematic net labels for complex traces. | +| `schMaxTraceDistance` | `string \| number` | Maximum span a schematic trace can travel before the auto layout prefers labels or different routing. | +| `outline` | `Array<{ x: number, y: number }>` | Supply a custom polygon to replace the default rectangular outline. | +| `outlineOffsetX`, `outlineOffsetY` | `string \| number` | Offset a custom outline relative to the bounding box origin. | +| `material` | `'fr4' \| 'fr1'` | PCB substrate material. Defaults to 'fr4'. | +| `thickness` | `string \| number` | Board thickness in millimeters. | +| `title` | `string` | Title for the board, displayed in documentation and exports. | +| `solderMaskColor` | `string` | Color applied to both top and bottom solder masks. | +| `topSolderMaskColor` | `string` | Color of the top solder mask. | +| `bottomSolderMaskColor` | `string` | Color of the bottom solder mask. | +| `silkscreenColor` | `string` | Color applied to both top and bottom silkscreens. | +| `topSilkscreenColor` | `string` | Color of the top silkscreen. | +| `bottomSilkscreenColor` | `string` | Color of the bottom silkscreen. | +| `doubleSidedAssembly` | `boolean` | Whether the board should be assembled on both sides. Defaults to false. | +| `boardAnchorPosition` | `{ x: number, y: number }` | Moves the board's anchor point to the specified coordinates. | +| `anchorAlignment` | `'center' \| 'top_left' \| 'top_right' \| 'bottom_left' \| 'bottom_right' \| 'center_left' \| 'center_right' \| 'top_center' \| 'bottom_center'` | Preferred prop for choosing which part of the board should sit on `boardAnchorPosition`. | +| `manualEdits` | `object` | Apply a serialized set of manual routing or layout edits to the board. | +| `defaultTraceWidth` | `string \| number` | Default width for traces within this board. | +| `minTraceWidth` | `string \| number` | Minimum allowed trace width for routing. | +| `nominalTraceWidth` | `string \| number` | Preferred trace width used by routers when no trace-specific width is set. | +| `minViaHoleEdgeToViaHoleEdgeClearance` | `string \| number` | Minimum drill-edge clearance between vias. | +| `minPlatedHoleDrillEdgeToDrillEdgeClearance` | `string \| number` | Minimum drill-edge clearance between plated holes. | +| `minTraceToPadEdgeClearance` | `string \| number` | Minimum copper-to-pad-edge clearance during routing. | +| `minPadEdgeToPadEdgeClearance` | `string \| number` | Minimum pad-edge clearance between nearby pads. | +| `minBoardEdgeClearance` | `string \| number` | Minimum clearance between routed copper features and the board edge. | +| `minViaHoleDiameter` | `string \| number` | Smallest via drill diameter the router may use. | +| `minViaPadDiameter` | `string \| number` | Smallest via pad diameter the router may use. | +| `partsEngine` | `object` | Override the parts lookup engine used to resolve bill of materials. | +| `circuitJson` | `any[]` | Provide precompiled circuit JSON to embed or reuse as the board contents. | +| `pcbStyle` | `object` | Style configuration object for PCB elements. See [Global Silkscreen Text Size](#global-silkscreen-text-size-adjustment) below. | + +### Customizing the Size of the Board Generally you'll use the `width` and `height` properties to define the size of the board. +### Disabling Routing with `routingDisabled` + +The `routingDisabled` prop is a powerful development speed optimization. When working +on component placement and circuit design, autorouting can slow down your iteration +cycle. Set `routingDisabled={true}` to skip the routing step and see your changes +instantly: + +```jsx + + + + {/* Traces will show as unrouted ratsnest lines */} + + +``` + +**Why use `routingDisabled`?** +- **Faster development** - Skip routing calculations during component placement +- **Instant feedback** - See layout changes immediately without waiting +- **Focus on placement** - Perfect for optimizing component positions before routing +- **Better performance** - Especially helpful with complex boards that have many traces + +Simply remove `routingDisabled` or set it to `false` when you're ready to see the +final routed board. This workflow significantly speeds up the iterative design process. + +### Board Material and Colors + +You can customize the appearance and manufacturing properties of your board: + +#### Material Selection +Set the `material` prop to specify the PCB substrate: +- `"fr4"` (default) - Standard fiberglass epoxy laminate +- `"fr1"` - Paper-based phenolic resin (lower cost) + +#### Solder Mask Colors +Customize the solder mask appearance: +- `solderMaskColor` - Sets both top and bottom mask colors +- `topSolderMaskColor` - Sets only the top mask color +- `bottomSolderMaskColor` - Sets only the bottom mask color + +Common colors include: `"green"`, `"red"`, `"blue"`, `"purple"`, `"black"`, `"white"`, `"yellow"` + +#### Silkscreen Colors +Control the silkscreen layer colors: +- `silkscreenColor` - Sets both top and bottom silkscreen colors +- `topSilkscreenColor` - Sets only the top silkscreen color +- `bottomSilkscreenColor` - Sets only the bottom silkscreen color + +Example with custom colors: +```jsx + + + +``` + +### Global Silkscreen Text Size Adjustment + +You can set a global font size for all silkscreen text elements using the `pcbStyle` prop with `silkscreenFontSize`. This is useful when you want consistent text sizing across your board without specifying `fontSize` on each individual `` element. + +Silkscreen text elements that don't have an explicit `fontSize` prop will inherit the global size. Individual elements can still override the global size by providing their own `fontSize` prop. + + ( + + {/* Multiple silkscreen texts without explicit fontSize - should use global size */} + + + + + + {/* Text with explicit fontSize - should override global size */} + + + ) +`} /> + +In this example: +- `TEXT1`, `TEXT2`, `TEXT3`, and `TEXT4` all use the global font size of `2.5` because they don't specify a `fontSize` prop +- `OVERRIDE` uses a font size of `1.0` because it explicitly sets `fontSize={1.0}`, which overrides the global setting +- The global size applies to silkscreen text on both top and bottom layers + +This feature helps maintain visual consistency across your board while still allowing flexibility for individual text elements when needed. + +### Double-Sided Assembly + +For boards that require components on both sides, set `doubleSidedAssembly={true}`: + +```jsx + + + + +``` + +This informs manufacturing that components will be placed on both the top and +bottom layers of the board. + +### Rounding Board Corners with `borderRadius` + +To soften sharp corners on a rectangular board, set the optional `borderRadius` +prop. You can pass the radius as either a number—interpreted in millimeters—or +as a string like `"2mm"`. The radius is applied uniformly to all four corners. + + ( + + + + + + ) +`} /> + +### Configuring the Layer Stack with `layers` + +You can set the `layers` prop to add additional inner layers to your circuit +board. If you specify `layers={4}`, the `"inner1"` and `"inner2"` layers are +added automatically and available for routing, while omitting the prop keeps the +default two-layer stackup. + +The following example enables a four-layer board and shows traces connecting +components across that stackup: + + ( + + + + + + + + + + ) +`} /> + +### Board Thickness + +The board thickness can be specified using the `thickness` prop (e.g., `thickness="1.6mm"`). +This is important for mechanical fit and impedance control considerations. + +### Controlling Trace Width + +You can set default and minimum trace widths for all traces within a board: + +- `defaultTraceWidth` - Sets the default width for all traces (e.g., `"0.25mm"`) +- `minTraceWidth` - Sets the minimum allowed trace width during routing (e.g., `"0.15mm"`) + +```jsx + + + + + +``` + +These settings help ensure your traces meet manufacturing requirements and +handle the expected current loads. + +### Setting the `autorouter` + +Boards or [subcircuits](./subcircuit.mdx) can specify what autorouter should be +used to route any traces within them. + +Usually you'll want to use an autorouter preset: + +- `autorouter="auto"` - Uses the [platform configuration](../guides/running-tscircuit/platform-configuration.md). For tscircuit.com this defaults to `sequential-trace`. +- `autorouter="sequential-trace"` - Iterate over each trace and use tscircuit's fast built-in autorouter. This method is fast and deterministic but often fails with over 50 traces. +- `autorouter="auto-local"` - Use the platform configuration, but only route locally (do not make API calls) +- `autorouter="auto-cloud"` - Use the platform configuration for +- `autorouter="laser_prefab"` - Reserve prefabricated vias that can be reassigned during routing. Ideal for rapid-turn PCBs produced with laser ablation and mechanical drilling templates. +- `autorouter="auto_jumper"` - Route single-layer boards by inserting jumper wires when traces would otherwise cross. See the [Single Layer Jumper Autorouting guide](../guides/tscircuit-essentials/single-layer-jumper-autorouting.mdx) for a complete walkthrough. + +For complex boards with over 50 traces, you should use `autorouter="auto-cloud"` +to take advantage of tscircuit's cloud autorouters, which internally use the popular +[freerouting](https://github.com/freerouting/freerouting) library. + +### Tuning Router Work with `autorouterEffortLevel` + +`autorouterEffortLevel` lets you request more routing work from supported +autorouters. The current values in [`@tscircuit/props`](https://www.npmjs.com/package/@tscircuit/props) +are: + +- `"1x"` (fastest) +- `"2x"` +- `"5x"` +- `"10x"` +- `"100x"` (slowest / highest effort) + +Use lower values while iterating quickly, then increase effort for dense boards +or final route attempts. + +```tsx + + + + + +``` + +You can also specify a custom autorouter object to use your own autorouter. + + ( + + + + + + ) +`} /> + +Learn more about [the Autorouting API here](../web-apis/autorouting-api.mdx) + +:::tip Disable schematic output for mechanical fixtures +Set `schematicDisabled` when the schematic view would add clutter to the editor +or slow down complex mechanical assemblies. The prop is a simple boolean, so you +can add it without a value just like any other JSX attribute. + + ( + + + + ) +`}/> + +With `schematicDisabled` set, the schematic tab shows a placeholder instead of +attempting to lay out symbols or connections. +::: ### Custom Board Outlines @@ -34,7 +357,7 @@ You can specify a custom outline for your board by passing an `outline` prop. The PCB you get will have this outline cut out, this is great when you want a board that's not a rectangle! - ( ( { x: -22.5, y: 16.5 }, { x: -22.5, y: 24.5 }, ]} - - // These are currently required due to this issue: - // https://github.com/tscircuit/core/issues/564 - width="50mm" - height="50mm" /> ) `} /> +### Offsetting the board origin + +`width` and `height` set the board's bounding box (and thus the `pcbX`/`pcbY` +coordinate system) even when you're using a custom outline. Add +`outlineOffsetX` and `outlineOffsetY`—measured in millimeters, whether passed as +numbers or strings like `"5mm"`—to slide that outline relative to the bounding +box so `(0, 0)` lands where you expect. Positive offsets push the outline toward +increasing `pcbX`/`pcbY` coordinates. + +In this example the outline is shifted half the board's width and height so the +origin stays at the lower-left corner while the shape itself is centered: + + ( + + + + +) + +`} +/> + + +### Board Anchor Properties + +You can control the board's position and alignment using anchor properties: + +- `boardAnchorPosition`: Moves the board's anchor point to the specified coordinates +- `anchorAlignment`: Sets which part of the board the anchor point refers to + + ( + + + + + + + + + ) +`}/> + +#### Try Different Alignments + +```jsx +// This moves the board's center to position (1,2) + + + +``` + +#### How Anchoring Works +- The `anchorAlignment` prop determines which point on the board is considered the anchor point +- The `boardAnchorPosition` moves that anchor point to the specified (x,y) coordinates + +**Example Alignments**: +- `"center"` - Board is centered on the anchor point +- `"top_left"` - Top-left corner is at the anchor point +- `"top_right"` - Top-right corner is at the anchor point +- `"bottom_left"` - Bottom-left corner is at the anchor point +- `"bottom_right"` - Bottom-right corner is at the anchor point +- `"center_left"` - Middle of the left edge is at the anchor point +- `"center_right"` - Middle of the right edge is at the anchor point +- `"top_center"` - Top center point is at the anchor point +- `"bottom_center"` - Bottom center point is at the anchor point + ## Flexible PCBs :::info Interested in flexible PCBs? Upvote [this issue on Github](https://github.com/tscircuit/tscircuit/issues/510)! -::: \ No newline at end of file +::: diff --git a/docs/elements/breakout.mdx b/docs/elements/breakout.mdx new file mode 100644 index 00000000..fd787907 --- /dev/null +++ b/docs/elements/breakout.mdx @@ -0,0 +1,124 @@ +--- +title: +description: >- + A breakout is a container that lets you route nets out of a group at explicit or generated points. +--- + +## Overview + +A `` is similar to a [``](./group.mdx) but is meant for situations where you +want to guide the autorouter on where connections should exit the group. Inside +a breakout you can place [``](./breakoutpoint.mdx) elements to +define explicit exit locations, or let tscircuit generate breakout points for +connections that leave the breakout. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + +) +`} /> + +## Auto-Generated Breakout Points + +When traces connect from components inside a `` to components outside +of it, tscircuit can create the needed breakout points automatically. This keeps +the breakout local to the component cluster while still letting board-level +traces connect to headers and other surrounding parts. + +The example below routes a QFP16 controller inside a breakout to an external pin +header and nearby passives without adding any manual `` +elements. + + ( + + + + + + + + + + + + + + +) +`} /> + +## Properties + +`` accepts all the layout properties of `` plus a few extras: + +| Property | Description | +|----------|-------------| +| `padding` | Uniform padding around the breakout region. | +| `paddingLeft` / `paddingRight` / `paddingTop` / `paddingBottom` | Control padding for each side individually. | +| `autorouter` | Autorouter configuration inherited by children. | diff --git a/docs/elements/breakoutpoint.mdx b/docs/elements/breakoutpoint.mdx new file mode 100644 index 00000000..c7794911 --- /dev/null +++ b/docs/elements/breakoutpoint.mdx @@ -0,0 +1,32 @@ +--- +title: +description: >- + Specifies a PCB location where a connection inside a breakout should exit. +--- + +## Overview + +A `` marks the XY coordinate that the autorouter should use when +connecting a net or pin inside a [``](./breakout.mdx) to the rest of +the board. Breakout points only exist on the PCB and do not have a schematic +representation. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + +) +`} /> + +## Properties + +| Property | Description | +|----------|-------------| +| `connection` | Port or net selector inside the breakout that should connect here. | +| `pcbX` / `pcbY` | Board coordinates of the breakout point. | diff --git a/docs/elements/cadassembly.mdx b/docs/elements/cadassembly.mdx new file mode 100644 index 00000000..563ee7ad --- /dev/null +++ b/docs/elements/cadassembly.mdx @@ -0,0 +1,41 @@ +--- +title: +description: >- + A CAD assembly is a collection of cad models and constraints to "put together" + a component. +--- + +A CAD assembly is used to put together the 3D models of a component when multiple +models are used or "fit into" models in a particular way. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + } + /> + + ) + `} +/> diff --git a/docs/elements/cadmodel.mdx b/docs/elements/cadmodel.mdx new file mode 100644 index 00000000..5527e5ac --- /dev/null +++ b/docs/elements/cadmodel.mdx @@ -0,0 +1,203 @@ +--- +title: +description: >- + A CAD model is a 3D model of a component that can be used in a CAD assembly. +--- + +The `` element is used to display a 3D model of a component, it is +usually part of a [``](./cadassembly.mdx) or [``](./chip.mdx). + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + } + /> + + ) + `} +/> + +## Properties + +| Property | Type | Description | +|----------|------|-------------| +| `modelUrl` | `string` | URL to the 3D model file (GLB, GLTF, OBJ, STL, STEP, WRL) | +| `stepUrl` | `string` | URL to a STEP model file for export purposes | +| `positionOffset` | `{x: number, y: number, z: number}` | Offset the model position from the component center | +| `rotationOffset` | `number \| {x: number, y: number, z: number}` | Rotate the model (number = Z-axis rotation in degrees) | +| `zOffsetFromSurface` | `Distance` | Vertical offset from the PCB surface (e.g., "2mm", "0.1in") | +| `size` | `{x: number, y: number, z: number}` | Scale the model size | +| `showAsTranslucentModel` | `boolean` | Render the model as translucent | +| `modelUnitToMmScale` | `Distance` | Scale factor to convert model units to millimeters | + + +## Repositioning the Model + +You can use `positionOffset`, `rotationOffset`, and `zOffsetFromSurface` to reposition the model. + + ( + + + } + /> + + ) + `} +/> + +### Z-Offset from Surface + +Use `zOffsetFromSurface` to control the vertical distance of the model from the PCB surface. This is useful for components that need to be positioned above or below the board surface. + + ( + + + } + /> + + ) + `} +/> + +## Importing local GLB models + + ( + + } + /> + +) +`, +"./models/dip4.glb": `__STATIC_ASSET__` + }} +/> + +## Providing a STEP model + +You can provide a STEP model to the `` element by setting the `modelUrl`. +When providing a STEP model, the STEP model will be used when exporting to STEP to +preserve the exact geometry of the model. + + ( + + + } + /> + +) +`, + "./models/soic8.step": `__STATIC_ASSET__` + }} +/> + +### Translucent Model in cadmodel + +You can also use `showAsTranslucentModel` inside a ``. + + ( + + + } + /> + + ) + `} +/> + + + + +## Supported File Formats + +The following model file formats are supported: + +- GLB +- GLTF +- OBJ +- STEP +- STL +- WRL diff --git a/docs/elements/capacitor.mdx b/docs/elements/capacitor.mdx index 8229c93e..a5b73827 100644 --- a/docs/elements/capacitor.mdx +++ b/docs/elements/capacitor.mdx @@ -1,5 +1,93 @@ --- title: sidebar_position: 3 +description: >- + A `` stores electrical energy in an electric field. Capacitors + are commonly used for filtering, energy storage, and timing circuits. Unlike + resistors, capacitors can be polarized (like electrolytic capacitors) or + non-polarized (like ceramic capacitors). --- +## Overview + +A `` stores electrical energy in an electric field. Capacitors are commonly used for filtering, energy storage, and timing circuits. Unlike resistors, capacitors can be polarized (like electrolytic capacitors) or non-polarized (like ceramic capacitors). + +A capacitor element has two pins. Polarized capacitors must be placed with correct orientation to avoid damage. + +When specifying a capacitor, you'll need to provide a footprint string (like `0402` or `0805`) and capacitance value. Popular capacitor types and sizes can be found at [jlcsearch](https://jlcsearch.tscircuit.com/capacitors/list). + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) + + `} +/> + +## Pins + +A capacitor has the following pins and aliases: + +| Pin # | Aliases (Polarized) | Description | +| ---------- | ------- | ----------- | +| pin1 | pos, anode, left | The positive terminal (required for polarized capacitors) | +| pin2 | neg, cathode, right | The negative terminal (must be connected properly for polarized caps) | + +:::warning +For polarized capacitors, you must connect the positive and negative pins correctly. Reversing polarity can cause capacitor failure or even explosion! +::: + +## Specifications + +Capacitors can be configured with these key properties: + +- **capacitance** - The capacitance value specified as a string e.g. `"100nF"` or `"2.2μF"` +- **voltageRating** - Maximum voltage the capacitor can handle e.g. `"25V"` +- **tolerance** - Capacitance tolerance percentage e.g. `"±10%"` +- **temperatureCoefficient** - Temperature stability specification e.g. `"X7R"` +- **equivalentSeriesResistance** - ESR value for critical applications e.g. `"0.5Ω"` + +## Automatic Part Selection + +Like resistors, tscircuit will automatically select suitable capacitor parts based on your specifications through the [platform parts engine](../guides/running-tscircuit/platform-configuration.md). For specialized capacitors (e.g., low ESR, high voltage), you may want to specify `supplierPartNumbers` explicitly. + +## Schematic Orientation + +Polarized capacitors can display their positive and negative pins in different orientations. Use the `schOrientation` property to control the symbol orientation instead of manually setting `schRotation`. + +Valid orientation values are: + +- `horizontal` +- `vertical` +- `pos_left` +- `pos_right` +- `pos_top` +- `pos_bottom` +- `neg_left` +- `neg_right` +- `neg_top` +- `neg_bottom` + +```tsx +``` + diff --git a/docs/elements/chip.mdx b/docs/elements/chip.mdx index ad9717e3..5b4561ea 100644 --- a/docs/elements/chip.mdx +++ b/docs/elements/chip.mdx @@ -1,6 +1,8 @@ --- title: sidebar_position: 1 +description: >- + Used to represent virtually any single-part electronic component. Extremely flexible and supports custom footprints and pin arrangements. --- import CircuitPreview from "@site/src/components/CircuitPreview" @@ -23,6 +25,7 @@ interface Props extends CommonLayoutProps { export const A555Timer = (props: Props) => { return ( + { }} {...props} /> + ) } `} /> +:::note Active-low pin labels (top bar) +To render a pin label with a bar at the top in schematic view, prefix the label +with `N_` in `pinLabels`. + +- `RESET` renders as a normal label +- `N_RESET` renders as `RESET` with a top bar +::: + + ( + + + +) +`} /> + +## Properties + +| Property | Type | Description | +|----------|------|-------------| +| `name` | `string` | Component identifier (e.g., "U1") | +| [`footprint`](#custom-footprints) | `string \| Footprint` | PCB footprint string or custom `` element | +| `pinLabels` | `Record` | Mapping of pin numbers to labels (e.g., `{ pin1: "VCC" }`) | +| `connections` | `Record` | Pin-to-net mappings for wiring | +| `manufacturerPartNumber` | `string` | Manufacturer part number (MPN) | +| `supplierPartNumbers` | `Record` | Part numbers by supplier (e.g., `{ jlcpcb: ["C12345"] }`) | +| [`schPinArrangement`](#schpinarrangement) | `SchematicPortArrangement` | Pin layout on schematic box | +| [`schPinStyle`](#schpinstyles) | `Record` | Visual styling for schematic pins | +| `schPinSpacing` | `Distance` | Gap between pins in schematic | +| `schWidth` | `Distance` | Schematic symbol width | +| `schHeight` | `Distance` | Schematic symbol height | +| `pcbX`, `pcbY` | `Distance` | PCB board coordinates | +| `pcbRotation` | `number` | Rotation angle on PCB | +| [`pcbSx`](/guides/tscircuit-essentials/pcb-sx) | `PcbSx` | PCB style overrides for footprint primitives | +| `schX`, `schY` | `Distance` | Schematic coordinates | +| `schRotation` | `number` | Rotation angle on schematic | +| `layer` | `string` | PCB layer (e.g., "top", "bottom") | +| `cadModel` | `CadModelProp` | 3D model reference for visualization | +| [`internallyConnectedPins`](#internally-connected-pins) | `(string \\| number)[][]` | Groups of internally connected pins | +| [`externallyConnectedPins`](#externally-connected-pins) | `string[][]` | Groups of pins to be externally connected | +| [`noConnect`](#no-connect-pins) | `string[]` | Pins intentionally left unconnected (do-not-connect) | +| [`obstructsWithinBounds`](#obstructswithinbounds) | `boolean` | Whether component blocks placement within its bounds | +| `noSchematicRepresentation` | `boolean` | Omit from schematic view | +| `doNotPlace` | `boolean` | Exclude from PCB placement | +| [`allowOffBoard`](#allowoffboard) | `boolean` | Allow component to be placed outside PCB board boundary without DRC errors | +| `kicadFootprintMetadata` | [`KicadFootprintMetadata`](/guides/kicad/kicad-metadata#kicadfootprintmetadata) | KiCad footprint file metadata | +| `kicadSymbolMetadata` | [`KicadSymbolMetadata`](/guides/kicad/kicad-metadata#kicadsymbolmetadata) | KiCad symbol file metadata | + ## Customizing the Schematic Representation You can alter how a chip appears on the schematic by using the `schPinArrangement` , `schPinStyles` and `schWidth` properties. -#### `schPinArrangement` +### `schPinArrangement` `schPinArrangement` controls the arrangement of the pins on the schematic box representing the chip. You can use this to group similar pins together e.g. to @@ -131,7 +201,7 @@ export default () => ( ) `} /> -#### `schPinStyles` +### `schPinStyles` `schPinStyles` controls the style of the pins on the schematic box @@ -175,18 +245,6 @@ export default () => ( bottomMargin: "1mm" } }} - // This is the future syntax for schPinStyle! - // schPinStyle={{ - // pin1: { - // marginBottom: 0.2, - // }, - // GND: { marginRight: "0.5mm" }, - // THRES: { marginTop: 0.5 }, - // OUT: { - // marginTop: 1, - // marginBottom: "1mm", - // }, - // }} pinLabels={{ pin1: "VCC", pin2: "DISCH", @@ -294,6 +352,159 @@ export default () => ( For more information about custom footprints, check out the [ element](./footprint.mdx) +### `obstructsWithinBounds` + +By default, `` components occupy all of the PCB area inside their +footprint's bounding box, which prevents other components from being placed +inside that region. Set `obstructsWithinBounds={false}` to indicate that the +component leaves usable room within its outline (for example, when you are +representing a tall module that allows other chips to sit underneath). + +The example below manually constructs a footprint for a module-style chip and +places a second chip inside its body. Because the outer chip has +`obstructsWithinBounds={false}`, the inner chip—whose own +`obstructsWithinBounds` prop remains `true`—can safely occupy the same PCB +area. + + ( + + + + + + + + + } + /> + + +) +`} + /> + +### `allowOffBoard` + +By default, tscircuit generates a DRC error when a component is placed outside +the PCB board boundary. Use `allowOffBoard={true}` to explicitly allow a component +to extend beyond the board edge without triggering errors. This is useful for +connectors, indicators, or other components that intentionally protrude from the PCB. + + ( + + + +) +`} + /> + +![PCB viewer — component outside board error](/img/elements/chip-allow-offboard-error.svg) + +*Screenshot: PCB viewer — Example DRC error shown when a component extends beyond the board edge.* + +## Translucent Models + +You can render a component as translucent (semi-transparent) by setting `showAsTranslucentModel` on the component. + + ( + + + + + + } + /> + + ) + `} +/> + ### Internally Connected Pins Some chips, such as a standard 4 pin pushbutton, have pins that are internally @@ -360,20 +571,163 @@ export default () => ( `} /> -## Type-safe Chips: Custom Component Hooks +### No-Connect Pins -Component hooks are a great way to improve type safety and simplify the usage -of your component. A component hook is created with the `createUseComponent` -from `tscircuit` and returns a hook that when used, will generate a component -with properties for each pin label. +Use `noConnect` to mark pins that are intentionally left unconnected. This is a shorthand for do-not-connect pins without repeating `pinAttributes` entries. + + ( + + + +) + +`} /> + +## Specifying the Manufacturer Part Number or Supplier Part Numbers + +tscircuit will attempt to find matching parts based on the `manufacturerPartNumber` +and `footprint` that was provided. If you know the exact part from your supplier +you'd like to use, you should set the `supplierPartNumbers` property as shown +below: + + { + return ( + + + + + + + + + + + } + cadModel={{ + objUrl: + "https://modelcdn.tscircuit.com/easyeda_models/download?uuid=973acf8a660c48b1975f1ba1c890421a&pn=C57759", + rotationOffset: { x: 0, y: 0, z: 0 }, + positionOffset: { x: 0, y: 0, z: 0 }, + }} + schPinSpacing={0.75} + schPortArrangement={{ + leftSide: { + direction: "top-to-bottom", + pins: [1], + }, + rightSide: { + direction: "bottom-to-top", + pins: [2], + }, + }} + /> + + ) +} + + +`} + +/> + +If you don't specify `supplierPartNumbers`, tscircuit will automatically scan +for in-stock parts and select a chip using vendor APIs in the Cloud API using +the [platform parts engine](../guides/running-tscircuit/platform-configuration.md) + +### Supported Suppliers + +The following are the supported supplier keys. The list is [maintained here](https://github.com/tscircuit/props/blob/main/lib/common/layout.ts#L56) and you can [request additional suppliers by creating an issue](https://github.com/tscircuit/props/issues/new?template=Blank+issue&title=Supplier%20Request%3A%20) + +Available supplier keys: + +- jlcpcb +- digikey +- mouser +- macrofab +- pcbway +- lcsc + +You can also insert custom keys for your organization and they will be copied to +the output [Circuit JSON](https://github.com/tscircuit/circuit-json) + + +## Type-safe Chips: `ChipProps` and Chip Selectors + +tscircuit has a type called `ChipProps` that can be used to properly define +components that wrap a `` element. By using `ChipProps`, you're +making it + +```tsx +import { sel, type ChipProps } from "tscircuit" const pinLabels = { pin1: "VCC", @@ -386,15 +740,13 @@ const pinLabels = { pin8: "RESET" } as const -export const A555Timer = (props: Props) => ( +export const A555Timer = (props: ChipProps) => ( ) - -export const use555Timer = createUseComponent(A555Timer, pinLabels) ``` :::warning @@ -402,24 +754,25 @@ Make sure to have `as const` when you're defining your `pinLabels`, if you're missing this the types won't work! ::: -When you use Component Hooks, you get better type checking in your component usage -because all the pin labels are now available on the component! +You can also use the `sel` object to access the pins of a chip for traces! ```tsx -import { use555Timer } from "./a555timer" -import { usePowerRegulator } from "./power-regulator" +import { sel } from "tscircuit" +import { A555Timer } from "./a555timer" +import { PowerRegulator } from "./power-regulator" export default () => { - const U1 = use555Timer("U1") - const M1 = usePowerRegulator("M1") - return ( - - + - - + ) } @@ -433,3 +786,7 @@ guide! This is often much easier and reliable than configuring a chip yourself. - [Importing Components from JLCPCB](../guides/importing-modules-and-chips/importing-from-jlcpcb.mdx) - [Importing Components from KiCad](../guides/importing-modules-and-chips/importing-from-kicad.md) + +:::tip +If you're only looking to use an existing PCB footprint, you can skip importing entirely and reference it directly. For KiCad libraries, use the `kicad:` prefix (for example `footprint="kicad:Resistor_SMD/R_0402_1005Metric"`). For JLCPCB/EasyEDA parts, use the `jlcpcb:` prefix (for example `footprint="jlcpcb:C2040"`). See [KiCad Footprints](/footprints/kicad-footprints) and [JLCPCB Footprints](/footprints/jlcpcb-footprints) for details. +::: diff --git a/docs/elements/connector.mdx b/docs/elements/connector.mdx new file mode 100644 index 00000000..8a5a60d3 --- /dev/null +++ b/docs/elements/connector.mdx @@ -0,0 +1,153 @@ +--- +title: +description: A general-purpose connector component for board-to-board, cable, and edge interfaces. +--- + +## Overview + +A `` represents a physical connector on your board, such as a USB receptacle, wire terminal, or board-to-board header. It behaves similarly to `` for placement and footprint handling, but is specialized for connector use cases. + +Connectors support: + +- Custom pin naming via `pinLabels` +- Explicit internal shorting via `internallyConnectedPins` +- Schematic pin styling and arrangement controls +- Optional connector `standard` hints (currently `"usb_c"` and `"m2"`) + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Standard Connector Example + + ( + + + + ) + `} +/> + +## Custom Footprint Example + + ( + + + + + + + + + + + + } + /> + + ) + `} +/> + +This example is adapted from the core test for connector cable insertion center behavior: [connector-cable-insertion-center.test.tsx](https://github.com/tscircuit/core/blob/09243a083fae6aacad06b31b4439c58e722dffd0/tests/components/normal-components/connector-cable-insertion-center.test.tsx). + +## Cable insertion center + +When a connector footprint is rendered, tscircuit computes `pcb_component.cable_insertion_center` for the connector in circuit JSON. This gives a useful reference point for cable entry direction, annotation, or automation workflows. + +In the linked test, the computed cable insertion center is validated and then visualized as a small PCB note rectangle. + +## Properties + +The TypeScript interface for `` is defined in [`@tscircuit/props`](https://github.com/tscircuit/props/blob/main/lib/components/connector.ts): + +```ts +export interface ConnectorProps extends CommonComponentProps { + manufacturerPartNumber?: string + pinLabels?: Record< + number | SchematicPinLabel, + SchematicPinLabel | SchematicPinLabel[] + > + schPinStyle?: SchematicPinStyle + schPinSpacing?: number | string + schWidth?: number | string + schHeight?: number | string + schDirection?: "left" | "right" + schPortArrangement?: SchematicPortArrangement + internallyConnectedPins?: (string | number)[][] + standard?: "usb_c" | "m2" +} +``` + +| Property | Type | Description | +| --- | --- | --- | +| `manufacturerPartNumber` | `string` | Manufacturer part number for the connector. | +| `pinLabels` | `Record` | Maps connector pins to one or more net labels. | +| `schPinStyle` | `SchematicPinStyle` | Schematic rendering style for pins. | +| `schPinSpacing` | `number \| string` | Pin spacing in schematic symbol. | +| `schWidth` | `number \| string` | Schematic symbol width. | +| `schHeight` | `number \| string` | Schematic symbol height. | +| `schDirection` | `"left" \| "right"` | Direction of the connector symbol pins. | +| `schPortArrangement` | `SchematicPortArrangement` | Schematic port layout strategy. | +| `internallyConnectedPins` | `(string \| number)[][]` | Pin groups treated as internally shorted. | +| `standard` | `"usb_c" \| "m2"` | Optional connector standard hint. | + +Like most components, `` also accepts common placement and PCB props from `CommonComponentProps` such as `pcbX`, `pcbY`, `rotation`, and `footprint`. diff --git a/docs/elements/copperpour.mdx b/docs/elements/copperpour.mdx new file mode 100644 index 00000000..dea55d9c --- /dev/null +++ b/docs/elements/copperpour.mdx @@ -0,0 +1,101 @@ +--- +title: +description: >- + The `` element (also known as a groundplane) fills large areas of a layer + with copper tied to a specific net, helping with return paths, shielding, and + thermal performance. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element lets you quickly create a copper pour (groundplane) that +is connected to a specific net. Groundplanes improve signal integrity by giving +high-frequency and return currents a short path, reduce electromagnetic +interference, and act as a thermal sink for heat-producing components. + +A copper pour automatically flows around component keep-outs and pads while +maintaining a clearance gap that you control. + +## Basic Usage + +Add a copper pour to any board by connecting it to a net—most commonly +`net.GND`. The example below shows a top-layer pour surrounding a chip, with a +few traces stitching components back to ground. + + ( + + + + + + + + + + ) +`} /> + +## Copper Pour Properties + +| Property | Description | Example | +| -------- | ----------- | ------- | +| `connectsTo` | Net that the pour is tied to. Often `net.GND` or `net.VCC`. | `"net.GND"` | +| `layer` | PCB layer for the pour (`"top"`, `"bottom"`, or an inner layer name). | `"top"` | +| `clearance` | Default minimum distance between the pour and other features (e.g. pads, traces, board edge). This is used as a fallback for specific margin properties. Defaults to `0.2mm`. | `"0.3mm"` | +| `padMargin` | Minimum distance from component pads. Overrides `clearance`. | `"0.4mm"` | +| `traceMargin` | Minimum distance from traces on other nets. Overrides `clearance`. | `"0.1mm"` | +| `boardEdgeMargin` | Minimum distance from the board edge. Overrides `clearance`. | `"2mm"` | +| `cutoutMargin` | Minimum distance from board cutouts. Overrides `clearance`. | `"0.1mm"` | +| `thermalRelief` | Configure spoke width/count when attaching to pads. | `{ spokeWidth: "0.3mm", spokeCount: 4 }` | +| `outline` | Optional polygon describing a custom pour boundary. | `[{ x: -10, y: -8 }, { x: 10, y: -8 }, ...]` | + +## Creating Pours on Multiple Layers + +You can add separate pours for different layers to create stitched groundplanes +or dedicated power planes. + + ( + + + + + + + + + ) +`} /> + +Use vias tied to the same net to stitch pours between layers and further reduce +impedance. + +## Tips for Effective Groundplanes + +- Keep sensitive signal traces short and route them over solid groundplane + areas when possible. +- Use consistent clearances—tight enough to maximize copper, but wide enough to + satisfy fabrication rules. +- Add stitching vias between pours on different layers to reduce loop area. +- Consider splitting pours if you need isolated analog and digital ground + regions, connecting them at a single point. + +`` makes it easy to drop in broad ground coverage with sensible +defaults, while still giving you the control needed for detailed PCB layout. diff --git a/docs/elements/coppertext.mdx b/docs/elements/coppertext.mdx new file mode 100644 index 00000000..d1864bff --- /dev/null +++ b/docs/elements/coppertext.mdx @@ -0,0 +1,116 @@ +--- +title: +description: Add text directly as copper on one or more PCB layers. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element places text directly into the copper of your PCB. +This is useful for copper labels, exposed branding, test labels, or markings +that should become part of the copper geometry instead of silkscreen. + +Unlike ``, copper text is part of the conductive copper layer and +can be placed on one or more layers. + +## Basic Example + + ( + + + +) +`} +/> + +## Examples + +### Top and Bottom Copper Labels + + ( + + + + +) +`} +/> + +### Knockout Copper Text + + ( + + + +) +`} +/> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| `text` | `string` | Yes | - | Text content to render as copper | +| `pcbX` | `distance` | No | - | X position on the PCB | +| `pcbY` | `distance` | No | - | Y position on the PCB | +| `layer` | `string` | No | - | Single PCB layer for the copper text | +| `layers` | `string[]` | No | - | Multiple PCB layers to place the same text on | +| `fontSize` | `distance` | No | - | Font size | +| `font` | `"tscircuit2024"` | No | `"tscircuit2024"` | Font family | +| `anchorAlignment` | `nine-point anchor` | No | `"center"` | Alignment relative to the anchor position | +| `mirrored` | `boolean` | No | `false` | Mirror the text, useful for bottom-layer copper | +| `knockout` | `boolean` | No | `false` | Render the text as a cutout/negative shape in surrounding copper | +| `pcbRotation` | `angle` | No | `0` | Rotation of the text on the PCB | + +## Notes + +- Use `layer` for a single target layer and `layers` when you want the same + text repeated on multiple copper layers. +- If you want non-conductive labeling, use `` instead of + ``. diff --git a/docs/elements/courtyardcircle.mdx b/docs/elements/courtyardcircle.mdx new file mode 100644 index 00000000..c8fca594 --- /dev/null +++ b/docs/elements/courtyardcircle.mdx @@ -0,0 +1,65 @@ +--- +title: +description: Draw circular IPC courtyard markings around footprint features. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +Use `` inside a `` to define circular courtyard boundaries and clearance regions. + +## Basic Example + + ( + + + + + + + } + /> + +) +`} +/> + +## Filled Circle Example + + ( + + + + + + } + /> + +) +`} +/> diff --git a/docs/elements/courtyardoutline.mdx b/docs/elements/courtyardoutline.mdx new file mode 100644 index 00000000..5fa25117 --- /dev/null +++ b/docs/elements/courtyardoutline.mdx @@ -0,0 +1,77 @@ +--- +title: +description: Draw custom polygon courtyard boundaries for irregular package geometry. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +Use `` when your footprint needs a non-rectangular, non-circular courtyard shape. + +## Basic Outline Example + + ( + + + + + + + + + } + /> + +) +`} +/> + +## Filled Outline Example + + ( + + + + + + } + /> + +) +`} +/> diff --git a/docs/elements/courtyardrect.mdx b/docs/elements/courtyardrect.mdx new file mode 100644 index 00000000..87c800a3 --- /dev/null +++ b/docs/elements/courtyardrect.mdx @@ -0,0 +1,73 @@ +--- +title: +description: Draw rectangular IPC courtyard markings around a footprint body. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +Use `` to create rectangular courtyard boundaries for packages with rectangular bodies. + +## Basic Example + + ( + + + + + + + } + /> + +) +`} +/> + +## Dashed Courtyard Example + + ( + + + + + + + } + /> + +) +`} +/> diff --git a/docs/elements/crystal.mdx b/docs/elements/crystal.mdx new file mode 100644 index 00000000..b9e46358 --- /dev/null +++ b/docs/elements/crystal.mdx @@ -0,0 +1,37 @@ +--- +title: +sidebar_position: 7 +description: >- + A crystal oscillator provides a stable clock signal essential for timing + applications and microcontroller operations. +--- + +## Overview + +A crystal oscillator provides a stable clock signal essential for timing applications and microcontroller operations. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + )`} +/> + + +## Properties + +| Property | Type | Description | Example | +| ---------------- | --------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------- | +| `frequency` | number or string | The operating frequency of the crystal oscillator. | `16e6` or `"16MHz"` | +| `loadCapacitance`| number or string | The load capacitance required for stable operation. | `18pF` | +| `pinVariant` | PinVariant (optional) | Optional property to select a pin configuration variant if multiple options exist. | `"2pin"` | diff --git a/docs/elements/cutout.mdx b/docs/elements/cutout.mdx new file mode 100644 index 00000000..bb2a7fff --- /dev/null +++ b/docs/elements/cutout.mdx @@ -0,0 +1,121 @@ +--- +title: +description: >- + Remove material from a board outline to create slots, notches, or other interior shapes. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element removes material from a [``](./board.mdx) +outline. Use cutouts to add interior slots, mounting reliefs, wire passages, or +other custom shapes without editing the overall board outline. + +Cutouts are fabricated along with the board outline, so you can preview them in +the PCB view and expect them to be milled or routed during manufacturing. + +## Supported Shapes + +The `shape` prop determines how the cutout is interpreted: + +- `rect` (default) — remove a rectangular slot using `width` and `height`. +- `circle` — remove a circular opening using `radius` or `diameter`. +- `polygon` — remove a custom polygon defined by `points`. + +All shapes support `pcbX` and `pcbY` to position the cutout relative to the +board's origin. Dimensions accept either numbers (treated as millimeters) or +strings like `"3mm"`. + +## Examples + +### Multiple Cutout Shapes on One Board + +This board uses three different cutout shapes: a rectangular USB notch, a cable +pass-through circle, and a decorative polygon. + + ( + + + + + + )`} +/> + +### Rectangular Slot for Connectors + +Rectangular cutouts are ideal for panel-mount connectors or finger slots. Width +and height define the opening size. + + ( + + + + + )`} +/> + +### Circular Cable Relief + +Circular cutouts create pass-throughs for wires or alignment posts. Set either a +`radius` or `diameter` to size the opening. + + ( + + + + + )`} +/> + +### Custom Polygon Cutout + +Pass an array of `{ x, y }` points to `points` for complex shapes. Points are +specified in millimeters relative to the cutout's local origin, which is then +positioned with `pcbX` and `pcbY`. + + ( + + + + )`} +/> + diff --git a/docs/elements/diode.mdx b/docs/elements/diode.mdx index bbfa6e06..a2be8a9a 100644 --- a/docs/elements/diode.mdx +++ b/docs/elements/diode.mdx @@ -1,5 +1,40 @@ --- title: +description: >- + Diodes are semiconductor devices that allow current to flow primarily in one + direction, making them ideal for rectification, signal clipping, and + protection against reverse voltage. They are essential in power supply + circuits and for protecting sensitive components from voltage spikes. --- -The `` element is used to represent a diode. +## Overview + +Diodes are semiconductor devices that allow current to flow primarily in one direction, making them ideal for rectification, signal clipping, and protection against reverse voltage. They are essential in power supply circuits and for protecting sensitive components from voltage spikes. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) +`} +/> + +In this example, the diode is placed on a board using the default footprint "smd-diode". + +## Properties + +| Property | Type | Description | Example | +| ---------------- | -------- | -------------------------------------- | ------- | +| `forwardVoltage` | `number` | The forward voltage drop of the diode. | `0.7V` | + +## Pins + +Diodes have two pins: + +- `pin1`/`anode`/`pos` - The positive terminal where current enters. +- `pin2`/`cathode`/`neg` - The negative terminal where current exits. diff --git a/docs/elements/drccheck.mdx b/docs/elements/drccheck.mdx new file mode 100644 index 00000000..5ee34e04 --- /dev/null +++ b/docs/elements/drccheck.mdx @@ -0,0 +1,184 @@ +--- +title: +sidebar_position: 5.5 +description: >- + The `` element lets you add a custom design rule check that runs + against a circuit and emits circuit-json errors. +--- + +## Overview + +The `` element lets you add a custom design rule check close to the +components it applies to. Use it for project-specific rules that tscircuit does +not check automatically, such as "these two I2C devices must not share the same +address." + +A custom DRC uses a `checkFn`. The function can return: + +- a single circuit-json error object +- an array of circuit-json error objects +- `undefined`, `null`, or nothing when the rule passes + +## TMP117MAIDRVR I2C Address Conflict + +This example detects two TMP117MAIDRVR temperature sensors on the same I2C bus +with the same address configuration. Both sensors have `ADD0` pulled down +through a 10k resistor, and both share `SDA` and `SCL`, so they would respond at +the same I2C address. + +```tsx +import React from "react" + +export default () => ( + + + + + + + + + + + + + + + + + + + + + + + { + const chips = selectAll("chip[manufacturerPartNumber='TMP117MAIDRVR']") + const [chipA, chipB] = chips + if (!chipA || !chipB) return + + const aSda = chipA.getPort("SDA") + const bSda = chipB.getPort("SDA") + const aScl = chipA.getPort("SCL") + const bScl = chipB.getPort("SCL") + const aAdd0 = chipA.getPort("ADD0") + const bAdd0 = chipB.getPort("ADD0") + if (!aSda || !bSda || !aScl || !bScl || !aAdd0 || !bAdd0) return + + if ( + isConnected(aSda, bSda) && + isConnected(aScl, bScl) && + isPulledDown(aAdd0) && + isPulledDown(bAdd0) + ) { + return { + error_type: "source_component_misconfigured_error", + message: "Two TMP117MAIDRVR chips share the same I2C address", + source_component_ids: [ + chipA.getSourceComponent()!.source_component_id, + chipB.getSourceComponent()!.source_component_id, + ], + source_port_ids: [ + aSda.getSourcePort()!.source_port_id, + bSda.getSourcePort()!.source_port_id, + aScl.getSourcePort()!.source_port_id, + bScl.getSourcePort()!.source_port_id, + aAdd0.getSourcePort()!.source_port_id, + bAdd0.getSourcePort()!.source_port_id, + ], + } + } + }} + /> + +) +``` + +![Custom DRC error shown in the PCB viewer](/img/drc-check-error.png) + +*The emitted `source_component_misconfigured_error` appears in the viewer with +the message returned from `checkFn`.* + +## Props + +| Prop | Type | Description | +| ---- | ---- | ----------- | +| `name` | `string` | Optional name for the DRC rule. Use a stable, descriptive name such as `"tmp117maidrvr-i2c-address-conflict"`. | +| `checkFn` | `(ctx) => error \| error[] \| void \| Promise` | Function that runs after the circuit renders. Return circuit-json errors when the rule fails. | + +## Check Function Context + +The `checkFn` receives helpers for selecting elements and checking connectivity. + +| Helper | Description | +| ------ | ----------- | +| `select(selector)` | Select one component, port, or net using familiar tscircuit selectors such as `"U1.ADD0"` or `"net.GND"`. | +| `selectAll(selector)` | Select multiple components, ports, or nets. | +| `isConnected(a, b)` | Returns `true` when two selected items share connectivity. | +| `isPulledUp(a)` | Returns `true` when the item is connected or resistor-connected to `net.VCC` or `net.VDD`. | +| `isPulledDown(a)` | Returns `true` when the item is connected or resistor-connected to `net.GND`. | +| `getResistanceBetween(a, b)` | Returns `0` for a direct connection, a resistance value for a resistor path, or `null` when no resistor-only path is found. | + +## Selection Results + +`select` and `selectAll` return small wrapper objects instead of raw +circuit-json. This lets the check function stay close to normal tscircuit +concepts. + +Component selections support: + +- `getPort(name)` +- `getPorts()` +- `getSourceComponent()` +- `getPcbComponent()` + +Port selections support: + +- `getSourcePort()` +- `getPcbPort()` + +Net selections support: + +- `getSourceNet()` diff --git a/docs/elements/fiducial.mdx b/docs/elements/fiducial.mdx new file mode 100644 index 00000000..a11e65c5 --- /dev/null +++ b/docs/elements/fiducial.mdx @@ -0,0 +1,47 @@ +--- +title: +description: >- + A reference marker used for optical alignment during automated PCB assembly. +--- + +## Overview + +A fiducial is a reference marker placed on a PCB that pick-and-place machines use for optical alignment during automated assembly. It consists of a circular copper pad with soldermask clearance (pullback) around it, creating a high-contrast marker that's easily detected by machine vision systems. + +Fiducials do not have a schematic representation. + +Fiducials are typically placed at corners of the board or near fine-pitch components to ensure accurate component placement. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + )`} +/> + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| padDiameter | number \| string | - | Diameter of the copper pad (e.g., `"1mm"` or `1`) | +| soldermaskPullback | number \| string | padDiameter / 2 | Margin of soldermask clearance around the pad | +| pcbX | number | 0 | X position of the fiducial center on the PCB | +| pcbY | number | 0 | Y position of the fiducial center on the PCB | +| layer | `"top"` \| `"bottom"` | `"top"` | PCB layer for the fiducial | diff --git a/docs/elements/footprint.mdx b/docs/elements/footprint.mdx index d33b8c60..c694688c 100644 --- a/docs/elements/footprint.mdx +++ b/docs/elements/footprint.mdx @@ -1,4 +1,184 @@ --- title: +description: >- + Used to define the physical layout and connection points for components on a printed circuit board. --- +import CircuitPreview from '@site/src/components/CircuitPreview'; +## Overview + +Within a `` element you can define PCB elements such as [``](../footprints/platedhole.mdx) +or [``](../footprints/smtpad.mdx). + +Here's an example of a chip with a custom footprint: + + ( + + + + + + + + + + + + } + schPortArrangement={{ + leftSide: { + direction: "top-to-bottom", + pins: [1, 3], + }, + rightSide: { + direction: "bottom-to-top", + pins: [4, 2], + }, + }} + /> + +) +`} /> + + +## Reference Designator + +You can use `{NAME}`, `{REF}`, or `{REFERENCE}` in the `text` property of a [``](../footprints/silkscreentext.mdx) element within a footprint. When the PCB is rendered, these variables are automatically replaced with the name (reference designator) of the component. + +This is the standard way to label components on the silkscreen layer. + + ( + + + + + + + + + + + + + + } + /> + +) + `} +/> diff --git a/docs/elements/fuse.mdx b/docs/elements/fuse.mdx new file mode 100644 index 00000000..c9527e3e --- /dev/null +++ b/docs/elements/fuse.mdx @@ -0,0 +1,79 @@ +--- +title: +description: >- + A `` is a safety device that protects electrical circuits by + interrupting current flow when it exceeds a predetermined threshold. Fuses + are essential for preventing damage to components and circuits from + overcurrent conditions. +--- + +## Overview + +A `` is a safety device that protects electrical circuits by interrupting current flow when it exceeds a predetermined threshold. Fuses are essential for preventing damage to components and circuits from overcurrent conditions. + +A fuse element has two pins and is typically non-polar, meaning it can be placed in either direction. When the current through the fuse exceeds its current rating, the fuse "blows" or opens the circuit to prevent damage to downstream components. + +When specifying a fuse, you'll need to provide the current rating and optionally the voltage rating and footprint. Common fuse types include surface-mount, through-hole, and cartridge fuses. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) + + `} +/> + +## Pins + +A fuse has the following pins and aliases: + +| Pin # | Aliases | Description | +| ---------- | ------- | ----------- | +| pin1 | left, in | The input side pin in normal orientation | +| pin2 | right, out | The output side pin in normal orientation | + +## Properties + +| Property | Type | Required | Description | Example | +| -------- | ---- | -------- | ----------- | ------- | +| `currentRating` | `number \| string` | Yes | The current rating at which the fuse will blow | `"2A"`, `1.5`, `"500mA"` | +| `voltageRating` | `number \| string` | No | The maximum voltage the fuse can safely interrupt | `"32V"`, `250` | +| `schShowRatings` | `boolean` | No | Whether to display the ratings on the schematic symbol | `true`, `false` | +| `schOrientation` | `string` | No | The orientation of the fuse in the schematic | `"left"`, `"right"`, `"up"`, `"down"` | + +## Current Ratings + +Fuses are available in a wide range of current ratings from microamps to hundreds of amperes. Common current ratings include: + +- **Low current**: 100mA, 250mA, 500mA, 1A +- **Medium current**: 2A, 3A, 5A, 10A +- **High current**: 15A, 20A, 30A and above + +The current rating should be chosen based on the normal operating current of your circuit, typically 1.5-2x the expected current to avoid nuisance blowing. + +## Voltage Ratings + +The voltage rating indicates the maximum voltage the fuse can safely interrupt when it blows. Common voltage ratings include: + +- **Low voltage**: 32V, 63V (for automotive and low-voltage applications) +- **AC mains**: 125V, 250V (for household and industrial applications) +- **High voltage**: 600V and above (for industrial and power applications) + +## Schematic Display Options + +The `schShowRatings` property controls whether the current and voltage ratings are displayed on the schematic symbol. This can be helpful for documentation but may clutter dense schematics. + +The `schOrientation` property allows you to control how the fuse is oriented in the schematic layout for better routing and readability. + diff --git a/docs/elements/group.mdx b/docs/elements/group.mdx new file mode 100644 index 00000000..3789904f --- /dev/null +++ b/docs/elements/group.mdx @@ -0,0 +1,285 @@ +--- +title: +description: A group is the basic container element that can contain other elements. +--- + +A group is the basic container element that can contain other elements. + +By default, a group doesn't have any effect on the circuit. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + ) + `} +/> + +## Props + +| Prop | Type | Description | +| --- | --- | --- | +| `name` | `string` | Optional identifier for the group element. | +| `children` | `any` | Elements that will be rendered inside the group. | +| `schTitle` | `string` | Title displayed above the group in the schematic view. | +| `showAsSchematicBox` | `boolean` | When true, renders the group as a single schematic box. | +| `connections` | `Connections` | Map of external pin names to internal connection targets. | +| `schPinArrangement` | `SchematicPinArrangement` | Controls the ordering and sides of pins when shown as a schematic box. | +| `schPinSpacing` | `Distance` | Adjusts the spacing between schematic pins in box mode. | +| `schPinStyle` | `SchematicPinStyle` | Styles applied to individual pins in schematic box mode. | +| `pcbWidth` / `pcbHeight` | `Distance` | Override the PCB footprint width or height for the group box. | +| `schWidth` / `schHeight` | `Distance` | Override the schematic box width or height. | +| `pcbLayout` / `schLayout` | `LayoutConfig` | Advanced layout configuration objects applied to PCB or schematic views. | +| `cellBorder` / `border` | `Border \| null` | Custom border styling for the group when rendered as a cell or schematic box. | +| `schPadding*` | `Distance` | Sets overall or per-side padding around schematic contents (`schPadding`, `schPaddingLeft`, etc.). | +| `pcbPadding*` | `Distance` | Sets overall or per-side padding around PCB contents (`pcbPadding`, `pcbPaddingLeft`, etc.). | +| `pcbPositionAnchor` | `AutocompleteString` | Anchor used when interpreting `pcbX`/`pcbY` relative to `pcbPosition`. | + +### Grid Layout Props + + ( + + + + + + + + + ) + `} +/> + +| Prop | Type | Description | +| --- | --- | --- | +| `pcbGrid` / `schGrid` | `boolean` | Enables CSS grid style layout in the PCB or schematic view. | +| `pcbGridCols` / `schGridCols` | `number \| string` | Sets the number of columns in the grid. | +| `pcbGridRows` / `schGridRows` | `number \| string` | Sets the number of rows in the grid. | +| `pcbGridTemplateRows` / `schGridTemplateRows` | `string` | Explicit template row sizes for the grid. | +| `pcbGridTemplateColumns` / `schGridTemplateColumns` | `string` | Explicit template column sizes for the grid. | +| `pcbGridTemplate` / `schGridTemplate` | `string` | Shorthand template definition covering both rows and columns. | +| `pcbGridGap` / `schGridGap` | `number \| string` | Sets the row and column gap simultaneously. | +| `pcbGridRowGap` / `schGridRowGap` | `number \| string` | Sets the gap between rows. | +| `pcbGridColumnGap` / `schGridColumnGap` | `number \| string` | Sets the gap between columns. | + +### Flex Layout Props + + ( + + + + + + + + ) + `} +/> + +| Prop | Type | Description | +| --- | --- | --- | +| `pcbFlex` / `schFlex` | `boolean \| string` | Enables flex layout for PCB or schematic contents; string values pass raw CSS flex settings. | +| `pcbFlexGap` / `schFlexGap` | `number \| string` | Gap between items in a flex layout. | +| `pcbFlexDirection` / `schFlexDirection` | `"row" \| "column"` | Controls primary axis direction. | +| `pcbAlignItems` / `schAlignItems` | `"start" \| "center" \| "end" \| "stretch"` | Aligns items on the cross axis. | +| `pcbJustifyContent` / `schJustifyContent` | `"start" \| "center" \| "end" \| "stretch" \| "space-between" \| "space-around" \| "space-evenly"` | Aligns items on the main axis. | +| `pcbFlexRow` / `schFlexRow` | `boolean` | Convenience booleans for forcing row direction. | +| `pcbFlexColumn` / `schFlexColumn` | `boolean` | Convenience booleans for forcing column direction. | +| `pcbGap` / `schGap` | `number \| string` | Legacy alias for flex gap sizing. | +| `pcbPack` / `schPack` | `boolean` | Enables flexbox packing utilities. | +| `pcbPackGap` | `number \| string` | Gap used when `pcbPack` is enabled. | +| `schMatchAdapt` | `boolean` | In schematic flex layouts, match the adaptive flex sizing of PCB contents. | + +## Showing a group as a schematic box + +Use `showAsSchematicBox` to collapse a group into one schematic box with named +pins. This is useful for modules and reusable blocks where the internal +implementation should stay hidden in the schematic. + +Only direct child `` elements are shown as box pins. Internal components +and connectivity still exist for PCB and netlist generation, but their schematic +symbols, traces, labels, and primitives are hidden inside the collapsed box. + + ( + + + + + + + + + ) + `} +/> + +External components can connect to a collapsed group with the group name and +direct port name: + +```tsx + +``` + +### Creating ports from `connections` + +For collapsed groups, each key in `connections` becomes an external box pin and +each value points to the internal target. If a matching direct `` +already exists, tscircuit uses it instead of creating a duplicate. + +```tsx + + + +``` + +`schPinArrangement`, `schPinSpacing`, `schPinStyle`, `schWidth`, and +`schHeight` work on collapsed groups the same way they work on chip schematic +boxes. + +## Example: LED matrix module + +Collapsed schematic boxes are useful when a group contains repetitive internal +circuits. This 3x3 LED matrix exposes row and column pins while hiding the +individual LEDs in the schematic. + + ( + + + + + + + + + + + + + + + + + + + + + ) + `} +/> + +## Moving multiple components via a `` + +`` elements can be used to move multiple components at once. + +In the example below every schematic symbol inside the `` will be moved +5mm to the right and 3mm up. + +```tsx + + + + + +``` + +We can similarly use a `` to move multiple PCB elements at once: + +```tsx + + + + + +``` diff --git a/docs/elements/hole.mdx b/docs/elements/hole.mdx new file mode 100644 index 00000000..a6fd30ef --- /dev/null +++ b/docs/elements/hole.mdx @@ -0,0 +1,123 @@ +--- +title: +description: >- + Used for mounting and does not have conductive properties. +--- + +## Overview + +A hole can be used for mounting and doesn't have any conductive properties, for +a hole with a conductive ring of copper see [``](../footprints/platedhole.mdx). + +Holes do not have a schematic representation. + +Holes can be used inside of a [``](./footprint.mdx) or +as a standalone element. + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Hole Shapes + +Three hole shapes are supported: + +- `circle` - A circular hole (default) +- `pill` - A pill-shaped hole (rounded rectangle) +- `rect` - A rectangular hole + +### Circle Hole + +A circular hole is the most common type used for mounting. Provide either +`diameter` or `radius`: + + ( + + + + )`} +/> + +### Pill-Shaped Hole + +Pill-shaped holes are useful for mounting components that need elongated holes or for allowing some positional adjustment: + + ( + + + + )`} +/> + +### Rectangular Hole + +Rectangular holes are useful when you need a slot with straight edges: + + ( + + + + )`} +/> + +### Rotated Pill Hole + +Pill-shaped and rectangular holes can be rotated using the `pcbRotation` +property: + + ( + + + + )`} +/> + +## Properties + +| Property | Shape | Type | Default | Description | +|----------|-------|------|---------|-------------| +| shape | all | `"circle"` \| `"pill"` \| `"rect"` | `"circle"` | Shape of the hole | +| diameter | circle | number \| string | - | Diameter of the circular hole | +| radius | circle | number \| string | - | Radius of the circular hole | +| width | pill, rect | number \| string | - | Width of the pill-shaped or rectangular hole | +| height | pill, rect | number \| string | - | Height of the pill-shaped or rectangular hole | +| solderMaskMargin | all | number \| string | - | Solder mask opening margin around the hole | +| coveredWithSolderMask | all | boolean | - | Whether the hole should be covered by solder mask | +| pcbX | all | number | 0 | X position of the hole center on the PCB | +| pcbY | all | number | 0 | Y position of the hole center on the PCB | +| pcbRotation | pill, rect | number \| string | 0 | Rotation angle in degrees (e.g., `"45deg"` or `45`) | diff --git a/docs/elements/inductor.mdx b/docs/elements/inductor.mdx new file mode 100644 index 00000000..a5192de6 --- /dev/null +++ b/docs/elements/inductor.mdx @@ -0,0 +1,125 @@ +--- +title: +sidebar_position: 4 +description: >- + An `` stores electrical energy in a magnetic field when current + flows through it. Inductors are commonly used in filters, oscillators, power + supplies, and RF circuits. They oppose changes in current flow and can smooth + out rapid current variations. +--- + +## Overview + +An `` stores electrical energy in a magnetic field when current flows through it. Inductors are commonly used in filters, oscillators, power supplies, and RF circuits. They oppose changes in current flow and can smooth out rapid current variations. + +An inductor element has two pins and is non-polar, meaning it doesn't matter which direction you place it (unlike capacitors, inductors work the same way regardless of orientation). + +When specifying an inductor, you'll need to provide a footprint string (like `0402`, `0603`, or larger sizes for higher inductance values) and inductance value. Popular inductor types and sizes can be found at [jlcsearch](https://jlcsearch.tscircuit.com/inductors/list). + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) + + `} +/> + +## Pins + +An inductor has the following pins and aliases: + +| Pin # | Aliases | Description | +| ---------- | ------- | ----------- | +| pin1 | left, 1 | The first terminal of the inductor | +| pin2 | right, 2 | The second terminal of the inductor | + +:::info +Since inductors are non-polar components, pin1 and pin2 are functionally equivalent and can be connected in either direction. +::: + +## Specifications + +Inductors can be configured with these key properties: + +- **inductance** - The inductance value specified as a string e.g. `"10μH"`, `"100nH"`, or `"1mH"` +- **currentRating** - Maximum current the inductor can handle e.g. `"500mA"` or `"2A"` +- **tolerance** - Inductance tolerance percentage e.g. `"±20%"` or `"±10%"` +- **dcResistance** - DC resistance of the inductor windings e.g. `"0.1Ω"` +- **saturationCurrent** - Current at which the inductor begins to saturate e.g. `"800mA"` +- **selfResonantFrequency** - Frequency at which the inductor becomes capacitive e.g. `"100MHz"` + +## Automatic Part Selection + +Like resistors and capacitors, tscircuit will automatically select suitable inductor parts based on your specifications through the [platform parts engine](../guides/running-tscircuit/platform-configuration.md). For specialized inductors (e.g., high-frequency RF inductors, power inductors with specific core materials), you may want to specify `supplierPartNumbers` explicitly. + +## Common Use Cases + +### Power Supply Filtering +Inductors are essential in switching power supplies for energy storage and filtering: + + ( + + + + + + ) + `} +/> + +### RF Circuits +Small inductors are used in RF circuits for impedance matching and filtering: + + ( + + + + ) + `} +/> + +## Footprint Guidelines + +Choose inductor footprints based on your power and frequency requirements: + +- **0402/0603** - Low-power, high-frequency applications (RF, small signal filtering) +- **0805/1206** - Medium-power applications (DC-DC converters, general filtering) +- **Larger packages** - High-power applications (power supplies, motor drives) +- **Shielded inductors** - Applications requiring low EMI (switch-mode power supplies) + +Larger footprints generally allow for higher inductance values and current ratings, while smaller footprints are better for high-frequency applications. diff --git a/docs/elements/jumper.mdx b/docs/elements/jumper.mdx new file mode 100644 index 00000000..15d88991 --- /dev/null +++ b/docs/elements/jumper.mdx @@ -0,0 +1,83 @@ +--- +title: +description: A simple connector that typically uses a pinrow footprint but can be used for custom layouts as well. +--- + +## Overview + +A `` represents a small multi-pin connector, commonly a male or female header using a `pinrow` style footprint. You can think of it as a flexible connector that can be placed anywhere on the board much like a ``. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) + `} +/> + +The example above is adapted from the [core tests](https://github.com/tscircuit/core/blob/main/tests/components/normal-components/jumper.test.tsx). + +## Properties + +`` shares many of the common component properties such as `pcbX`, `pcbY` and `footprint`. The full TypeScript interface is defined in [`@tscircuit/props`](https://github.com/tscircuit/props/blob/main/lib/components/jumper.ts): + +```ts +export interface JumperProps extends CommonComponentProps { + manufacturerPartNumber?: string + pinLabels?: Record + schPinStyle?: SchematicPinStyle + schPinSpacing?: number | string + schWidth?: number | string + schHeight?: number | string + schDirection?: "left" | "right" + schPortArrangement?: SchematicPortArrangement + /** Number of pins on the jumper (2 or 3) */ + pinCount?: 2 | 3 + /** + * Groups of pins that are internally connected + * e.g., [["1","2"], ["2","3"]] + */ + internallyConnectedPins?: string[][] +} +``` + +Jumpers are often placed using footprints such as `pinrow8` or `pinrow6_female_rows2`, but you can also provide a custom `` just like with ``. + +### Internally Connected Pins + +Use the `internallyConnectedPins` prop when the jumper has pins that should be shorted (bridged) together by default. Pins can be referenced by their labels. + + ( + + + + ) + `} +/> + +| Property | Type | Description | +| -------- | ---- | ----------- | +| `pinCount` | `2` \| `3` | Number of pins on the jumper | +| `internallyConnectedPins` | `string[][]` | Groups of pins that are internally connected | +| `manufacturerPartNumber` | `string` | Manufacturer part number | +| `pinLabels` | `Record` | Labels for pins or sets of pins | +| `schPinStyle` | `SchematicPinStyle` | Style used for pins in the schematic | +| `schPinSpacing` | `number` \| `string` | Spacing between schematic pins | +| `schWidth` | `number` \| `string` | Width of the schematic symbol | +| `schHeight` | `number` \| `string` | Height of the schematic symbol | +| `schDirection` | `"left"` \| `"right"` | Direction the jumper faces in the schematic | +| `schPortArrangement` | `SchematicPortArrangement` | Arrangement of ports in the schematic | diff --git a/docs/elements/led.mdx b/docs/elements/led.mdx index 776e616a..d704c07e 100644 --- a/docs/elements/led.mdx +++ b/docs/elements/led.mdx @@ -1,5 +1,68 @@ --- title: +description: >- + Light emitting diodes are diodes that emit light when current + passes through them. They are commonly used as indicators on a circuit board + such as a "power on indicator" or "data transfer in progress indicator --- -The `` element is used to represent an LED. +## Overview + +Light emitting diodes are [diodes](./diode.mdx) that emit light when current +passes through them. They are commonly used as indicators on a circuit board +such as a "power on indicator" or "data transfer in progress indicator". + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) +`} +/> + +## Properties + +| Property | Example Value | Description | +| ---------------- | ------------- | ---------------------------------------------------------------- | +| `color` | `red` | The color of the LED. `red` LEDs are most common. | +| `forwardVoltage` | `1.6V` | The voltage drop across the LED when forward current is applied. | + +### Color Example + +Here's an example showing how to use different LED colors in a board layout: + + ( + + + + + + ) +`} +/> + +### Common LED Footprints + +The following represent the most common footprints for LEDs based on [jlcsearch](https://jlcsearch.tscircuit.com), +you can provide these as the `footprint` property to the `led` element e.g. `` + +| Footprint | ~JLCPCB Popularity | +| --------- | ------------------ | +| `led0603` | 37% | +| `led0805` | 23% | +| `led1206` | 10% | +| `led0402` | 4% | + +## Automatic Part Selection + +LEDs are automatically selected according to their color and footprint using +the [platform parts engine](../guides/running-tscircuit/platform-configuration.md) diff --git a/docs/elements/mosfet.mdx b/docs/elements/mosfet.mdx new file mode 100644 index 00000000..610c75b1 --- /dev/null +++ b/docs/elements/mosfet.mdx @@ -0,0 +1,33 @@ +--- +title: +description: >- + A MOSFET or "metal-oxide-semiconductor field-effect transistor" is a type of + transistor that is used to control the flow of current through a circuit. +--- + +## Overview + +A MOSFET or "metal-oxide-semiconductor field-effect transistor" is a type of transistor that is used to control the flow of current through a circuit. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + ) +`} +/> + +## Properties + +| Property | Description | Example | +| ------------- | --------------------------------------------------- | ------------- | +| `channelType` | The type of channel the MOSFET has (`n`, `p`) | `"n"` | +| `mosfetMode` | The mode of the MOSFET (`enhancement`, `depletion`) | `"depletion"` | diff --git a/docs/elements/net.mdx b/docs/elements/net.mdx index 9670a844..2247f792 100644 --- a/docs/elements/net.mdx +++ b/docs/elements/net.mdx @@ -1,5 +1,54 @@ --- title: -sidebar_position: 5 +sidebar_position: 6.5 +description: >- + The `` element represents a bunch of traces that are all connected. You + should use nets for representing power buses such as "V5", "V3_3" and "GND" --- +## Overview + +The `` element represents a bunch of traces that are all connected. You +should use nets for representing power buses such as "V5", "V3_3" and "GND" + +When using a ``, you're being less specific than when you explicitly +connect ports with `` elements. A net simply groups together traces +that share the same name, letting the autorouter handle the actual routing +between them. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + ) + `} +/> + + +## Net Properties + +Nets can have properties that will pass onto any PCB trace within them. The +trace properties can be automatically used for autorouting adjustments or to +validate connections (such as validating that a chip is connected to a power +source) + +| Property | Description | +| -------- | ----------- | +| `isForPower` | The net is used to deliver power ("V5", "V3_3") | +| `isGround` | The net is used as a ground path | + +## Implicit Nets + +If you use a net in a [port or net selector](../guides/tscircuit-essentials/port-and-net-selectors.md) +e.g. `"net.V5"` and there is not ``, then you are implicitly +creating that net. tscircuit treats it exactly as if you had declared +`` in your design. diff --git a/docs/elements/netlabel.mdx b/docs/elements/netlabel.mdx new file mode 100644 index 00000000..54990b7f --- /dev/null +++ b/docs/elements/netlabel.mdx @@ -0,0 +1,80 @@ +--- +title: +description: >- + The `` element attaches a text label to a net on the schematic. + It replaces the old `` element. +--- + +## Overview + +`` places a small label on a schematic net so you can easily +identify power rails and other connections. It is especially useful in +conjunction with the `connections` prop of components or modules to +show where a net connects. + +import CircuitPreview from "@site/src/components/CircuitPreview" + +The preview below uses `leftView="code"` and `rightView="schematic"` to show the +schematic alongside the example code. + + ( + + + + + + ) + `} +/> + +## Properties + +| Property | Description | Example | +| -------- | ----------- | ------- | +| `net` | Name of the net that the label represents | `"VCC"` | +| `connection` | [Port selector](../guides/tscircuit-essentials/port-and-net-selectors.md) of the point the label attaches to | `"U1.VCC"` | +| `anchorSide` | Which side of the connection to place the label. One of `"top"`, `"bottom"`, `"left"`, or `"right"` | `"top"` | +| `schX`, `schY` | Position of the label on the schematic | `0`, `-1` | +| `text` | Custom text for the label (defaults to the net name) | `"V3_3"` | + +Use `` to clearly mark nets in your schematic, especially for +power rails or when multiple wires join at a single connection point. diff --git a/docs/elements/opamp.mdx b/docs/elements/opamp.mdx new file mode 100644 index 00000000..f17841bf --- /dev/null +++ b/docs/elements/opamp.mdx @@ -0,0 +1,70 @@ +--- +title: +sidebar_position: 4.5 +description: >- + An operational amplifier element for analog circuits with built-in input, + output, and supply pin aliases. +--- + +## Overview + +An `` represents an operational amplifier. It is useful for analog +circuits such as gain stages, filters, and signal conditioning blocks. + +The element includes the standard op-amp connections for the inverting input, +non-inverting input, output, and power pins. + +For parts with unusual pinouts or extra control pins, prefer [``](./chip.mdx). + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + +) +`} +/> + +In this example, the op-amp is placed on a board and connected to named input, +output, and supply nets. + +## Properties + +| Property | Description | Example | +| -------- | ----------- | ------- | +| `connections` | Net connections for the standard op-amp pins. | `{ output: "net.OUT" }` | +| `footprint` | PCB footprint string or custom footprint. | `"soic8"` | +| `symbolName` | Override the default schematic symbol name. | `"opamp_with_power"` | + +## Pins + +An op-amp has the following pins and aliases: + +- `pin1`/`non_inverting_input` - The non-inverting input +- `pin2`/`inverting_input` - The inverting input +- `pin3` or `pin4`/`output` - The output pin +- `pin4` or `pin5`/`positive_supply`/`vcc`/`vdd` - The positive supply pin +- `pin5` or `pin3`/`negative_supply`/`vee`/`vss`/`gnd` - The negative supply pin + +If you need a different pinout, multiple amplifier channels in one package, or +extra enable/offset pins, use [``](./chip.mdx) with explicit +`pinLabels`. diff --git a/docs/elements/pcbnotedimension.mdx b/docs/elements/pcbnotedimension.mdx new file mode 100644 index 00000000..bba36810 --- /dev/null +++ b/docs/elements/pcbnotedimension.mdx @@ -0,0 +1,74 @@ +--- +title: +description: The `` element adds dimension annotations to PCBs showing measurements between two points. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +`` lets you add dimensional annotations to your PCB design. These annotations display the distance between two points with arrows and an automatically generated measurement label, making it easy to communicate critical measurements for manufacturing, assembly, or design review. Dimension annotations are visible in PCB previews and can be exported with fabrication outputs. + +## Basic Usage + +Below is a simple board with a dimension annotation showing the distance between two components. The dimension line connects two points and displays a label with the measurement. + + ( + + + + + + ) + `} +/> + +## Using Selectors + +Instead of specifying exact coordinates, you can use selectors to reference components. The dimension will automatically point to the component's position. + + ( + + + + + + ) + `} +/> + +## Properties + +| Property | Type | Description | +|---------|------|-------------| +| `from` | string \| Point | **Required.** Starting point of the dimension. Can be a selector string (e.g., `"R1"`) or a Point object with `x` and `y` coordinates. | +| `to` | string \| Point | **Required.** Ending point of the dimension. Can be a selector string (e.g., `"R2"`) or a Point object with `x` and `y` coordinates. | +| `text` | string | Optional custom label text to override the auto-generated measurement (e.g., `"Critical spacing"`). | +| `arrowSize` | length | Size of the arrows at each end of the dimension line. Defaults to `1mm`. | +| `fontSize` | length | Height of the label text. Defaults to `1mm`. | +| `color` | string | Hex color code for the dimension line, arrows, and text (e.g., `"#ffffff"`, `"#00ff00"`). | +| `font` | enum | Font type for the text. Currently only `"tscircuit2024"` is supported. Optional. | +| `offset` | length | Distance to offset the dimension line from the direct path between points. | +| `pcbRelative` | boolean | When `true`, coordinates are relative to the parent group instead of the board origin. | +| `relative` | boolean | Similar to `pcbRelative`, applies to both PCB and schematic coordinates when used inside groups. | diff --git a/docs/elements/pcbnoteline.mdx b/docs/elements/pcbnoteline.mdx new file mode 100644 index 00000000..b50cbb9c --- /dev/null +++ b/docs/elements/pcbnoteline.mdx @@ -0,0 +1,101 @@ +--- +title: +description: Draw straight lines on your PCB for annotations, guides, and visual indicators. +--- + +## Overview + +The `` element draws straight lines on the PCB. It's useful for creating visual guides, marking boundaries, connecting annotations, or highlighting specific areas of your board. + +Lines can be solid or dashed, and can be customized with different colors and stroke widths. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) +`} +/> + +## Basic Examples + +### Simple Horizontal and Vertical Lines + + ( + + + + +) +`} +/> + +### Creating a Border Frame + + ( + + + + + + + +) +`} +/> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| x1 | distance | Yes | - | X coordinate of the line start point | +| y1 | distance | Yes | - | Y coordinate of the line start point | +| x2 | distance | Yes | - | X coordinate of the line end point | +| y2 | distance | Yes | - | Y coordinate of the line end point | +| strokeWidth | distance | No | 0.1 | Width of the line stroke in mm | +| color | string | No | - | Line color as hex string (e.g., "#ff0000") | +| isDashed | boolean | No | false | Whether the line is drawn with dashes | diff --git a/docs/elements/pcbnotepath.mdx b/docs/elements/pcbnotepath.mdx new file mode 100644 index 00000000..023d511c --- /dev/null +++ b/docs/elements/pcbnotepath.mdx @@ -0,0 +1,126 @@ +--- +title: +description: Draw complex paths and polylines on your PCB using multiple connected points. +--- + +## Overview + +The `` element draws complex paths made up of multiple connected line segments on the PCB. It's useful for creating custom shapes, arrows, measurement indicators, or any annotation that requires multiple connected points. + +Unlike `` which draws a single straight line, `` allows you to define a series of points that are connected in sequence. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) +`} +/> + +## Basic Examples + +### Simple Zigzag Path + + ( + + + +) +`} +/> + +### Arrow Shape + + ( + + + +) +`} +/> + +### Star Pattern + + ( + + + +) +`} +/> + + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| route | array | Yes | - | Array of points defining the path. Each point is an object with `x` and `y` coordinates | +| strokeWidth | distance | No | 0.1 | Width of the path stroke in mm | +| color | string | No | - | Path color as hex string (e.g., "#ff0000") | diff --git a/docs/elements/pcbnoterect.mdx b/docs/elements/pcbnoterect.mdx new file mode 100644 index 00000000..3d024b01 --- /dev/null +++ b/docs/elements/pcbnoterect.mdx @@ -0,0 +1,146 @@ +--- +title: +description: Draw rectangles on your PCB to highlight areas, create visual boundaries, and organize board sections. +--- + +## Overview + +The `` element draws rectangles on the PCB. It's useful for highlighting specific areas, creating visual boundaries, marking keep-out zones, or organizing sections of your board layout. + +Rectangles can be outlined, filled, or both, with customizable colors and stroke styles. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) +`} +/> + +## Basic Examples + +### Simple Outlined Rectangle + + ( + + + +) +`} +/> + +### Filled Rectangle + + ( + + + +) +`} +/> + +### Dashed Border Rectangle + + ( + + + + +) +`} +/> + +### Using Color Names + +Any web-compatible color name or hex code can be used for the `color` property. + + ( + + + +) +`} +/> + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| pcbX | distance | Yes | - | X coordinate of the rectangle center | +| pcbY | distance | Yes | - | Y coordinate of the rectangle center | +| width | distance | Yes | - | Width of the rectangle in mm | +| height | distance | Yes | - | Height of the rectangle in mm | +| strokeWidth | distance | No | 0.1 | Width of the rectangle border in mm | +| color | string | No | - | Rectangle color as a web-compatible color name or hex string (e.g., "yellow", "#ff0000") | +| isFilled | boolean | No | false | Whether the rectangle is filled with color | +| hasStroke | boolean | No | true | Whether the rectangle has a border | +| isStrokeDashed | boolean | No | false | Whether the border is drawn with dashes | +| layer | string | No | - | PCB layer to place rectangle on | diff --git a/docs/elements/pcbnotetext.mdx b/docs/elements/pcbnotetext.mdx new file mode 100644 index 00000000..39e8f9ea --- /dev/null +++ b/docs/elements/pcbnotetext.mdx @@ -0,0 +1,134 @@ +--- +title: +description: Add text annotations and labels to your PCB layout. +--- + +## Overview + +The `` element places text annotations directly on the PCB. It's useful for adding labels, version numbers, copyright notices, or any other textual information to your board. + +Unlike schematic text, PCB note text appears on the physical board and can be printed on any layer. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) +`} +/> + +## Basic Examples + +### Simple Label + + ( + + + +) +`} +/> + +### Colored Text with Different Alignments + + ( + + + + + +) +`} +/> + +### Version and Copyright Info + + ( + + + + +) +`} +/> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| text | string | Yes | - | The text content to display | +| pcbX | distance | Yes | - | X coordinate on the PCB | +| pcbY | distance | Yes | - | Y coordinate on the PCB | +| fontSize | distance | No | 1 | Font size in mm | +| anchorAlignment | enum | No | "center" | Text alignment relative to anchor position. Options: "center", "top_left", "top_right", "bottom_left", "bottom_right" | +| color | string | No | - | Text color as hex string (e.g., "#ff0000") | +| font | string | No | "tscircuit2024" | Font family (currently only "tscircuit2024" is supported) | +| layer | string | No | - | PCB layer to place text on | + diff --git a/docs/elements/pinheader.mdx b/docs/elements/pinheader.mdx new file mode 100644 index 00000000..9bda453a --- /dev/null +++ b/docs/elements/pinheader.mdx @@ -0,0 +1,58 @@ +--- +title: +description: The `` element is used to create a male or female pin header with configurable spacing and number of pins. +--- + +## Overview + +The `` element is used to create a male or female pin header +with configurable spacing and number of pins. + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Example + + ( + + + + ) +`} +/> + +## Properties + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| pinCount | number | (required) | Number of pins in the header | +| pitch | number \| string | "2.54mm" | Distance between pins | +| schFacingDirection | "up" \| "down" \| "left" \| "right" | "right" | Direction the header faces in schematic view | +| gender | "male" \| "female" | "male" | Whether the header is male or female | +| showSilkscreenPinLabels | boolean | false | Whether to show pin labels in silkscreen | +| doubleRow | boolean | false | Whether the header has two rows of pins | +| holeDiameter | number \| string | "1mm" | Diameter of the through-hole for each pin | +| platedDiameter | number \| string | "1.7mm" | Diameter of the plated area around each hole | +| pinLabels | string[] | undefined | Labels for each pin | +| facingDirection | "left" \| "right" | "right" | Direction the header is facing | +| pcbX | number | 0 | X position of the component | +| pcbY | number | 0 | Y position of the component | +| rotation | number | 0 | Rotation of the component in degrees | +| id | string | auto-generated | Unique identifier for the component | + + + + + diff --git a/docs/elements/port.mdx b/docs/elements/port.mdx new file mode 100644 index 00000000..5a1a599e --- /dev/null +++ b/docs/elements/port.mdx @@ -0,0 +1,87 @@ +--- +title: +description: >- + Define connection points within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element defines connection points within a ``. Ports specify where traces connect to your component in the schematic view. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Usage + + ( + + + {/* Diode triangle */} + + + + {/* Cathode bar */} + + {/* Ports */} + + + + } + /> + +) +`} /> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| name | string | Yes | - | Port identifier used for connections | +| schX | number | Yes | - | X position in schematic units | +| schY | number | Yes | - | Y position in schematic units | +| direction | "left" \| "right" \| "up" \| "down" | No | - | Direction the port faces | +| schStemLength | number | No | - | Length of the stem line extending from the port | + +## Custom Stem Length + +Use `schStemLength` to control how far the connection stem extends from the port: + + ( + + + {/* Op-amp triangle */} + + + + {/* Plus/minus labels */} + + + {/* Ports with custom stem lengths */} + + + + + } + /> + +) +`} /> diff --git a/docs/elements/potentiometer.mdx b/docs/elements/potentiometer.mdx new file mode 100644 index 00000000..3df4566f --- /dev/null +++ b/docs/elements/potentiometer.mdx @@ -0,0 +1,56 @@ +--- +title: +description: >- + A potentiometer is a three-terminal resistor with a sliding or rotating contact + that forms an adjustable voltage divider. You can also attach two terminals to + create a variable resistor. +--- + +## Overview + +A potentiometer is a three-terminal resistor with a sliding or rotating contact +that forms an adjustable voltage divider. You can also attach two terminals to +create a variable resistor. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) + `} +/> + +## Variants (two or three terminals) + +The `` element can be configured with two or three terminals +using the `pinVariant` prop. + +| Pin Variant | Description | +| ----------- | ----------- | +| `two_pin` | Two terminals | +| `three_pin` | Three terminals | + + ( + + + + ) + `} +/> diff --git a/docs/elements/pushbutton.mdx b/docs/elements/pushbutton.mdx new file mode 100644 index 00000000..b20c615d --- /dev/null +++ b/docs/elements/pushbutton.mdx @@ -0,0 +1,69 @@ +--- +title: +description: >- + Pushbuttons a common type of switch normally open momentary switch. They are + commonly used as a reset or pairing button. +--- + +## Overview + +Pushbuttons a common type of switch normally open momentary switch. They are +commonly used as a reset or pairing button. + +import CircuitPreview from "@site/src/components/CircuitPreview"; + + ( + + + + ) + + `} +/> + +## Pins + +| Pin | Aliases | Description | +| ------- | -- |----------- | +| `1` | `side1` | One of the left side pins | +| `2` | `side1` | One of the left side pins | +| `3` | `side2` | One of the right side pins | +| `4` | `side2` | One of the right side pins | + +:::info +The pins are internally connected, so you only need to connect one of the +left or right pins. +::: + +## Example: A small keyboard grid of pushbuttons + + ( + + {grid({ + rows: 3, + cols: 3, + }).map((cell) => ( + + ))} + + ) + `} +/> diff --git a/docs/elements/resistor.mdx b/docs/elements/resistor.mdx index 56d4e0cd..2508a8e0 100644 --- a/docs/elements/resistor.mdx +++ b/docs/elements/resistor.mdx @@ -1,5 +1,69 @@ --- title: sidebar_position: 2 +description: >- + A `` is an extremely common element of electronic designs. It limits + the flow of electricity and is critical to making sure digital signals are + properly "pulled up" or "pulled down" to set their default value as `1` or `0` --- +## Overview + +A `` is an extremely common element of electronic designs. It limits +the flow of electricity and is critical to making sure digital signals are +properly "pulled up" or "pulled down" to set their default value as `1` or `0` + +A resistor element has two pins and is non-polar, meaning it doesn't matter if +you place it on backwards (it resists electricity identically either way!) + +When specifying a resistor, you'll usually want to give it a footprint string +such as `0402` or `0603` to indicate it's size. You can see the most popular +resistor sizes for different power ratings at [jlcsearch](https://jlcsearch.tscircuit.com/resistors/list) + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +) + + `} +/> + +## Pins + +A resistor has the following pins and aliases + +| Pin # | Aliases | Description | +| ---------- | ------- | ----------- | +| pin1 | left, pos | The left side pin in normal orientation | +| pin2 | right, neg | The right side pin in normal orientation | + +:::note +For convenience, you can use the `pos` and `neg` aliases for the resistor. This +can help to remember which pin is which for the purpose of pulling up or pulling +down a signal, but the resistor is non-polar so `pos`/`neg` are meaningless. +::: +## Tolerances + +Resistors can be made to different tolerances. In particular, you might care +about the following resistor characteristics: + +- **tolerance** - a percentage given with a string, e.g. `tolerance="5%"`. This specifies how accurate the resistance needs to be +- **powerRating** - a wattage e.g. "5W" indicating how much power can transfer through the resistor for normal operation +- **temperatureOperatingRange** - a string indicating the listed range for the resistor's operating temperature `"-15F-150F"` + +## Automatic Part Selection + +You generally don't need to specify `supplierPartNumbers` with a resistor, tscircuit +will use the [platform parts engine](../guides/running-tscircuit/platform-configuration.md) to +automatically search vendors for a part matching your tolerances. diff --git a/docs/elements/resonator.mdx b/docs/elements/resonator.mdx new file mode 100644 index 00000000..981c1065 --- /dev/null +++ b/docs/elements/resonator.mdx @@ -0,0 +1,28 @@ +--- +title: +description: >- + Provides a stable frequency reference for circuits, often used in clock or timing applications. +--- + +## Overview + +Resonators are common components used to provide a stable frequency reference for +circuits. They are often used in clock circuits or as a timing element. + +import CircuitPreview from "@site/src/components/CircuitPreview"; + + ( + + + + ) + `} +/> \ No newline at end of file diff --git a/docs/elements/schematicarc.mdx b/docs/elements/schematicarc.mdx new file mode 100644 index 00000000..ba7a235c --- /dev/null +++ b/docs/elements/schematicarc.mdx @@ -0,0 +1,201 @@ +--- +title: +description: >- + Draw circular arcs within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used within `` to create circular arc segments in custom schematic representations. It's useful for creating curved elements, partial circles, or any arc-based visual components in your component symbols. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Arc + +Here's a simple example of a chip with an arc symbol (semicircle): + + ( + + + + + + + + } + /> + +) +`} /> + +## Quarter Circle Arc + +You can create quarter circle arcs for rounded corners: + + ( + + + + + + + } + /> + +) +`} /> + +## Clockwise Arc + +By default, arcs are drawn counterclockwise. You can specify clockwise direction: + + ( + + + + + + + } + /> + +) +`} /> + +## Dashed Arc + +Arcs can be drawn with dashes: + + ( + + + + + + + } + /> + +) +`} /> + +## Multiple Arcs + +Combine multiple arcs to create complex curved symbols: + + ( + + + + + + + + } + /> + +) +`} /> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| center | point | Yes | - | Center point of the arc with x and y coordinates (e.g., `{ x: 0, y: 0 }`) | +| radius | distance | Yes | - | Radius of the arc | +| startAngleDegrees | rotation | Yes | - | Starting angle in degrees (0° is to the right, increases counterclockwise) | +| endAngleDegrees | rotation | Yes | - | Ending angle in degrees | +| direction | "clockwise" \| "counterclockwise" | No | "counterclockwise" | Direction to draw the arc from start to end angle | +| strokeWidth | distance | No | - | Width of the arc line stroke | +| color | string | No | "#000000" | Color of the arc | +| isDashed | boolean | No | false | Whether the arc is drawn with dashes | + +## Angle Reference + +Angles in `` follow the standard mathematical convention: +- 0° points to the right (positive X axis) +- 90° points up (positive Y axis) +- 180° points to the left (negative X axis) +- 270° points down (negative Y axis) diff --git a/docs/elements/schematiccircle.mdx b/docs/elements/schematiccircle.mdx new file mode 100644 index 00000000..9e23f375 --- /dev/null +++ b/docs/elements/schematiccircle.mdx @@ -0,0 +1,90 @@ +--- +title: +description: >- + Draw circles within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used within `` to create circular shapes in custom schematic representations. It's useful for creating round elements, dots, or any circular visual components in your component symbols. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Circle + +Here's a simple example of a chip with a circular symbol: + + ( + + + + + + + } + /> + +) +`} /> + +## Multiple Circles + +You can combine multiple circles to create more complex symbols: + + ( + + + + + + + + } + /> + +) +`} /> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| center | point | Yes | - | Center point of the circle with x and y coordinates (e.g., `{ x: 0, y: 0 }`) | +| radius | distance | Yes | - | Radius of the circle | +| strokeWidth | distance | No | - | Width of the circle outline stroke | +| color | string | No | "#000000" | Color of the circle outline | +| isFilled | boolean | No | false | Whether the circle is filled with color | +| fillColor | string | No | - | Fill color of the circle (only applies when isFilled is true) | diff --git a/docs/elements/schematicline.mdx b/docs/elements/schematicline.mdx new file mode 100644 index 00000000..eca61b5c --- /dev/null +++ b/docs/elements/schematicline.mdx @@ -0,0 +1,126 @@ +--- +title: +description: >- + Draw straight lines within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used within `` to create straight line segments in custom schematic representations. It's useful for creating borders, dividers, connection indicators, or any linear visual elements in your component symbols. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Line + +Here's a simple example of a chip with line elements in the symbol: + + ( + + + + + + + + } + /> + +) +`} /> + +## Dashed Line + +You can create dashed lines for visual separation: + + ( + + + + + + + + } + /> + +) +`} /> + +## Cross Pattern + +You can combine multiple lines to create patterns: + + ( + + + + + + + + } + /> + +) +`} /> + + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| x1 | distance | Yes | - | X coordinate of the line start point | +| y1 | distance | Yes | - | Y coordinate of the line start point | +| x2 | distance | Yes | - | X coordinate of the line end point | +| y2 | distance | Yes | - | Y coordinate of the line end point | +| strokeWidth | distance | No | - | Width of the line stroke | +| color | string | No | "#000000" | Color of the line | +| isDashed | boolean | No | false | Whether the line is drawn with dashes | + diff --git a/docs/elements/schematicpath.mdx b/docs/elements/schematicpath.mdx new file mode 100644 index 00000000..ae824d73 --- /dev/null +++ b/docs/elements/schematicpath.mdx @@ -0,0 +1,124 @@ +--- +title: +description: >- + Draw connected line segments within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used within `` to create connected line segments in custom schematic representations. It's ideal for zigzags, arrows, or any shape that requires multiple connected points. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Path + +Here's a simple example showing a zigzag path inside a symbol: + + ( + + + + + + + } + /> + +) +`} /> + +## Arrow Path + +You can use connected points to create custom arrows or indicators: + + ( + + + + + + + } + /> + +) +`} /> + +## SVG Path + +You can use standard SVG path syntax with the `svgPath` prop for more complex shapes: + + ( + + + {/* Star shape using SVG path */} + + + + + } + /> + +) +`} /> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| points | array | Yes | - | Array of points defining the path. Each point is an object with `x` and `y` coordinates | +| svgPath | string | No | - | SVG path string (e.g., "M 0 0 L 1 1") for complex shapes | +| strokeWidth | distance | No | - | Width of the path stroke | +| strokeColor | string | No | "#840000" | Color of the path stroke | diff --git a/docs/elements/schematicrect.mdx b/docs/elements/schematicrect.mdx new file mode 100644 index 00000000..d44a2387 --- /dev/null +++ b/docs/elements/schematicrect.mdx @@ -0,0 +1,160 @@ +--- +title: +description: >- + Draw rectangles and boxes within custom schematic symbols. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used within `` to create rectangular shapes in custom schematic representations. It's useful for creating box outlines, filled backgrounds, dashed outlines, or any other rectangular visual elements in your component symbols. + +:::note +`` can only be used inside a `` element. +::: + +## Basic Rectangle + +Here's a simple example of a chip with a rectangular symbol: + + ( + + + + + + + } + /> + +) +`} /> + +## Filled Rectangle + +You can create filled rectangles with custom colors: + + ( + + + + + + + } + /> + +) +`} /> + +## Dashed Rectangle + +Rectangles can also use dashed outlines: + + ( + + + + + + + } + /> + +) +`} /> + +## Rotated Rectangle + +Rectangles can be rotated to create angled elements: + + ( + + + + + + + } + /> + +) +`} /> + +## Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| schX | distance | No | - | X position of the rectangle center in schematic coordinates | +| schY | distance | No | - | Y position of the rectangle center in schematic coordinates | +| width | distance | Yes | - | Width of the rectangle | +| height | distance | Yes | - | Height of the rectangle | +| rotation | rotation | No | 0 | Rotation angle of the rectangle in degrees | +| strokeWidth | distance | No | - | Width of the rectangle outline stroke | +| color | string | No | "#000000" | Color of the rectangle outline | +| isFilled | boolean | No | false | Whether the rectangle is filled with color | +| fillColor | string | No | - | Fill color of the rectangle (only applies when isFilled is true) | +| isDashed | boolean | No | false | Whether the rectangle outline is drawn with dashes | diff --git a/docs/elements/schematicsection.mdx b/docs/elements/schematicsection.mdx new file mode 100644 index 00000000..0fa2b4fd --- /dev/null +++ b/docs/elements/schematicsection.mdx @@ -0,0 +1,77 @@ +--- +title: +description: >- + Group schematic components into labeled regions with automatic dividing lines. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +`` groups schematic components into named, labeled regions. Each section draws a bounding box around its member components and renders a display label. When multiple sections exist, automatic dividing lines separate them. + +Components opt in to a section by setting `schSectionName` to match the section's `name` prop. + +## Basic Example + + ( + + + + + + + {/* top-left */} + + + + {/* top-right */} + + + + {/* bottom-left */} + + + {/* bottom-right */} + + + +) +`} /> + +## Props + +| Prop | Type | Required | Description | +|------|------|----------|-------------| +| `name` | `string` | Yes | Identifier matched by `schSectionName` on member components | +| `displayName` | `string` | No | Label rendered in the top-left corner of the section region | + +## Component `schSectionName` + +Any component that accepts schematic position props also accepts `schSectionName`. Set it to the `name` of a `` declared in the same board to include that component in the section. + +```tsx + +``` + diff --git a/docs/elements/schematictable.mdx b/docs/elements/schematictable.mdx new file mode 100644 index 00000000..de7c49cf --- /dev/null +++ b/docs/elements/schematictable.mdx @@ -0,0 +1,80 @@ +--- +title: +description: >- + Draw tables within schematics. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element is a primitive drawing component used to create tabular data in schematic representations. It's useful for creating pin tables, component specifications, or any structured data in your schematics. + + ( + + + + + + + + + + + + + + + + + + + + + + +) +`} /> + +## Props + +### Schematictable Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| schX | distance | No | - | X position of the table center in schematic coordinates | +| schY | distance | No | - | Y position of the table center in schematic coordinates | +| cellPadding | distance | No | - | Padding inside each cell | +| borderWidth | distance | No | - | Width of the table border | +| anchor | enum | No | "center" | Anchor position (e.g., "center", "left", "top-left") | +| fontSize | distance | No | - | Font size for cell text | + +### Schematicrow Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| height | distance | No | 1 | Height of the row | + +### Schematiccell Props + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| text | string | No | - | Text content of the cell (alternative to children) | +| children | string | No | - | Text content of the cell | +| horizontalAlign | "left" \| "center" \| "right" | No | "center" | Horizontal text alignment | +| verticalAlign | "top" \| "middle" \| "bottom" | No | "middle" | Vertical text alignment | +| fontSize | distance | No | - | Font size for cell text | +| rowSpan | number | No | 1 | Number of rows the cell spans | +| colSpan | number | No | 1 | Number of columns the cell spans | +| width | distance | No | - | Width of the cell | diff --git a/docs/elements/schematictext.mdx b/docs/elements/schematictext.mdx new file mode 100644 index 00000000..59ad3c5d --- /dev/null +++ b/docs/elements/schematictext.mdx @@ -0,0 +1,37 @@ +--- +title: +description: The `` element places text directly on the schematic. +--- + +## Overview + +`` is a primitive element used to display standalone text on the schematic. It does not appear on the PCB. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + ) + `} +/> + + +## Properties + +| Property | Type | Description | +|---------|------|-------------| +| `text` | string | The text string to render. | +| `schX` | length | X coordinate of the text. | +| `schY` | length | Y coordinate of the text. | +| `anchor` | enum | Anchor position such as `"center"`, `"left"`, `"right"`, `"top"`, `"bottom"`, or corner positions. Defaults to `"center"`. | +| `fontSize` | number | Font size in schematic units. Default `1`. | +| `color` | string | Color of the text, specified as a hex string. Default `"#000000"`. | +| `schRotation` | angle | Rotation of the text in degrees. Default `0`. | + diff --git a/docs/elements/solderjumper.mdx b/docs/elements/solderjumper.mdx new file mode 100644 index 00000000..bbb75b20 --- /dev/null +++ b/docs/elements/solderjumper.mdx @@ -0,0 +1,36 @@ +--- +title: +description: Small pads that can be cut or bridged with solder for configuration options. +--- + +## Overview + +A `` is a tiny jumper made from exposed pads on the PCB. These pads can be bridged or cut to change the circuit after manufacturing. While a regular `` usually uses a header-style footprint, solder jumpers are often just copper pads separated by a thin gap. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + ) + `} +/> + +This snippet is based on the tests from [tscircuit/core](https://github.com/tscircuit/core/blob/main/tests/components/normal-components/solderjumper.test.tsx). + +If you provide the `bridgedPins` property, tscircuit will create a small trace connecting those pins by default. You can cut the trace to open the connection or solder across the pads to reconnect them. + +## Properties + +The `` component extends `` with one additional property. From [`@tscircuit/props`](https://github.com/tscircuit/props/blob/main/lib/components/solderjumper.ts): + +```ts +export interface SolderJumperProps extends JumperProps { + /** Pins that are bridged with solder by default */ + bridgedPins?: string[][] +} +``` + +Use solder jumpers when you need a configuration option that can be easily changed with a soldering iron. diff --git a/docs/elements/spicemodel.mdx b/docs/elements/spicemodel.mdx new file mode 100644 index 00000000..061b9a58 --- /dev/null +++ b/docs/elements/spicemodel.mdx @@ -0,0 +1,117 @@ +--- +title: +description: Attach a custom SPICE subcircuit model to a tscircuit component. +--- + +## Overview + +`` attaches a SPICE `.subckt` model to a source component for +analog simulation. Use it when a component needs behavior that is not covered by +the built-in SPICE output, such as a vendor model, an op-amp macro-model, or a +custom diode model. + +The model is usually passed through the parent component's `spiceModel` prop. +During simulation, tscircuit maps the `.subckt` pins to the parent component's +ports and emits a subcircuit instance into the generated SPICE netlist. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + } + /> + + + + + + + + + + +) +`} +/> + +## Properties + +| Property | Description | Example | +| --- | --- | --- | +| `source` | SPICE source text containing a `.subckt` declaration. | `` `.subckt LM358 1 2 3 4 5 ...` `` | +| `spicePinMapping` | Optional map from `.subckt` pin names to parent component port names. Use this when the SPICE model pins do not match the tscircuit port names. | `{{ "1": "pin1", "2": "pin2" }}` | + +## Pin Mapping + +If a `.subckt` pin name matches a parent component port name, no mapping is +needed. In the diode example above, `ANODE` and `CATHODE` match the chip's +`pinLabels`. + +Use `spicePinMapping` when the model uses different pin names or numeric pins: + +```tsx +const lm358Model = ` +.subckt LM358 1 2 3 4 5 +RIN 2 3 10Meg +.ends LM358 +` + +export default () => ( + + + } + /> + +) +``` + +Every `.subckt` pin must resolve to exactly one parent port. If a mapped SPICE +pin is not present in the `.subckt`, or if a pin cannot be resolved to a port, +tscircuit reports a `source_invalid_component_property_error` for `spiceModel`. diff --git a/docs/elements/subcircuit.mdx b/docs/elements/subcircuit.mdx index 84411bd8..39a62ada 100644 --- a/docs/elements/subcircuit.mdx +++ b/docs/elements/subcircuit.mdx @@ -1,4 +1,90 @@ --- title: +description: >- + A `` is a powerful organizational element in tscircuit that + represents a collection of elements that are tightly coupled. Subcircuits are + often used for a small functional block, such as a voltage regulator. --- +## Overview + +A `` is a powerful organizational element in tscircuit that +represents a collection of elements that are tightly coupled. Subcircuits are +often used for a small functional block, such as a voltage regulator. + +Within a subcircuit, you can have a custom autorouter or isolated nets from the +larger circuits. You can also re-use reference designators. Your subcircuit is +essentially isolated from other subcircuits. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + + + ) + `} +/> + +## Reuse Reference Designators + +Reusing reference designators is typically considered a bad practice, but in +tscircuit reference designators are intelligently prefixed prior to being +written on the silkscreen. This means that you can design your subcircuits +without worrying about whether or not a reference designator has been previously +used. + +Within a subcircuit, you'll never select inside of another subcircuit without +explicitly specifying the subcircuit `name` in a selector. This means you never +need to worry about other `R1` or `C1` selectors from other subcircuits, they +will not be selected unless you explicitly include a subcircuit selector +e.g. `.somesubcircuit .R1` + + ( + + + + + + + + + + ) + `} +/> + +## Configuring the Autorouter + +Subcircuits can have a custom autorouter configuration. This will be inherited +by any children subcircuits. + +To specify a custom autorouter configuration, just set the `autorouter` property +on a `` element. + +```tsx + + + + {/* ... */} + +``` + +Specifying custom autorouter settings for subcircuits can be extremely useful +when you have a tricky section of components that have special requirements. + +Read more about [the autorouter prop here](./board.mdx#setting-the-autorouter). + + diff --git a/docs/elements/switch.mdx b/docs/elements/switch.mdx new file mode 100644 index 00000000..129b9716 --- /dev/null +++ b/docs/elements/switch.mdx @@ -0,0 +1,57 @@ +--- +title: +description: A switch is a mechanical device that can be used to connect or disconnect a circuit. +--- + +## Overview + +A switch is a mechanical device that can be used to connect or disconnect a +circuit. + +import CircuitPreview from "@site/src/components/CircuitPreview"; + + ( + + ) + `} +/> + +## Properties + +| Property | Type | Description | +| -------- | -------- | -------- | +| `type` | `"spst"` \| `"spdt"` \| `"dpst"` \| `"dpdt"` | The type of switch | +| `isNormallyClosed` | `boolean` | Whether the switch is normally closed | + + +## Types of Switches + +| Type | Description | +| ---- | ----------- | +| `spst` | Single Pole Single Throw - The simplest switch type with one input and one output | +| `spdt` | Single Pole Double Throw - One input that can be connected to either of two outputs | +| `dpst` | Double Pole Single Throw - Two separate inputs each connecting to their own output | +| `dpdt` | Double Pole Double Throw - Two separate inputs that can each connect to either of two outputs | + + ( + + + + + + + ) + `} +/> + + +## When to use `` vs `` + +You should always use `` or any more specific switch element +when possible. `` is a more generic element with less defaults. diff --git a/docs/elements/symbol.mdx b/docs/elements/symbol.mdx new file mode 100644 index 00000000..030a5f37 --- /dev/null +++ b/docs/elements/symbol.mdx @@ -0,0 +1,208 @@ +--- +title: +description: >- + Used to define custom schematic representations for chips using primitive drawing components like rectangles, circles, lines, and arcs. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element allows you to create custom schematic representations for your chips. Instead of using the default schematic box with pins, you can draw custom shapes using primitive components like ``, ``, ``, and ``. + +Most components let you customize their schematic appearance through the `symbol` prop, where you can combine `` elements with drawing primitives to define connection points. + +:::tip +Use `` when you want to create a custom schematic appearance for your component that differs from the standard rectangular box representation. +::: + +## Basic Symbol Example + +Here's an example creating an NPN transistor symbol using primitive components: + + ( + + + {/* Outer circle */} + + {/* Base vertical bar */} + + {/* Base input line */} + + {/* Collector line (diagonal then vertical) */} + + + {/* Emitter line (diagonal then vertical) */} + + + {/* Emitter arrow (V shape pointing outward along emitter line) */} + + {/* Ports */} + + + + + } + /> + +) +`} /> + +## Symbols with Connections + +You can create multiple chips with custom symbols and connect them via the `connections` prop. Here's a buffer driving an inverter: + + ( + + {/* Buffer (triangle) */} + + + + + {/* Input line on left */} + + {/* Output line on right */} + + + + } + /> + {/* Inverter (triangle with bubble) */} + + + + + + {/* Input line on left */} + + {/* Output line on right (after bubble) */} + + + + } + connections={{ + pin1: ".U1 > .pin1", + }} + /> + +) +`} /> + +## Reference Designator Substitution + +You can use `{NAME}`, `{REF}`, or `{REFERENCE}` in the `text` property of a `` element. When the schematic is rendered, these variables are automatically replaced with the name (reference designator) of the component it belongs to. + +This is particularly useful when creating custom symbols for components like chips. + + ( + + + + + + + + + + + + + } + /> + +) + `} +/> + +## Available Schematic Drawing Components + +Within a ``, you can use the following primitive components to draw your custom schematic representation: + +- [``](./port.mdx) - Define connection points +- [``](./schematicrect.mdx) - Draw rectangles and boxes +- [``](./schematiccircle.mdx) - Draw circles +- [``](./schematicline.mdx) - Draw straight lines +- [``](./schematicpath.mdx) - Draw connected path segments +- [``](./schematicarc.mdx) - Draw circular arcs + +## Viewing Symbol Ports + +To visualize the port positions on your schematic symbols, go to **View > Schematic > Show Schematic Ports** in the editor: + +![Show schematic ports option in the View menu](/img/show-schematic-ports.gif) diff --git a/docs/elements/testpoint.mdx b/docs/elements/testpoint.mdx new file mode 100644 index 00000000..bc35aecc --- /dev/null +++ b/docs/elements/testpoint.mdx @@ -0,0 +1,169 @@ +--- +title: +description: >- + A `` is a designated location on a PCB that provides easy access + for testing, debugging, and measuring electrical signals. Test points are + essential for troubleshooting circuits and verifying proper operation during + development and manufacturing. +--- + +## Overview + +A `` is a designated location on a PCB that provides easy access for testing, debugging, and measuring electrical signals. Test points are essential for troubleshooting circuits and verifying proper operation during development and manufacturing. + +Test points can be implemented as surface-mount pads or through-hole connections, depending on the testing requirements and available board space. They provide a reliable connection point for oscilloscope probes, multimeter leads, and other test equipment. + +When designing test points, consider the size and shape based on your testing needs and the type of probes you'll be using. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + +) + + `} +/> + +## Pins + +A test point has a single connection: + +| Pin # | Aliases | Description | +| ---------- | ------- | ----------- | +| pin1 | tp, test | The test point connection | + +## Properties + +| Property | Type | Required | Description | Example | +| -------- | ---- | -------- | ----------- | ------- | +| `footprintVariant` | `"pad" \| "through_hole"` | No | Type of test point implementation | `"pad"`, `"through_hole"` | +| `padShape` | `"rect" \| "circle"` | No | Shape of the test point pad (default: "circle") | `"circle"`, `"rect"` | +| `padDiameter` | `string \| number` | No | Diameter of circular test point pads | `"1mm"`, `0.5` | +| `holeDiameter` | `string \| number` | No | Diameter of hole for through-hole test points | `"0.8mm"`, `0.3` | +| `width` | `string \| number` | No | Width of rectangular test point pads | `"2mm"`, `1.5` | +| `height` | `string \| number` | No | Height of rectangular test point pads | `"1mm"`, `0.8` | +| `layer` | `"top" \| "bottom"` | No | PCB layer where the test point is placed (default: "top") | `"bottom"` | + +## Footprint Variants + +### Surface Mount Pad (`footprintVariant="pad"`) +Surface mount test points are implemented as exposed copper pads on the PCB surface. They're compact and suitable for most testing scenarios. + +**Advantages:** +- Minimal board space required +- No drilling needed during manufacturing +- Suitable for automated testing + +**Use cases:** +- High-density designs +- Automated test equipment (ATE) +- Quick voltage measurements + +### Through-Hole (`footprintVariant="through_hole"`) +Through-hole test points provide a drilled hole that can accommodate test pins or spring-loaded probes more reliably. + +**Advantages:** +- Better probe retention +- More reliable connection +- Suitable for repeated testing + +**Use cases:** +- Manual testing and debugging +- Prototype development +- Test fixtures requiring secure connections + +## Pad Shapes + +### Circle (`padShape="circle"`) +Circular test points are the most common and provide good probe contact from any angle. + +```jsx + +``` + +### Rectangle (`padShape="rect"`) +Rectangular test points can provide more surface area in constrained spaces. + +```jsx + +``` + +## Sizing Guidelines + +### Pad Diameter/Size +- **Small**: 0.5mm - 0.8mm (for high-density boards) +- **Medium**: 1mm - 1.5mm (standard testing) +- **Large**: 2mm+ (for easy manual probing) + +### Hole Diameter (Through-hole) +- **Standard**: 0.8mm - 1mm +- **Large probes**: 1.2mm - 1.5mm + +## Usage Examples + +### Basic Voltage Test Point +```jsx + +``` + +### Bottom Layer Test Point +```jsx + +``` + +### Custom Circular Pad +```jsx + +``` + +### Through-hole Test Point +```jsx + +``` + +### Rectangular Test Point +```jsx + +``` +## Testing Considerations + +- **Probe compatibility**: Choose sizes compatible with your test equipment +- **Spacing**: Ensure adequate spacing between test points for probe access +- **Labeling**: Use clear, descriptive names for easy identification +- **Documentation**: Include test point locations in assembly drawings and test procedures diff --git a/docs/elements/trace.mdx b/docs/elements/trace.mdx index c633d4c2..788d291d 100644 --- a/docs/elements/trace.mdx +++ b/docs/elements/trace.mdx @@ -1,5 +1,175 @@ --- title: sidebar_position: 5 +description: >- + The `` element represents an electrical connection between two or + more points in your circuit. Traces can connect components, nets, or specific + pins on components. --- +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element represents an electrical connection between two or more points in your circuit. Traces can connect components, nets, or specific pins on components. + +## Basic Usage + +Here's a simple example connecting two components: + + ( + + + + + + ) +`} /> + +## Trace Properties + +| Property | Description | Example | +| -------- | ----------- | ------- | +| `from` | Starting point of the trace using a [port selector](../guides/tscircuit-essentials/port-and-net-selectors.md) | `".R1 > .pin1"` | +| `to` | Ending point of the trace using a [port selector](../guides/tscircuit-essentials/port-and-net-selectors.md) | `".C1 > .pin1"` | +| `maxLength` | Maximum length the trace can be (optional) | `"10mm"` | +| `minLength` | Minimum length the trace must be (optional) | `"5mm"` | +| `width` | Width of the trace (optional) | `"0.2mm"` | +| `thickness` | Same as `width`; sets the copper width for the trace (optional) | `"0.2mm"` | +| `pcbPath` | Array of points defining a manual PCB path relative to an anchor port | `[{ x: 1, y: 0 }, { x: 1, y: 1 }]` | +| `pcbPathRelativeTo` | Port selector that `pcbPath` coordinates are relative to (defaults to the `from` port) | `".R1 > .pin2"` | + +## Connecting to Nets + +Traces can connect to named nets like power and ground: + + ( + + + + + + ) +`} /> + +## Autorouting + +Traces are automatically routed by tscircuit's [autorouting system](./board.mdx#setting-the-autorouter). The autorouter will: + +1. Find a path between components that doesn't intersect other traces +2. Use vias to change layers when needed +3. Respect any length constraints specified +4. Try to minimize the number of vias used + +You can customize the autorouting behavior by setting the `autorouter` property on the parent [``](./board.mdx) or [``](./subcircuit.mdx). + +## Manual PCB Paths + +Sometimes you may want to manually specify the exact path a trace should take on the PCB. Provide a list of points with `pcbPath` to override autorouting and draw the route yourself. The coordinates are relative to a specific port defined by `pcbPathRelativeTo` (defaults to the `from` port). Entries in `pcbPath` can mix coordinate objects with [port selectors](../guides/tscircuit-essentials/port-and-net-selectors.md) so you can anchor the path to specific component pins. + + ( + + + + + + ) +`} /> + +## Length Constraints + +Sometimes you need traces to be exactly a certain length, like for high-speed signals. You can use `maxLength` and `minLength`: + + ( + + + + + +) +`} /> + +## Differential Pairs + +For high-speed signals, you often need pairs of traces to have matched lengths. You can use the `differentialPairKey` property to group traces: + +:::info +The `differentialPairKey` property is in beta and not available on all autorouters yet! +::: + + ( + + + + + + + ) +`} /> + +The autorouter will ensure both traces in the pair have the same length. + +## Net vs Direct connections + +There are generally two ways that traces are represented on a PCB "Rats Nest" +or on a schematic and they have very different results: + +- **Net** - A trace that connects a net to a component pin. + - `` +- **Direct** - A trace that connects two component pins directly. + - `` + +When you specify a trace with a net, the autorouter will look for the best +place to tie into the net. This means you're not specifying the exact location +where the trace will go. + +When using net connections we use a Rats Nest on a PCB view or a net label on a +schematic view. When you see a dotted line on a Rats Nest, you should think of +it as a _possible_ connection point, but not necessarily the final place where +the autorouter will connect to the net. + +## Creating a direct path with a custom thickness + +Use an empty `pcbPath` array to keep the autorouter's direct path between two +ports while overriding the trace width via the `thickness` property. + + ( + + + + + + ) +`} /> diff --git a/docs/elements/transistor.mdx b/docs/elements/transistor.mdx new file mode 100644 index 00000000..994534d0 --- /dev/null +++ b/docs/elements/transistor.mdx @@ -0,0 +1,38 @@ +--- +title: +description: >- + A transistor is a three-terminal semiconductor device that can amplify or + switch electronic signals. It is a fundamental component in many electronic + circuits, including amplifiers, oscillators, and digital logic gates. +--- + +## Overview + +A transistor is a three-terminal semiconductor device that can amplify or switch electronic signals. It is a fundamental component in many electronic circuits, including amplifiers, oscillators, and digital logic gates. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + ) +`} +/> + +There are different types of transistors, so where possible you should use the +most specific element to represent your use case + +- [``](./transistor.mdx) - Generic transistor +- [``](./mosfet.mdx) - MOSFET transistor + +## Properties + +| Property | Description | Example | +| -------- | --------------------------------------------------------------- | ------- | +| `type` | The type of transistor (`npn`, `pnp`, `mosfet`, `igbt`, `jfet`) | `"npn"` | diff --git a/docs/elements/via.mdx b/docs/elements/via.mdx new file mode 100644 index 00000000..d17e619f --- /dev/null +++ b/docs/elements/via.mdx @@ -0,0 +1,48 @@ +--- +title: +description: >- + A via is a plated hole that connects different layers of a PCB. Vias are + commonly used to route traces between layers and for thermal management. +--- + +## Overview + +A via is a plated hole that connects different layers of a PCB. Vias are +commonly used to route traces between layers and for thermal management. + +Vias do not have a schematic representation. + +You generally do not need to manually create vias, they will be handled +automatically by the [autorouter](./board.mdx#setting-the-autorouter). + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + )`} +/> + +## Properties + + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| fromLayer | string | "top" | Starting layer for the via | +| toLayer | string | "bottom" | Ending layer for the via | +| holeDiameter | number \| string | "0.4mm" | Diameter of the plated hole | +| outerDiameter | number \| string | "0.8mm" | Outer diameter of the copper annular ring | +| pcbX | number | 0 | PCB X position of the via | +| pcbY | number | 0 | PCB Y position of the via | +| netIsAssignable | boolean | `false` | Marks the via as prefabricated so autorouters like `laser_prefab` can claim it for any compatible net. | diff --git a/docs/elements/voltageprobe.mdx b/docs/elements/voltageprobe.mdx new file mode 100644 index 00000000..c6281a57 --- /dev/null +++ b/docs/elements/voltageprobe.mdx @@ -0,0 +1,53 @@ +--- +title: +description: Measure voltages at specific nodes during SPICE simulation. +--- + +## Overview + +`` records voltage values during SPICE simulation. It attaches to +an existing node in your schematic and appears in the simulation graph output. +Use probes to capture input/output signals or differential measurements across +components. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + + + + + + + + + +) +`} +/> + +## Properties + +| Property | Description | Example | +| --- | --- | --- | +| `name` | Optional label for the probe trace in graphs. | `"VP_OUT"` | +| `connectsTo` | Port selector that identifies the measurement node. | `".R1 > .pin1"` | +| `referenceTo` | Optional port selector for differential measurements. | `".R1 > .pin2"` | + +Add probes for every signal you want plotted in the simulation graph. When you +provide `referenceTo`, the probe measures the voltage difference between the +`connectsTo` node and the reference node. diff --git a/docs/elements/voltagesource.mdx b/docs/elements/voltagesource.mdx new file mode 100644 index 00000000..b4d9edcf --- /dev/null +++ b/docs/elements/voltagesource.mdx @@ -0,0 +1,58 @@ +--- +title: +description: Add a voltage source for SPICE simulations and schematic power inputs. +--- + +## Overview + +`` defines a two-pin voltage source that can drive your circuit +in SPICE simulations. It supports DC sources as well as waveform-driven sources +(sine, square, or triangle). Use this element to provide input stimulus for +filters, rectifiers, power converters, and other analog designs. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + + + +) +`} +/> + +## Properties + +| Property | Description | Example | +| --- | --- | --- | +| `name` | Reference designator for the source. | `"V1"` | +| `voltage` | DC voltage (when you want a steady source). | `"5V"` | +| `waveShape` | Waveform shape for AC sources. Common values are `"sinewave"`, `"square"`, and `"triangle"`. | `"square"` | +| `frequency` | Frequency of the waveform. | `"1kHz"` | +| `amplitude` | AC amplitude (peak) for the waveform. | `"5V"` | +| `offset` | DC offset added to the waveform. | `"2.5V"` | +| `dutyCycle` | Duty cycle for square waves, from `0` to `1`. | `0.5` | +| `schX`, `schY`, `schRotation` | Schematic placement controls. | `schRotation={270}` | + +Use `` alongside `` to define inputs for +SPICE analysis. For physical power sources on a PCB, consider `` or a +connector instead. diff --git a/docs/footprints/_category_.json b/docs/footprints/_category_.json index 6823b8fd..6d8ee98b 100644 --- a/docs/footprints/_category_.json +++ b/docs/footprints/_category_.json @@ -6,5 +6,5 @@ "description": "Quickly generate landing patterns (footprints) for chips on your PCB" }, "collapsible": true, - "collapsed": true + "collapsed": false } diff --git a/docs/footprints/constraint.mdx b/docs/footprints/constraint.mdx new file mode 100644 index 00000000..f4f1bf78 --- /dev/null +++ b/docs/footprints/constraint.mdx @@ -0,0 +1,85 @@ +--- +title: +description: >- + The `` element is used to enforce geometric relationships + between different elements in a PCB footprint. Constraints can set specific + distances and alignments, such as center-to-center, edge-to-edge, or ensuring + two elements line up along the same axis. +--- + +## Overview + +The `` element is used to enforce geometric relationships between different elements in a PCB footprint. Constraints can set specific distances and alignments, such as center-to-center, edge-to-edge, or ensuring two elements line up along the same axis. + +Below is a reference example that demonstrates how constraints are used within a footprint. This example is part of a test suite to validate that a KeyswitchSocket component is correctly flipped when placed on different layers of a board. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + {/* */} + + + + + + + + + + + + } + /> + ) + + export default () => ( + + + + + ) + + +`} /> + +## Key Constraints Summary + +- ``: Defines a constraint based on the center positions of two elements. +- ``: Sets a fixed distance between the edges of two elements. +- ``: Ensures that multiple elements share the same Y coordinate. + +Use these constraints to help align footprint elements consistently across your designs. diff --git a/docs/footprints/fabricationnoterect.mdx b/docs/footprints/fabricationnoterect.mdx new file mode 100644 index 00000000..797c1e68 --- /dev/null +++ b/docs/footprints/fabricationnoterect.mdx @@ -0,0 +1,100 @@ +--- +title: +description: Highlight fabrication callouts and assembly regions with rectangular annotations on the fabrication layer. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The `` element draws rectangular callouts on the fabrication layer. Use it to flag assembly keep-out zones, highlight areas that need manual inspection, or surround notes that should only appear on fabrication outputs. Fabrication rectangles will not appear on the silkscreen or schematic exports. + +## Basic Usage + +The example below adds a fabrication note rectangle around a cluster of passives to highlight an assembly instruction. Because the element renders on the fabrication layer, it appears alongside `` callouts in fabrication plots but stays off the silkscreen. + + ( + + + + + + +) +`} +/> + +## Filled Callouts + +Set `isFilled` to tint the region. Pair it with `hasStroke={false}` when you only want a filled highlight without an outline. + + ( + + + + +) +`} +/> + +## Properties + +| Property | Type | Required | Default | Description | +|----------|------|----------|---------|-------------| +| `pcbX` | length | Yes | – | X coordinate of the rectangle center on the PCB fabrication layer. | +| `pcbY` | length | Yes | – | Y coordinate of the rectangle center on the PCB fabrication layer. | +| `width` | length | Yes | – | Width of the rectangle. | +| `height` | length | Yes | – | Height of the rectangle. | +| `strokeWidth` | length | No | `0.2mm` | Outline thickness for the rectangle border. | +| `color` | string | No | `"#000"` | Hex color used when previewing the fabrication rectangle. | +| `isFilled` | boolean | No | `false` | When `true`, fills the rectangle with `color`. | +| `hasStroke` | boolean | No | `true` | Toggles the rectangle border. | +| `isStrokeDashed` | boolean | No | `false` | Renders the border with a dashed pattern. | +| `layer` | string | No | `"fabrication"` | Fabrication layer name to place the rectangle on. | +| `pcbRelative` | boolean | No | `false` | Interpret `pcbX`/`pcbY` relative to the parent group instead of the board origin. | +| `relative` | boolean | No | `false` | Applies relative positioning rules to both PCB and schematic coordinates within groups. | + +## Tips + +- Combine `` with [``](./fabricationnotetext.mdx) to connect visual highlights with explicit instructions. +- Use `isStrokeDashed` to outline areas that require optional or future assembly steps. +- Keep fabrication rectangles off critical copper features—they are only for documentation and do not affect manufacturing clearances. diff --git a/docs/footprints/fabricationnotetext.mdx b/docs/footprints/fabricationnotetext.mdx new file mode 100644 index 00000000..1a96d32b --- /dev/null +++ b/docs/footprints/fabricationnotetext.mdx @@ -0,0 +1,57 @@ +--- +title: +description: The `` element adds fabrication layer callouts and build notes for assemblers. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +`` lets you drop short build notes directly onto the PCB fabrication layer. These notes are useful for communicating assembly instructions such as "do not populate" or "install on second pass" to your manufacturer. Fabrication notes are only exported with fabrication outputs—they do not appear on the silkscreen or schematic. + +## Basic Usage + +Below is a simple board with a fabrication note reminding the assembler about a special assembly step. The note is positioned by its PCB coordinates and can be aligned using `anchorAlignment` to point at a specific area of the board. + + ( + + + + + + ) + `} +/> + +## Properties + +| Property | Type | Description | +|---------|------|-------------| +| `text` | string | Message to display on the fabrication drawing. | +| `pcbX` | length | X coordinate of the note, measured in PCB units (defaults to `0`). | +| `pcbY` | length | Y coordinate of the note, measured in PCB units (defaults to `0`). | +| `anchorAlignment` | enum | Alignment of the anchor point relative to the text. Options: `"center"`, `"top_left"`, `"top_right"`, `"bottom_left"`, `"bottom_right"`. Defaults to `"center"`. | +| `fontSize` | length | Height of the rendered text. Defaults to `1mm` if not provided. | +| `font` | enum | Currently `"tscircuit2024"`. Optional—rarely needs to be changed. | +| `color` | string | Optional hex color to highlight the note in previews. | +| `pcbRelative` | boolean | When `true`, `pcbX`/`pcbY` are relative to the parent group instead of the board origin. | +| `relative` | boolean | Similar to `pcbRelative`, but also applies to schematic coordinates when used inside groups. | + +## Tips + +- Keep fabrication notes concise so they remain legible when exported to Gerbers or assembly drawings. +- Use distinct `anchorAlignment` values to align the note with the area or component it refers to. +- Combine fabrication notes with [``](../elements/group.mdx) to move related callouts together when laying out subassemblies. +- Fabrication notes are separate from silkscreen text—they will not print on the final PCB silkscreen layer. diff --git a/docs/footprints/footprint-elements-vs-footprint-strings.mdx b/docs/footprints/footprint-elements-vs-footprint-strings.mdx index cd7ad5f9..9d8acd3d 100644 --- a/docs/footprints/footprint-elements-vs-footprint-strings.mdx +++ b/docs/footprints/footprint-elements-vs-footprint-strings.mdx @@ -1,4 +1,37 @@ --- title: Footprint Elements vs Strings +description: Compare using footprint elements and footprinter strings when defining components sidebar_position: 1 ---- \ No newline at end of file +--- + +When setting the `footprint` property for an element, you can either +use [footprinter strings](./footprinter-strings.mdx) or use the [``](../elements/footprint.mdx) +element and manually specify pad positions. + +Footprinter strings are often quicker, more concise, and have the benefit of often +mapping to a 3d model. + + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + + } pcbX={3} resistance="1k" /> + + ) +`} /> diff --git a/docs/footprints/footprinter-strings.mdx b/docs/footprints/footprinter-strings.mdx new file mode 100644 index 00000000..87fd2387 --- /dev/null +++ b/docs/footprints/footprinter-strings.mdx @@ -0,0 +1,438 @@ +--- +title: Footprinter Strings +sidebar_position: 2 +description: >- + You can quickly specify the footprint and 3d model for any element by setting + the `footprint` property to a string. +--- + +## Overview + +You can quickly specify the footprint and 3d model for any element by setting +the `footprint` property to a string. + +import FootprintPreview from "@site/src/components/FootprintPreview" + + + +## dip + +Dual in-line package. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `p` | `"2.54mm"` | Pitch. Space between pins | +| `id` | `"1mm"` | Inner diameter (hole diameter) of plated holes | +| `od` | `"1.5mm"`| Outer diameter (copper diameter) of plated holes | +| `w` | `"300mil"` | Distance between columns | +| `wide` | `false` | Wide DIP style (600mil between columns) | +| `narrow` | `true` | Narrow DIP style (300mil between columns) | + + +## axial + +Basic through-hole “axial” resistor or diode footprint. + +Examples: + +- `axial` +- `axial_p0.1in` + + + +`axial` parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `p` | `"2.54mm"` | Pitch. Space between pins | +| `id` | `"0.7mm"` | Inner diameter (hole diameter) of plated holes | +| `od` | `"1mm"` | Outer diameter (copper diameter) of plated holes | + +## 0402 + +Standard imperial 0402 package. `1.0mm × 0.5mm` + + + +## 0603 + +Standard imperial 0603 package. `1.6mm × 0.8mm` + + + +## 0805 + +Standard imperial 0805 package. `2.0mm × 1.2mm` + + + +## 1206 + +Standard imperial 1206 package. `3.2mm × 1.6mm` + + + +## 1210 + +Standard imperial 1210 package. `3.2mm × 2.5mm` + + + +## soic + +Small Outline Integrated Circuit (SOIC) footprint. + + + +**Parameters:** + +| Parameter | Default | Description | +|---------------|------------|-------------------------------------------------------------------------| +| `num_pins` | `8` | Number of pins in the package. | +| `w` | `"5.3mm"` | Overall package width. | +| `p` | `"1.27mm"` | Pin pitch (center-to-center distance between adjacent pins). | +| `pl` | `"1.0mm"` | Pin length. | +| `pw` | `"0.6mm"` | Pin width. | +| `legsoutside` | `false` | If true, positions pins outside the package body; otherwise, pins are inset. | + +--- + +## bga + +Ball Grid Array (BGA) footprint. + + + +**Parameters:** + +| Parameter | Default | Description | +|-------------|---------------|----------------------------------------------------------------------------------| +| `num_pins` | `64` | Total number of solder balls. | +| `grid` | _calculated_ | Grid dimensions as an object (e.g. `{ x: N, y: N }`). If unspecified, a square grid is assumed. | +| `p` | `"0.8mm"` | Ball pitch: center-to-center distance between adjacent balls. | +| `w` | _none_ | Package width (optional). | +| `h` | _none_ | Package height (optional). | +| `ball` | _none_ | Ball diameter (optional). | +| `pad` | _none_ | Pad size for each ball (optional). | +| `tlorigin` | `false` | Use top-left numbering for balls. | +| `blorigin` | `false` | Use bottom-left numbering for balls. | +| `trorigin` | `false` | Use top-right numbering for balls. | +| `brorigin` | `false` | Use bottom-right numbering for balls. | +| `missing` | `[]` | List of balls to omit (by number or position) to accommodate design needs. | + +## tssop + +Thin-Shrink Small Outline Package (TSSOP) footprint. Default configuration is 6.1mm width with 0.65mm pitch. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `8` | Number of pins in the package | +| `w` | `"6.1mm"` | Overall package width | +| `p` | `"0.65mm"` | Pin pitch (center-to-center distance between adjacent pins) | +| `pw` | _calculated_ | Pin width (calculated from pitch if not specified) | +| `pl` | _calculated_ | Pin length (calculated from pin width if not specified) | + +## tqfp + +Thin Quad Flat Package (TQFP) footprint with intelligent defaults based on pin count. Commonly used for microcontrollers and FPGAs. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `32` | Total number of pins (must be divisible by 4). Common values: 32, 44, 48, 64, 80, 100, 144 | +| `p` | _varies_ | Pin pitch. Defaults: 0.8mm for 32-pin, 0.5mm for 44+ pins | +| `pl` | _varies_ | Pin length. Defaults based on pin count: 1.475mm for 32-100 pins, 1.6mm for 144 pins | +| `pw` | _varies_ | Pin width. Defaults based on pin count: 0.55mm (32-pin), 0.3mm (44-100 pins), 0.25mm (144-pin) | +| `w` | _inherited_ | Package width (inherited from quad base) | +| `h` | _inherited_ | Package height (inherited from quad base) | + +## stampboard + +A breakout board with configurable pins on all sides. Can include inner holes for mounting. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `w` | `"22.58mm"` | Board width | +| `h` | _calculated_ | Board height (calculated from number of pins if not specified) | +| `left` | `20` | Number of pins on left side | +| `right` | `20` | Number of pins on right side | +| `top` | `2` | Number of pins on top side | +| `bottom` | `2` | Number of pins on bottom side | +| `p` | `"2.54mm"` | Pin pitch | +| `pw` | `"1.6mm"` | Pin width | +| `pl` | `"2.4mm"` | Pin length | +| `innerhole` | `false` | Whether to include inner mounting holes | +| `innerholeedgedistance` | `"1.61mm"` | Distance of inner holes from edge | + +## stampreceiver + +Similar to stampboard but with modified pad dimensions for receiving a stampboard component. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `w` | `"22.58mm"` | Board width | +| `h` | _calculated_ | Board height (calculated from number of pins if not specified) | +| `left` | `20` | Number of pins on left side | +| `right` | `20` | Number of pins on right side | +| `top` | `2` | Number of pins on top side | +| `bottom` | `2` | Number of pins on bottom side | +| `p` | `"2.54mm"` | Pin pitch | +| `pw` | `"1.6mm"` | Pin width | +| `pl` | `"3.2mm"` | Pin length | +| `innerhole` | `false` | Whether to include inner mounting holes | +| `innerholeedgedistance` | `"1.61mm"` | Distance of inner holes from edge | + +## hc49 + +Standard HC49 crystal footprint. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `p` | `"4.88mm"` | Pin pitch | +| `id` | `"0.6mm"` | Inner diameter of plated holes | +| `od` | `"1.2mm"` | Outer diameter of plated holes | +| `w` | `"5.6mm"` | Package width | +| `h` | `"3.5mm"` | Package height | + +## to92 + +TO-92 transistor package footprint, available in triangular or inline arrangements. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `p` | `"1.27mm"` | Pin pitch | +| `id` | `"0.72mm"` | Inner diameter of plated holes | +| `od` | `"0.95mm"` | Outer diameter of plated holes | +| `w` | `"4.5mm"` | Package width | +| `h` | `"4.5mm"` | Package height | +| `arrangement` | `"triangular"` | Pin arrangement, either "triangular" or "inline" | + +## to220 + +TO-220 package footprint with configurable number of pins. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `3` | Number of pins (specify using format "to220_N") | +| `p` | `"5.0mm"` | Pin pitch | +| `id` | `"1.0mm"` | Inner diameter of plated holes | +| `od` | `"1.9mm"` | Outer diameter of plated holes | +| `w` | `"13mm"` | Package width | +| `h` | `"7mm"` | Package height | + +## ssop + +Shrink Small Outline Package (SSOP) footprint. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `8` | Number of pins in the package | +| `w` | `"3.9mm"` | Overall package width | +| `p` | `"1.27mm"` | Pin pitch (center-to-center distance between adjacent pins) | +| `pw` | _calculated_ | Pin width (calculated from pitch if not specified) | +| `pl` | _calculated_ | Pin length (calculated from pin width if not specified) | + +## sop8 + +8-pin Small Outline Package (SOP) footprint. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `8` | Fixed at 8 pins | +| `w` | _inherited_ | Overall package width | +| `p` | _inherited_ | Pin pitch | +| `pl` | `"1.5mm"` | Pin length | +| `pw` | `"0.6mm"` | Pin width | + +## qfp + +Quad Flat Package (QFP) footprint with configurable number of pins. Add +`thermalpad` for a centered exposed pad, or pass dimensions such as +`thermalpad3x3mm` to size it. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `32` | Total number of pins (must be divisible by 4) | +| `w` | _calculated_ | Package body width | +| `h` | _same as `w`_ | Package body height | +| `p` | `"0.8mm"` | Pin pitch (center-to-center distance between adjacent pins) | +| `pw` | `"0.25mm"` | Pin width | +| `pl` | `"0.6mm"` | Pin length (exposed pad length) | +| `thermalpad` | _none_ | Center exposed thermal pad. Use `thermalpad` for the default size or `thermalpad3x3mm` for a custom width and height. | + +## qfn + +Quad Flat No-Lead (QFN) package footprint with configurable number of pins. Add +`thermalpad` for a centered exposed pad, or pass dimensions such as +`thermalpad3.1x3.1mm` to size it. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `20` | Total number of pins (must be divisible by 4) | +| `w` | _calculated_ | Package body width | +| `h` | _same as `w`_ | Package body height | +| `p` | `"0.5mm"` | Pin pitch (center-to-center distance between adjacent pins) | +| `pw` | `"0.25mm"` | Pin width | +| `pl` | `"0.875mm"` | Pin length (exposed pad length) | +| `thermalpad` | _none_ | Center exposed thermal pad. Use `thermalpad` for the default size or `thermalpad3.1x3.1mm` for a custom width and height. | + +## sot23 + +Small Outline Transistor (SOT-23) footprint with 3 pins. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `3` | Fixed at 3 pins | +| `body_size` | `"2.9mm"` | Size of the package body | +| `p` | `"0.95mm"` | Pin pitch | +| `pw` | `"0.4mm"` | Pin width | +| `pl` | `"0.6mm"` | Pin length | + +## sot23_5 + +Small Outline Transistor (SOT-23-5) footprint with 5 pins. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `5` | Fixed at 5 pins | +| `body_size` | `"2.9mm"` | Size of the package body | +| `p` | `"0.95mm"` | Pin pitch | +| `pw` | `"0.4mm"` | Pin width | +| `pl` | `"0.6mm"` | Pin length | + +## sot223 + +Small Outline Transistor (SOT-223) footprint with 4 pins. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `4` | Fixed at 4 pins | +| `body_size` | `"6.5mm"` | Size of the package body | +| `p` | `"2.3mm"` | Pin pitch | +| `pw` | `"0.7mm"` | Pin width | +| `pl` | `"0.8mm"` | Pin length | + +## pinrow + +Row of pins suitable for male or female pin headers. If `_male` or `_female` +is specified the 3d model will update accordingly. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | 6 | Number of pins | +| `p` | `"0.1in"` | Pin pitch | +| `id` | `"1.0mm"` | Inner diameter | +| `od` | `"1.5mm"` | Outer diameter | +| `rows` | 1 | Number of rows (single- or double-row headers) | +| `male` | true | Male header | +| `female` | false | Female header | +| `smd` | false | Surface mount device | +| `rightangle` | false | Right angle configuration | +| `pw` | `"1.0mm"` | Pad width for SMD | +| `pl` | `"2.0mm"` | Pad length for SMD | +| `pinlabeltextalignleft` | false | Align pin labels to the left | +| `pinlabeltextaligncenter` | false | Align pin labels to the center | +| `pinlabeltextalignright` | false | Align pin labels to the right | +| `pinlabelverticallyinverted` | false | Vertically invert pin labels | +| `pinlabelorthogonal` | false | Make pin labels orthogonal | +| `nosquareplating` | false | Do not use rectangular pad for pin 1 | +| `nopinlabels` | false | Omit silkscreen pin labels | +| `doublesidedpinlabel` | false | Add silkscreen pins in top and bottom layers | +| `bottomsidepinlabel` | false | Place silkscreen reference text on bottom layer | + +## micromelf + +Micro MELF (Metal Electrode Leadless Face) package. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `2` | Number of pins (fixed at 2) | +| `w` | `"3.0mm"` | Package width | +| `h` | `"1.80mm"` | Package height | +| `pl` | `"0.80mm"` | Pad length | +| `pw` | `"1.20mm"` | Pad width | +| `p` | `"1.6mm"` | Pin pitch | + +## minimelf + +Mini MELF (Metal Electrode Leadless Face) package. + + + +Parameters: + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `num_pins` | `2` | Number of pins (fixed at 2) | +| `w` | `"5.40mm"` | Package width | +| `h` | `"2.30mm"` | Package height | +| `pl` | `"1.30mm"` | Pad length | +| `pw` | `"1.70mm"` | Pad width | +| `p` | `"3.5mm"` | Pin pitch | diff --git a/docs/footprints/jlcpcb-footprints.mdx b/docs/footprints/jlcpcb-footprints.mdx new file mode 100644 index 00000000..8f50a2dc --- /dev/null +++ b/docs/footprints/jlcpcb-footprints.mdx @@ -0,0 +1,48 @@ +--- +title: JLCPCB Footprints +sidebar_position: 2 +description: Use JLCPCB supplier part numbers directly with the `jlcpcb:` footprint prefix +--- + +tscircuit can load PCB footprints directly from JLCPCB/EasyEDA part records. Any element that accepts a `footprint` property can reference a JLCPCB part by using the `jlcpcb:` prefix followed by the supplier part number. + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Basic Usage + + ( + + + +)`} +/> + +The recommended format is `jlcpcb:C`, for example `jlcpcb:C2040`. + +For example, the RP2040 can be referenced directly with: + +```tsx + +``` + +## What Gets Loaded + +When you use a `jlcpcb:` footprint string, tscircuit fetches the part's PCB footprint data from the configured parts engine. In the default platform, this uses the JLCPCB/EasyEDA part catalog and can also attach 3D model data when it is available. + +Use this when you only need the PCB footprint (and optional 3D model). If you also need a generated symbol, port definitions, or a reusable TSX component, use [Importing from JLCPCB](/guides/importing-modules-and-chips/importing-from-jlcpcb) instead. + +## Search for Part Numbers + +You can discover valid JLCPCB part numbers with: + +```bash +tsci search --jlcpcb RP2040 +``` + +Search results now include qualified footprint strings like `jlcpcb:C2040`, which can be copied directly into your `footprint` prop. diff --git a/docs/footprints/kicad-footprints.mdx b/docs/footprints/kicad-footprints.mdx new file mode 100644 index 00000000..0c4cf85c --- /dev/null +++ b/docs/footprints/kicad-footprints.mdx @@ -0,0 +1,44 @@ +--- +title: KiCad Footprints +sidebar_position: 3 +description: Use KiCad's footprint libraries by referencing them with the `kicad:` prefix +--- + +## Overview + +tscircuit can load PCB footprints directly from KiCad's footprint libraries. Any element that accepts a `footprint` property can reference a KiCad footprint by using the `kicad:` prefix followed by the path inside the library. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + +)`} /> + + +### Footprint string format + +The text after `kicad:` follows the same convention as KiCad's `.pretty` directories: `/`. tscircuit retrieves the associated `.kicad_mod` file on demand and uses it for PCB generation. + +### Official KiCad footprint libraries + +You can browse the official KiCad footprint libraries to discover valid `/` values to use with the `kicad:` prefix. See: [KiCad Footprints (GitLab)](https://gitlab.com/kicad/libraries/kicad-footprints). + +## kicadFootprintStrings + +For TypeScript autocomplete and compile-time validation, use the `kicadFootprintStrings` object: + +```tsx +import { kicadFootprintStrings } from "tscircuit" + + +// → footprint="kicad:Resistor_SMD/R_0402_1005Metric" +``` + +Invalid keys are caught as type errors at compile time. diff --git a/docs/footprints/platedhole.mdx b/docs/footprints/platedhole.mdx new file mode 100644 index 00000000..bea3fae1 --- /dev/null +++ b/docs/footprints/platedhole.mdx @@ -0,0 +1,76 @@ +--- +title: +description: >- + The `` element is used to represent a plated through hole on a + PCB. +--- + +## Overview + +The `` element is used to represent a plated through hole on a PCB. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + } /> + + ) + `} +/> + +## Plated Hole Shapes + +`` supports these shapes: + +- `circle` - A circular plated hole +- `oval` - An oval plated hole +- `pill` - A pill-shaped plated hole (rounded rectangle) +- `circular_hole_with_rect_pad` - A circular drill with a rectangular copper pad +- `pill_hole_with_rect_pad` - A pill-shaped drill with a rectangular copper pad +- `hole_with_polygon_pad` - A hole with a custom polygon copper pad + +Each shape has different properties. + +## Properties + +| Property | Shape | Description | +| -------- | ----- | ----------- | +| holeDiameter | `circle`, `circular_hole_with_rect_pad`, `hole_with_polygon_pad` | Diameter of the drill hole when the hole is circular | +| outerDiameter | `circle` | Diameter of the copper pad | +| holeWidth | `oval`, `pill`, `pill_hole_with_rect_pad`, `hole_with_polygon_pad` | Width of the drill hole | +| holeHeight | `oval`, `pill`, `pill_hole_with_rect_pad`, `hole_with_polygon_pad` | Height of the drill hole | +| innerWidth | `oval`, `pill` | Deprecated alias for `holeWidth` | +| innerHeight | `oval`, `pill` | Deprecated alias for `holeHeight` | +| outerWidth | `oval`, `pill` | Width of the copper pad | +| outerHeight | `oval`, `pill` | Height of the copper pad | +| rectPadWidth | `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad` | Width of the rectangular copper pad | +| rectPadHeight | `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad` | Height of the rectangular copper pad | +| rectBorderRadius | `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad` | Corner radius for the rectangular copper pad | +| padOutline | `hole_with_polygon_pad` | Polygon points for the copper pad outline | +| holeShape | `hole_with_polygon_pad` | Hole shape inside the polygon pad: `circle`, `oval`, `pill`, or `rotated_pill` | +| holeOffsetX | `pill`, `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad`, `hole_with_polygon_pad` | X offset of the drill hole relative to the pad center | +| holeOffsetY | `pill`, `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad`, `hole_with_polygon_pad` | Y offset of the drill hole relative to the pad center | +| rectPad | `pill` | When `true`, shape inference prefers `pill` instead of `oval` | +| portHints | all | Array of port names that this hole connects to | +| connectsTo | all | Net or nets that this plated hole should connect to | +| solderMaskMargin | all | Solder mask opening margin around the plated hole | +| coveredWithSolderMask | all | Whether the plated hole should be covered by solder mask | +| pcbX | all | X position of the hole center on the PCB | +| pcbY | all | Y position of the hole center on the PCB | +| pcbRotation | `oval`, `pill`, `circular_hole_with_rect_pad`, `pill_hole_with_rect_pad` | Rotation of the plated hole and pad geometry | +| name | all | Optional name identifier for the plated hole | diff --git a/docs/footprints/silkscreencircle.mdx b/docs/footprints/silkscreencircle.mdx new file mode 100644 index 00000000..596f0e99 --- /dev/null +++ b/docs/footprints/silkscreencircle.mdx @@ -0,0 +1,22 @@ +--- +title: +description: Silkscreen circles are often used to indicate "pin1" on a chip. +--- + +## Overview + +Silkscreen circles are often used to indicate "pin1" on a chip. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + + + ) +`} /> diff --git a/docs/footprints/silkscreenline.mdx b/docs/footprints/silkscreenline.mdx new file mode 100644 index 00000000..1929f2e8 --- /dev/null +++ b/docs/footprints/silkscreenline.mdx @@ -0,0 +1,44 @@ +--- +title: +description: >- + The `` element creates a line on the silkscreen layer within + a footprint. +--- + +## Overview + +The `` element creates a line on the silkscreen layer within a footprint. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + ) + `} +/> + +## Properties + +| Property | Description | +|----------|----------------------------------------------------| +| `x1` | X coordinate of the starting point | +| `y1` | Y coordinate of the starting point | +| `x2` | X coordinate of the ending point | +| `y2` | Y coordinate of the ending point | +| `strokeWidth` | Stroke width of the line | + +Feel free to experiment with different coordinate values to see how the silkscreen line is rendered. diff --git a/docs/footprints/silkscreenpath.mdx b/docs/footprints/silkscreenpath.mdx new file mode 100644 index 00000000..007e1dd0 --- /dev/null +++ b/docs/footprints/silkscreenpath.mdx @@ -0,0 +1,83 @@ +--- +title: +description: >- + The `` element is used to define a custom drawn path on the + silkscreen layer. +--- + +## Overview + +The `` element is used to define a custom drawn path on the silkscreen layer. +It supports the following properties: + +- route: an array of coordinate objects (each with x and y) that define the path. +- strokeWidth: defines the width of the path's stroke. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + } pcbX={-15} /> + + ) + `} +/> + +## Properties + +| Property | Type | Description | +| ----------- | ------ | -------------------------------------------------------------------- | +| route | Array | An array of objects containing x and y coordinates to define a path. | +| strokeWidth | String | The width of the drawn path. | + +Feel free to experiment with different routes and strokeWidth values. diff --git a/docs/footprints/silkscreenrect.mdx b/docs/footprints/silkscreenrect.mdx new file mode 100644 index 00000000..be0a589f --- /dev/null +++ b/docs/footprints/silkscreenrect.mdx @@ -0,0 +1,72 @@ +--- +title: +description: Silkscreen rectangles can be used to encapsulate a rectangular area around a chip. +--- + +## Overview + +Silkscreen rectangles can be used to encapsulate a rectangular area around a +chip + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + + ) +`} /> + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| `pcbX` | length | X coordinate of the rectangle center on the PCB silkscreen. | +| `pcbY` | length | Y coordinate of the rectangle center on the PCB silkscreen. | +| `width` | length | Width of the rectangle. | +| `height` | length | Height of the rectangle. | +| `cornerRadius` | length | Corner radius for rounded rectangle corners. | +| `strokeWidth` | length | Thickness of the rectangle outline. | +| `filled` | boolean | When `true`, fills the rectangle instead of drawing only the outline. | +| `hasStroke` | boolean | When `false`, hides the outline even if `filled` is not set. | +| `isStrokeDashed` | boolean | When `true`, renders the outline with a dashed pattern. | +| `layer` | string | PCB layer to place the silkscreen rectangle on. | + +## Stroke Width + +Use `strokeWidth` to control the outline thickness of the rectangle. This is helpful when you want to match line weights across silkscreen features. + + ( + + + + + + + ) +`} /> + +## Filled Silkscreen Rectangles + +Enable the `filled` prop to create solid silkscreen blocks—useful for alignment targets or bold markings. You can mix filled and outlined rectangles within the same footprint. + + ( + + + + + + + ) +`} /> diff --git a/docs/footprints/silkscreentext.mdx b/docs/footprints/silkscreentext.mdx new file mode 100644 index 00000000..e327e3e5 --- /dev/null +++ b/docs/footprints/silkscreentext.mdx @@ -0,0 +1,64 @@ +--- +title: +description: >- + The `` element is used to add text to the silkscreen layer + within a PCB footprint. +--- + +## Overview + +The `` element is used to add text to the silkscreen layer within a PCB footprint. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + )`} +/> + + + +## Properties + +| Property | Type | Description | +|-----------------|--------|---------------------------------------------------------------------------------------------------------------| +| `text` | string | The text string to display. | +| `anchorAlignment` | enum | Alignment of the text. One of "center", "top_left", "top_right", "bottom_left", "bottom_right". Defaults to "center". | +| `font` | enum | Optional. The font type, e.g. `"tscircuit2024"`. | +| `fontSize` | length | Optional. The size of the font. If not specified, inherits from the board's `pcbStyle.silkscreenFontSize` if set. | +| `isKnockout` | boolean| Optional. If true, the text will "knock out" the silkscreen background around it. | +| `knockoutPadding` | length | Optional. Padding around the text when `isKnockout` is true. Can be a single value or individual sides (e.g., `knockoutPaddingLeft`). | + +## Knockout Text + +Knockout text allows you to create readable text by removing the background silkscreen material. This is particularly useful when text is placed over other silkscreen elements or copper pours. + + ( + + + + )`} +/> + + +## Global Font Size + +You can set a global font size for all silkscreen text elements using the `pcbStyle` prop on the `` element. See the [board documentation](../elements/board.mdx#global-silkscreen-text-size-adjustment) for details. + +When a global `silkscreenFontSize` is set on the board, all `` elements without an explicit `fontSize` prop will use that global size. You can still override it by providing a `fontSize` prop on individual elements. diff --git a/docs/footprints/smtpad.mdx b/docs/footprints/smtpad.mdx new file mode 100644 index 00000000..0cc5e8bd --- /dev/null +++ b/docs/footprints/smtpad.mdx @@ -0,0 +1,122 @@ +--- +title: +description: The `` element is used to represent a surface mount pad. +--- + +## Overview + +The `` element is used to represent a surface mount pad. + +import CircuitPreview from "@site/src/components/CircuitPreview" + + ( + + + + + } /> + + ) + `} +/> + +## SMT Pad Shapes + +There are 4 main types of smtpads: + +- `rect` - A rectangular pad +- `circle` - A circular pad +- `pill` - A pill-shaped pad +- `polygon` - A custom polygon-shaped pad defined by a list of points + +Each smtpad shape has different properties. + +## Properties + +| Property | Shape | Description | +| ----------- | ------------ | --------------------------------------------------------------------------- | +| width | rect, pill | The width of the pad | +| height | rect, pill | The height of the pad | +| cornerRadius | rect | Optional. Corner radius for rectangular pads | +| radius | circle, pill | The radius of the pad (for circle) or corner radius (for pill) | +| points | polygon | An array of `{ x, y }` coordinates describing the polygon vertices | +| ccwRotation | rect | Counter-clockwise rotation angle in degrees | +| portHints | all | Array of port names that this pad connects to | +| pcbX | all | X position of the pad center on the PCB | +| pcbY | all | Y position of the pad center on the PCB | +| layer | all | Which layer the pad is on (`"top"` or `"bottom"`) | + +## Example: Rectangular Pad with Rounded Corners + +Use the `cornerRadius` property on rectangular pads to round their corners. + + ( + + + + + } /> + + ) + `} +/> + +## Example: Polygon Pad + +Here’s an example of using a **polygon smtpad** + + ( + + + + + } /> + + ) + `} +/> \ No newline at end of file diff --git a/docs/guides/automatic-layout.mdx b/docs/guides/automatic-layout.mdx deleted file mode 100644 index c9eae38d..00000000 --- a/docs/guides/automatic-layout.mdx +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Automatic Layout ---- - -:::warning -Automatic layout is in beta! We're changing and improving the layout algorithms, -if it doesn't work for you stay tuned! Many changes are on the way! -::: - -You can automatically lay out schematics and PCBs using the `schAutoLayoutEnabled` and -`pcbAutoLayoutEnabled` props. - -## Automatic Schematic Layout - -Here's an example of a Pico-driven nine key keyboard with `schAutoLayoutEnabled`: - -import CircuitPreview from "@site/src/components/CircuitPreview" - - - ( - - - {grid({ sizeX: 3, sizeY: 3, pitch: 19.05, offset: { x: 20, y: 0 } }).map( - ({ x, y, row, col }, index) => { - const schOffX = 5 + x/6 - const schOffY = -y / 8 - return ( - - - - - - - - ) - } - )} - -) - -function grid(opts: { - sizeX: number - sizeY: number - pitch: number - offset?: { x: number; y: number } -}): Array<{ x: number; y: number; row: number; col: number }> { - const { sizeX, sizeY, pitch, offset = { x: 0, y: 0 } } = opts - const points: Array<{ x: number; y: number; row: number; col: number }> = [] - const startX = (-(sizeX - 1) * pitch) / 2 - const startY = (-(sizeY - 1) * pitch) / 2 - for (let row = 0; row < sizeY; row++) { - for (let col = 0; col < sizeX; col++) { - points.push({ - x: startX + col * pitch + offset.x, - y: startY + row * pitch + offset.y, - row, - col, - }) - } - } - return points -} - -`} - -/> - -## Automatic PCB Layout - -:::warning -PCB Autolayout is not currently available but coming soon! If you're interested -in PCB Autolayout you should [upvote this issue on GitHub](https://github.com/tscircuit/tscircuit/issues/511) -::: \ No newline at end of file diff --git a/docs/guides/circuit-generation/_category_.json b/docs/guides/circuit-generation/_category_.json new file mode 100644 index 00000000..12549f5f --- /dev/null +++ b/docs/guides/circuit-generation/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Circuit Generation", + "position": 4, + "link": { + "type": "generated-index", + "description": "Learn how to generate circuits with AI assistance" + }, + "collapsible": true, + "collapsed": false +} diff --git a/docs/guides/circuit-generation/generating-circuit-boards-with-ai.mdx b/docs/guides/circuit-generation/generating-circuit-boards-with-ai.mdx new file mode 100644 index 00000000..df892e20 --- /dev/null +++ b/docs/guides/circuit-generation/generating-circuit-boards-with-ai.mdx @@ -0,0 +1,159 @@ +--- +title: Generating Circuit Boards with AI +sidebar_position: 1 +description: Learn how to use AI assistants with the tscircuit skill to design and generate circuit boards in tscircuit +--- + +import CircuitPreview from "@site/src/components/CircuitPreview"; + +AI assistants can help you design and generate circuit boards more quickly by understanding your requirements, searching for components, and writing tscircuit code. This guide walks you through setting up your project for AI-assisted circuit design. + +## Step 1: Choose Your Form Factor + +Before generating a circuit with AI, you'll typically want to start with a specific form factor or template. Common form factors include: + +- **Arduino Shield** - A PCB designed to stack on top of Arduino boards +- **Raspberry Pi Hat** - A PCB designed to connect to Raspberry Pi GPIO headers +- **MicroMod Module** - SparkFun's modular prototyping standard +- **Custom Board** - Define your own dimensions and shape + +Many of these templates are available via `@tscircuit/common`, making it easy to get started with a compatible board layout. + +### Example: Using an Arduino Shield Template + +Here's how you can start with an Arduino Shield form factor: + + ( + + + + + + + +) +`} /> + +The `ArduinoShield` component automatically includes the correct mounting holes, header connectors, and board dimensions to fit standard Arduino boards. + +## Step 2: Install the tscircuit Skill + +Install the `tscircuit` skill so your AI assistant has the context it needs to +design boards with tscircuit: + +```bash +npx skills add tscircuit/skill +``` + +The skill lives in the [tscircuit/skill](https://github.com/tscircuit/skill) +repository, and it includes the syntax, CLI workflows, and design patterns the +AI needs to build a board from scratch. + +Once the skill is installed, describe the board you want to build, your form +factor, and any constraints. The AI can then search for parts, write circuit +code, and iterate on the design with the right tscircuit context. + +## Step 3: How AI Assists with Circuit Design + +Once configured, AI assistants can help you by: + +### Searching for Components + +When you ask for a specific component, the AI can use `tsci search` to find suitable parts: + +```bash +$ tsci search "555 timer" +Found 5 footprint(s) from KiCad: + 1. Package_SO/SOIC-8_3.9x4.9mm_P1.27mm + 2. Package_DIP/DIP-8_W7.62mm + ... + +Found 3 package(s) in the tscircuit registry: +1. johndoe/555-timer-circuit (v1.0.2) - Complete 555 timer circuit +... +``` + +### Importing Components + +The AI can import pre-built components from the registry: + +```bash +$ tsci import seveibar/usb-c-connector +``` + +This adds the component to your project dependencies, making it available to import in your circuit files. + +### Writing Circuit Code + +The AI can generate tscircuit code based on your requirements, using the correct syntax for: + +- Component placement +- Trace routing +- Pin configurations +- Footprint selection + +### Iterating on Designs + +As you provide feedback, the AI can: + +- Adjust component values +- Add or remove parts +- Reorganize layouts +- Fix connection errors + +## Example Workflow + +Here's a typical workflow for AI-assisted circuit design: + +1. **Define your goal**: "I want to create an Arduino Shield that reads temperature from a sensor and displays it on an LCD" + +2. **AI searches for components**: + + ```bash + tsci search "temperature sensor" + tsci search "16x2 LCD" + ``` + +3. **AI generates initial circuit**: + + ```tsx + import { ArduinoShield } from "@tscircuit/common"; + + export default () => ( + + + {/* ... rest of circuit ... */} + + ); + ``` + +4. **Preview and iterate**: Run `tsci dev` to see the design, then ask the AI to make adjustments + +5. **Export fabrication files**: When ready, use `tsci export gerber` to generate files for manufacturing + +## Tips for Working with AI + +- **Be specific**: Describe exactly what you want, including component types and values +- **Provide context**: Reference your form factor and any physical constraints +- **Iterate gradually**: Make changes in small steps rather than redesigning everything at once +- **Verify connections**: Always check that all components are properly connected +- **Review footprints**: Confirm that selected footprints match your manufacturing requirements + +## Next Steps + +- Learn more about [essential tscircuit elements](/guides/tscircuit-essentials/essential-elements) +- Explore [automatic PCB layout](/guides/tscircuit-essentials/automatic-pcb-layout) +- Read about [configuring chips](/guides/tscircuit-essentials/configuring-chips) +- Check out the [tscircuit CLI commands](/command-line/tsci-dev) diff --git a/docs/guides/configuring-chips.md b/docs/guides/configuring-chips.md deleted file mode 100644 index 79f5f9a9..00000000 --- a/docs/guides/configuring-chips.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Configuring Chips -sidebar_position: 1.5 ---- diff --git a/docs/guides/distributing-tscircuit-libraries.md b/docs/guides/distributing-tscircuit-libraries.md new file mode 100644 index 00000000..23e3f09f --- /dev/null +++ b/docs/guides/distributing-tscircuit-libraries.md @@ -0,0 +1,51 @@ +--- +title: Distributing tscircuit Libraries +description: Publish and distribute tscircuit libraries, including how to make private package builds installable without authorization. +--- + +## Overview + +tscircuit libraries are typically distributed from a published package page on +[tscircuit.com](https://tscircuit.com). In many cases you want the package to +stay private while still allowing downstream tools and users to install the +generated distribution files. + +You can do that by turning on **Enable Public Dist** in the package settings. +This keeps the package private while making the built distribution artifacts +publicly fetchable, which means they can be installed without authorization. + +## When to Enable Public Dist + +Enable **Public Dist** when: + +- You want to keep the package itself private on tscircuit.com +- You still want consumers to install the package's built outputs +- You need unauthenticated access for package distribution flows + +This is especially useful for library distribution workflows where the install +step needs to succeed without a signed-in tscircuit session. + +## How to Enable Public Dist + +1. Open your package page on [tscircuit.com](https://tscircuit.com). +2. Go to the package **Settings** page. +3. Turn on **Enable Public Dist**. +4. Save the setting if prompted. + +
+ Enable Public Dist option in the tscircuit package settings page +
+ The package settings page includes an Enable Public Dist + option for exposing distribution artifacts without requiring authorization. +
+
+ +## Result + +After **Enable Public Dist** is turned on, the package's distribution artifacts +can be installed without authorization even if the package remains private. +Use this when you want private package management with public, installable build +outputs. diff --git a/docs/guides/importing-modules-and-chips/_category_.json b/docs/guides/importing-modules-and-chips/_category_.json index c473aeea..a7ab01ab 100644 --- a/docs/guides/importing-modules-and-chips/_category_.json +++ b/docs/guides/importing-modules-and-chips/_category_.json @@ -6,5 +6,5 @@ "description": "Convert and import chips from JLCPCB, KiCad and the tscircuit registry" }, "collapsible": true, - "collapsed": true + "collapsed": false } diff --git a/docs/guides/importing-modules-and-chips/importing-from-circuit-json.mdx b/docs/guides/importing-modules-and-chips/importing-from-circuit-json.mdx index 11dce686..11868b6a 100644 --- a/docs/guides/importing-modules-and-chips/importing-from-circuit-json.mdx +++ b/docs/guides/importing-modules-and-chips/importing-from-circuit-json.mdx @@ -1,5 +1,6 @@ --- title: Importing from Circuit JSON +description: You can import Circuit JSON into tscircuit components. --- ## Overview @@ -25,4 +26,4 @@ TODO we're still writing this section! ## Programmatically Converting Circuit JSON to tscircuit code You can use the [circuit-json-to-tscircuit](https://github.com/tscircuit/circuit-json-to-tscircuit) -module to programmatically convert circuit json into tscircuit code. \ No newline at end of file +module to programmatically convert circuit json into tscircuit code. diff --git a/docs/guides/importing-modules-and-chips/importing-from-jlcpcb.mdx b/docs/guides/importing-modules-and-chips/importing-from-jlcpcb.mdx index f30bcff5..dc4dc4fc 100644 --- a/docs/guides/importing-modules-and-chips/importing-from-jlcpcb.mdx +++ b/docs/guides/importing-modules-and-chips/importing-from-jlcpcb.mdx @@ -1,13 +1,63 @@ --- title: Importing from JLCPCB sidebar_position: 2 +description: JLCPCB has a massive component catalog of 3d models and footprints. --- +import YouTubeEmbed from '../../../src/components/YouTubeEmbed'; + ## Overview -JLCPCB has a massive component catalog of 3d models and footprints. +JLCPCB maintains a massive component catalog with 3D models and footprints for thousands of parts. You can import these components directly into your tscircuit projects using several methods. + +If you only need the PCB footprint, you can skip importing entirely and reference the supplier part number directly with a `jlcpcb:` footprint string, such as `footprint="jlcpcb:C2040"`. See [JLCPCB Footprints](/footprints/jlcpcb-footprints) for the direct-footprint workflow. + +## Import Using Editor Locally + +The easiest way to import JLCPCB components is using the editor's built-in import dialog when running `tsci dev`. This provides a modern search interface with real-time stock information. + + +
+ +
Run `tsci dev` to start the development server
+
+ +
+ +
In the tsci dev environment, navigate to "File -> Import"
+
+ +
+ +
Go to the JLCPCB Parts tab and search by part number (e.g., 'C5100227') or keyword (e.g., 'ESP32')
+
+ +
+ +
Select component and click Import
+
+ + -## Web Import +After importing, you can use the component in your circuit like this: + +### Example Usage + +```tsx +import { ComponentName } from "@tsci/imported-component" + +export default () => ( + + + +) +``` + +:::tip Tip +Using File > Import from the editor locally is recommended +::: + +## Import Using Web UI You can import JLCPCB components on [tscircuit.com](https://tscircuit.com). After importing the snippet, it'll be given a package name like `@tsci/YOUR_NAME.CHIP_NAME` @@ -50,18 +100,3 @@ export default () => (
) ``` - - -## CLI Import - -To import using the CLI, run `npm install -g easyeda`. This will give you the -`easyeda` command line tool. You can then run `easyeda convert` as shown below - -``` -# Convert a schematic and footprint for JLCPCB part number C46749 (NE555) -# to tscircuit component -easyeda convert -i C46749 -o C46749.tsx -easyeda convert -i C46749 -t tsx -``` - -This will create a `tsx` file that you can impor. diff --git a/docs/guides/importing-modules-and-chips/importing-from-kicad.md b/docs/guides/importing-modules-and-chips/importing-from-kicad.md index 838e5d50..e1665fbd 100644 --- a/docs/guides/importing-modules-and-chips/importing-from-kicad.md +++ b/docs/guides/importing-modules-and-chips/importing-from-kicad.md @@ -1,4 +1,112 @@ --- title: Importing from KiCad sidebar_position: 3 +description: You can import KiCad components or projects into tscircuit. --- + +## Overview + +You can import KiCad components or projects into tscircuit. + +:::tip +If you're trying to use a footprint from KiCad's standard libraries, you can skip manual importing and reference it directly with the `kicad:` prefix (e.g. `kicad:Resistor_SMD/R_0402_1005Metric`). See [KiCad Footprints](/footprints/kicad-footprints) for more details. +::: + +To import from KiCad, you should understand the different file formats KiCad +uses: + +- Files for KiCad components + - `kicad_mod` - PCB footprint file for a single component + - `kicad_sym` - Schematic symbol file for a single component +- Files for KiCad projects + - `kicad_pro` - KiCad project file + - `kicad_pcb` - KiCad PCB board file + - `kicad_sch` - KiCad Schematic board file + +:::info +We're still building KiCad import directly into tscircuit.com, stay tuned for +when that's available! +::: + +## Importing KiCad Components + +Currently the easiest way to import KiCad components is to go to [kicad-component.tscircuit.com](https://kicad-component.tscircuit.com/) +and upload your `kicad_mod` and/or `kicad_sym` file. + +### Importing KiCad Components using the CLI + +Using tscircuit's [open-source KiCad component converter](https://github.com/tscircuit/kicad-component-converter), +we can convert KiCad files on the command line. + +First install the component converter: + +```bash +npm install -g kicad-component-converter +``` + +Next, run the following command to convert your KiCad files: + +```bash +# Convert a directory ./my-footprints.pretty to a tscircuit project +kicad-component-converter convert-kicad-directory --input-dir ./my-footprints.pretty --output-dir ./my-tscircuit-footprints +``` + +### Importing `.kicad_pcb` files directly + +You can import a KiCad PCB board file as Circuit JSON and place it inside a +tscircuit board with ``: + +```tsx +import { circuitJson } from "./example.kicad_pcb" + +circuit.add( + + + , +) +``` + +### Importing KiCad Components Programmatically + +```bash +bun add kicad-component-converter +``` + +#### Import `.kicad_mod` files directly + +`kicad-component-converter` registers a bundler loader that lets you import KiCad +footprints like any other module inside your tscircuit project: + +```tsx +import kicadMod from "./footprint.kicad_mod" + +export default () => { + return ( + + + + ) +} +``` + +#### Convert KiCad files manually + +If you need to do the conversion yourself (for example inside a build script), +you can read the `.kicad_mod` file and pass it through the parser: + +```tsx +import { parseKicadModToCircuitJson } from "kicad-component-converter" +import { readFileSync } from "node:fs" + +const fileContent = readFileSync("SW_SP3T_PCM13.kicad_mod") +const circuitJson = await parseKicadModToCircuitJson(fileContent) +/* [ + * { + * "type": "pcb_smtpad", + * "x": 0.345, + * ... + */ +``` + +[Circuit JSON](https://github.com/tscircuit/circuit-json) can then be converted +into regular tscircuit modules using [circuit-json-to-tscircuit](https://github.com/tscircuit/circuit-json-to-tscircuit) diff --git a/docs/guides/importing-modules-and-chips/installing-kicad-libraries-from-github.md b/docs/guides/importing-modules-and-chips/installing-kicad-libraries-from-github.md new file mode 100644 index 00000000..c9117f01 --- /dev/null +++ b/docs/guides/importing-modules-and-chips/installing-kicad-libraries-from-github.md @@ -0,0 +1,95 @@ +--- +title: Installing KiCad Libraries +sidebar_position: 4 +description: Install KiCad footprint libraries from GitHub and use them in your tscircuit projects with full TypeScript support. +--- + +## Overview + +You can install KiCad footprint libraries directly from GitHub using the `tsci add` or `tsci install` command. This is the easiest way to use existing KiCad footprints in your tscircuit projects, with automatic TypeScript type generation for full IDE support. + +## Installation + +To install a KiCad library from GitHub, use the `tsci add` command with the repository URL: + +```bash +tsci add https://github.com/espressif/kicad-libraries +``` + +![Installing KiCad library from GitHub](/img/guides/installing-kicad-library/install-lib.png) + +:::tip +`tsci install` is an alias for `tsci add` - both commands work identically. +::: + +## What Happens During Installation + +When you install a repository containing `.kicad_mod` files, `tsci` will automatically: + +1. **Add the package to `package.json`** - The library is added as a dependency +2. **Install in `node_modules`** - The package is downloaded and installed +3. **Detect KiCad footprints** - Scans for `.kicad_mod` files in the repository +4. **Generate TypeScript types** - Creates type definitions in `types/.d.ts` +5. **Configure `tsconfig.json`** - Adds the types directory to `typeRoots` + +## Using KiCad Footprints in Your Circuit + +After installation, you can import `.kicad_mod` files directly in your circuit code: + +```tsx +import kicadMod from "kicad-libraries/footprints/Espressif.pretty/ESP32-S2-MINI-1.kicad_mod" + +export default () => { + return ( + + + + ) +} +``` + +The imported `kicadMod` can be used directly as the `footprint` prop on components like ``. + +![ESP32-S2-MINI-1 PCB footprint](/img/guides/installing-kicad-library/pcb.png) + +## Generated Type Definitions + +When you install a KiCad library, `tsci` creates a type definition file in the `types/` directory. For example, installing `kicad-libraries` creates `types/kicad-libraries.d.ts`: + +```typescript +declare module "kicad-libraries/footprints/Espressif.pretty/ESP32-S2-MINI-1.kicad_mod" { + const value: string + export default value +} + +declare module "kicad-libraries/footprints/Espressif.pretty/ESP32-C3-MINI-1.kicad_mod" { + const value: string + export default value +} +// ... declarations for all .kicad_mod files in the library +``` + +This provides: +- **Full TypeScript support** - No type errors when importing `.kicad_mod` files +- **IDE autocomplete** - Your editor can suggest available footprint paths +- **Import validation** - Catch typos in import paths at compile time + +## tsconfig.json Configuration + +The command automatically updates your `tsconfig.json` to include the types directory: + +```json +{ + "compilerOptions": { + "typeRoots": ["./types", "./node_modules/@types"] + } +} +``` + +If your project doesn't have a `tsconfig.json`, one will be created with the necessary configuration. + +## See Also + +- [Importing from KiCad](/guides/importing-modules-and-chips/importing-from-kicad) - Other methods to import KiCad components +- [KiCad Footprints](/footprints/kicad-footprints) - Using KiCad's standard library footprints with the `kicad:` prefix +- [tsci add](/command-line/tsci-add) - Installing tscircuit registry packages diff --git a/docs/guides/importing-modules-and-chips/using-micromod-m2-connectors.md b/docs/guides/importing-modules-and-chips/using-micromod-m2-connectors.md new file mode 100644 index 00000000..dc3d88ae --- /dev/null +++ b/docs/guides/importing-modules-and-chips/using-micromod-m2-connectors.md @@ -0,0 +1,137 @@ +--- +title: Using MicroMod M.2 Connectors +sidebar_position: 5 +description: Document SparkFun MicroMod M.2 connector workflows for tscircuit boards. +--- + +## Overview + +[SparkFun MicroMod](https://www.sparkfun.com/micromod) is a modular board +standard that uses a keyed M.2 edge connector to plug processor boards into +carrier boards. In tscircuit, the most reliable way to design with MicroMod is +to treat the connector as a reusable component with a carefully named pin map, +then route your carrier board to the buses and power rails that your processor +board exposes. + +Use the official SparkFun references while assigning pin names: + +- [MicroMod Interface pin descriptions](https://cdn.sparkfun.com/assets/learn_tutorials/1/2/0/6/SparkFun_MicroMod_Interface_v1.0_-_Pin_Descriptions.pdf) +- [MicroMod Interface pinout](https://cdn.sparkfun.com/assets/learn_tutorials/1/2/0/6/SparkFun_MicroMod_Interface_v1.0_-_Pinout.pdf) +- [MicroMod graphical datasheet](https://cdn.sparkfun.com/assets/learn_tutorials/1/1/8/9/MicroMod_General_Pinout_v10_Graphical_Datasheet.pdf) +- [Getting started with MicroMod](https://learn.sparkfun.com/tutorials/getting-started-with-micromod) + +## Recommended workflow + +1. Pick the MicroMod processor board first. Different processors expose + different peripherals on the same connector pins. +2. Import or model the M.2 connector footprint before placing surrounding + circuits. If you already have a KiCad footprint, see + [Importing from KiCad](./importing-from-kicad.md). If the connector is in a + supplier catalog, see [Importing from JLCPCB](./importing-from-jlcpcb.mdx). +3. Name the connector pins by function, not only by number. For example, expose + pins such as `I2C_SDA`, `I2C_SCL`, `SPI_CIPO`, `SPI_COPI`, `SPI_SCK`, + `UART_TX`, `UART_RX`, `USB_D_P`, `USB_D_N`, `VIN`, `VCC_3V3`, and `GND`. +4. Route only the interfaces your carrier board needs. Leave unused pins + unconnected unless the processor board documentation requires pull-ups, + pull-downs, or test pads. +5. Keep the M.2 connector orientation, key, keepout, mounting holes, and board + edge clearance aligned with the SparkFun mechanical drawings. + +## Component pattern + +Create a local wrapper for the MicroMod connector so the rest of your circuit +can connect to named ports instead of raw pad numbers. + +```tsx +export const MicroModConnector = (props: { + name: string + footprint: string +}) => ( + +) +``` + +:::note +The snippet above shows the naming pattern, not a complete SparkFun pinout or a +built-in footprint name. Before manufacturing, pass the exact connector +footprint you imported or modeled, then replace the sample labels with the exact +pad numbers from the SparkFun MicroMod pinout PDF and your connector footprint. +::: + +## Example carrier board connections + +This example shows how a carrier board can connect common peripherals to a +MicroMod processor board once the connector wrapper has named ports. + +```tsx +export default () => ( + + + + + + + + + + + + + + + + + + + +) +``` + +## Layout checklist + +- Place the M.2 connector first and lock its orientation before routing. +- Confirm the keying and insertion direction against the processor board. +- Add keepouts around the connector, the board edge, and any required mounting + hardware. +- Keep high-speed USB differential traces short, length matched, and away from + noisy switching nodes. +- Put I2C pull-ups on the carrier only when the processor board or attached + module does not already provide them. +- Add test points for power rails and shared buses when the board has enough + space. +- Review current limits for `VIN`, `VCC_3V3`, and any switched power rails before + powering sensors, radios, displays, or motors from the connector. + +## Common mistakes + +- Reusing a processor-board pinout without checking the exact MicroMod board + revision. +- Mirroring the connector footprint by accident. Verify top-side and bottom-side + pad numbering before ordering. +- Assuming every MicroMod processor exposes every bus. Treat each bus as + processor-specific unless the SparkFun documentation says it is always present. +- Forgetting that some pins can be shared between SPI, UART, PWM, ADC, or GPIO + functions depending on the processor board. +- Routing USB, analog, and power pins with the same spacing and trace rules as + low-speed GPIO. diff --git a/docs/guides/kicad/_category_.json b/docs/guides/kicad/_category_.json new file mode 100644 index 00000000..ff64bc5b --- /dev/null +++ b/docs/guides/kicad/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "KiCad Integration", + "position": 5, + "link": { + "type": "generated-index", + "description": "Documentation for working with KiCad in tscircuit" + }, + "collapsible": true, + "collapsed": true +} diff --git a/docs/guides/kicad/exporting-kicad-library.md b/docs/guides/kicad/exporting-kicad-library.md new file mode 100644 index 00000000..2e75d0a5 --- /dev/null +++ b/docs/guides/kicad/exporting-kicad-library.md @@ -0,0 +1,144 @@ +--- +title: Exporting a KiCad Library +description: >- + Export your tscircuit designs as a KiCad library containing symbols, + footprints, and 3D models that can be reused across multiple KiCad projects. +--- + +## Overview + +tscircuit allows you to export your circuit designs as a **KiCad Library**. Unlike the KiCad Project export (which creates a complete project file), the KiCad Library export creates reusable components that can be imported into any KiCad project. + +The exported library includes: + +- **Symbol Libraries** (`symbols/` folder) - Schematic symbols for all components +- **Footprint Libraries** (`footprints/` folder) - PCB footprints for all components +- **3D Models** (`3dmodels/` folder) - 3D model files (STEP/WRL) referenced by footprints +- **Library Tables** (`fp-lib-table`, `sym-lib-table`) - Configuration files for KiCad + +## User vs Builtin Components + +tscircuit automatically separates your components into two library categories: + +### User Components + +Components that use **custom footprints or symbols** are placed in the user library, named after your project (e.g., `my-library`). These include: + +- Components with a custom `footprint` prop (JSX footprint definition): + +```tsx + + + + + + + } +/> +``` + +- Components with a custom `symbol` prop (JSX symbol definition): + +```tsx + + + + + +
+ } +/> +``` + +### Builtin Components + +Components that use **standard footprinter strings** (e.g., `0402`, `soic8`) are placed in the `tscircuit_builtin` library. This includes all footprints that tscircuit supports by default. + +## Directory Structure + +``` +my-library/ +├── symbols/ +│ ├── my-library.kicad_sym # User symbols (custom symbols) +│ └── tscircuit_builtin.kicad_sym # Builtin symbols (standard symbols) +├── footprints/ +│ ├── my-library.pretty/ # User footprints +│ │ └── MyCustomSwitch.kicad_mod +│ └── tscircuit_builtin.pretty/ # Builtin footprints +│ ├── resistor_0402.kicad_mod +│ └── chip_soic8.kicad_mod +├── 3dmodels/ +│ └── switch.step +├── fp-lib-table +└── sym-lib-table +``` + +## How to Export + +### Using the Browser + +1. Run `tsci dev` in your project directory +2. Navigate to **File > Export > KiCad Library** +3. A zip file will be downloaded containing all library files + +### Using the CLI + +```bash +tsci export ./lib/my-library.ts -f kicad-library +``` + +The CLI will: +1. Discover all component exports from the entry file +2. Build each component to circuit JSON +3. Extract and classify footprints/symbols (user vs builtin) +4. Generate the KiCad library files + +## Using the Library in KiCad + +1. **Extract/Copy the library** to your KiCad project folder or a shared libraries location + +2. **Add the library tables** to your KiCad project: + - Copy `fp-lib-table` and `sym-lib-table` to your project folder, OR + - Merge the entries into your existing library tables + +3. **Use the symbols and footprints** in your schematic and PCB: + - Custom symbols appear under your library name (e.g., `my-library`) + - Standard symbols appear under `tscircuit_builtin` + +## Including 3D Models + +Add a `cadModel` prop to include 3D models in your export: + +```tsx +import stepUrl from "./switch.step" + + + } +/> +``` + +The 3D model will be: +- Referenced in the footprint file with the correct path +- Included in the `3dmodels/` folder of the export diff --git a/docs/guides/kicad/kicad-metadata.mdx b/docs/guides/kicad/kicad-metadata.mdx new file mode 100644 index 00000000..4ebede05 --- /dev/null +++ b/docs/guides/kicad/kicad-metadata.mdx @@ -0,0 +1,394 @@ +--- +title: KiCad Metadata +sidebar_position: 1 +description: Document KiCad-specific metadata for footprints and symbols on tscircuit components +--- + +# KiCad Metadata + +tscircuit components support KiCad-specific metadata properties that preserve information from KiCad footprint and symbol files. These properties are available on all normal components (chip, resistor, capacitor, etc.) and are useful when importing from KiCad or when you need to include KiCad-specific information in your exported designs. + +## Properties Overview + +| Property | Element | Description | +|----------|---------|-------------| +| `kicadFootprintMetadata` | Components | Metadata from KiCad footprint (`.kicad_mod`) files | +| `kicadSymbolMetadata` | Components | Metadata from KiCad symbol (`.kicad_sym`) files | +| `kicadPinMetadata` | `` | Metadata for KiCad pin electrical and visual properties | + +--- + +## kicadFootprintMetadata + +The `kicadFootprintMetadata` property stores metadata extracted from KiCad footprint files. This includes information about the footprint's properties, attributes, pads, and 3D model. + +### Type Definition + +```typescript +interface KicadFootprintMetadata { + footprintName?: string + version?: number | string + generator?: string + generatorVersion?: number | string + layer?: string + properties?: KicadFootprintProperties + attributes?: KicadFootprintAttributes + pads?: KicadFootprintPad[] + embeddedFonts?: boolean + model?: KicadFootprintModel +} +``` + +### Properties + +#### Top-level Properties + +| Property | Type | Description | +|----------|------|-------------| +| `footprintName` | `string` | Name identifier for the footprint | +| `version` | `number \| string` | KiCad file format version | +| `generator` | `string` | Tool that generated the footprint | +| `generatorVersion` | `number \| string` | Version of the generator tool | +| `layer` | `string` | Default layer (e.g., `"F.Cu"`) | +| `embeddedFonts` | `boolean` | Whether fonts are embedded in the footprint | + +#### properties + +Standard KiCad footprint properties for documentation: + +```typescript +interface KicadFootprintProperties { + Reference?: KicadProperty // Component reference designator (e.g., "R1") + Value?: KicadProperty // Component value (e.g., "10k") + Datasheet?: KicadProperty // Link to component datasheet + Description?: KicadProperty // Human-readable description +} + +interface KicadProperty { + value: string + at?: { x: number | string; y: number | string; rotation?: number | string } + layer?: string + uuid?: string + hide?: boolean + effects?: { + font?: { + size?: { x: number | string; y: number | string } + thickness?: number | string + } + } +} +``` + +#### attributes + +Footprint manufacturing attributes: + +```typescript +interface KicadFootprintAttributes { + through_hole?: boolean // THT component + smd?: boolean // SMD component + exclude_from_pos_files?: boolean // Exclude from pick-and-place + exclude_from_bom?: boolean // Exclude from bill of materials +} +``` + +#### pads + +Array of pad definitions: + +```typescript +interface KicadFootprintPad { + name: string // Pad name/number + type: string // Pad type (e.g., "smd", "thru_hole") + shape?: string // Pad shape (e.g., "rect", "circle", "oval") + at?: { x: number | string; y: number | string; rotation?: number | string } + size?: { x: number | string; y: number | string } + drill?: number | string // Drill diameter for THT pads + layers?: string[] // Copper layers (e.g., ["F.Cu", "F.Paste"]) + removeUnusedLayers?: boolean + uuid?: string +} +``` + +#### model + +3D model reference and transforms: + +```typescript +interface KicadFootprintModel { + path: string // Path to 3D model file + offset?: { x: number | string; y: number | string; z: number | string } + scale?: { x: number | string; y: number | string; z: number | string } + rotate?: { x: number | string; y: number | string; z: number | string } +} +``` + +### Example Usage + +```tsx + +``` + +--- + +## kicadSymbolMetadata + +The `kicadSymbolMetadata` property stores metadata extracted from KiCad symbol files. This includes schematic-specific information like pin configuration, BOM settings, and symbol properties. + +### Type Definition + +```typescript +interface KicadSymbolMetadata { + symbolName?: string + extends?: string + pinNumbers?: KicadSymbolPinNumbers + pinNames?: KicadSymbolPinNames + excludeFromSim?: boolean + inBom?: boolean + onBoard?: boolean + properties?: KicadSymbolProperties + embeddedFonts?: boolean +} +``` + +### Properties + +#### Top-level Properties + +| Property | Type | Description | +|----------|------|-------------| +| `symbolName` | `string` | Symbol identifier name | +| `extends` | `string` | Parent symbol for inheritance | +| `excludeFromSim` | `boolean` | Exclude from SPICE simulation | +| `inBom` | `boolean` | Include in bill of materials | +| `onBoard` | `boolean` | Component appears on PCB | +| `embeddedFonts` | `boolean` | Whether fonts are embedded | + +#### pinNumbers + +Pin number display configuration: + +```typescript +interface KicadSymbolPinNumbers { + hide?: boolean // Hide pin numbers in schematic +} +``` + +#### pinNames + +Pin name display configuration: + +```typescript +interface KicadSymbolPinNames { + offset?: number | string // Distance from pin to name text + hide?: boolean // Hide pin names in schematic +} +``` + +#### properties + +Standard KiCad symbol properties: + +```typescript +interface KicadSymbolProperties { + Reference?: KicadSymbolProperty // Reference designator prefix (e.g., "U") + Value?: KicadSymbolProperty // Component value/name + Footprint?: KicadSymbolProperty // Associated footprint + Datasheet?: KicadSymbolProperty // Datasheet URL + Description?: KicadSymbolProperty // Human-readable description + ki_keywords?: KicadSymbolProperty // Search keywords + ki_fp_filters?: KicadSymbolProperty // Footprint filter patterns +} + +interface KicadSymbolProperty { + value: string + id?: number | string + at?: { x: number | string; y: number | string; rotation?: number | string } + effects?: { + font?: { + size?: { x: number | string; y: number | string } + thickness?: number | string + } + justify?: string | string[] + hide?: boolean + } +} +``` + +### Example Usage + +```tsx + +``` + +--- + +## kicadPinMetadata + +The `kicadPinMetadata` property is used on `` elements to store KiCad-specific pin information. This includes the pin's electrical type, graphic style, and text sizing properties that are used when exporting to KiCad symbol files. + +### Type Definition + +```typescript +interface KicadPinMetadata { + electricalType?: KicadPinElectricalType + graphicStyle?: KicadPinGraphicStyle + pinLength?: Distance + nameTextSize?: Distance + numberTextSize?: Distance +} +``` + +### Properties + +| Property | Type | Description | +|----------|------|-------------| +| `electricalType` | `KicadPinElectricalType` | Electrical characteristics of the pin | +| `graphicStyle` | `KicadPinGraphicStyle` | Visual representation style of the pin | +| `pinLength` | `Distance` | Physical length of the pin | +| `nameTextSize` | `Distance` | Text size for the pin name label | +| `numberTextSize` | `Distance` | Text size for the pin number label | + +#### electricalType + +Specifies the electrical characteristics of the pin: + +| Value | Description | +|-------|-------------| +| `"input"` | Input pin | +| `"output"` | Output pin | +| `"bidirectional"` | Bidirectional pin | +| `"tri_state"` | Tri-state pin | +| `"passive"` | Passive pin (resistors, capacitors, etc.) | +| `"free"` | Free pin (can connect to anything) | +| `"unspecified"` | Unspecified electrical type | +| `"power_in"` | Power input pin (VCC, GND) | +| `"power_out"` | Power output pin | +| `"open_collector"` | Open collector output | +| `"open_emitter"` | Open emitter output | +| `"no_connect"` | No connection pin | + +#### graphicStyle + +Defines the visual representation of the pin in schematics: + +| Value | Description | +|-------|-------------| +| `"line"` | Simple line (default) | +| `"inverted"` | Inverted (bubble) | +| `"clock"` | Clock input indicator | +| `"inverted_clock"` | Inverted clock | +| `"input_low"` | Active low input | +| `"clock_low"` | Active low clock | +| `"output_low"` | Active low output | +| `"falling_edge_clock"` | Falling edge triggered clock | +| `"nonlogic"` | Non-logic pin | + +### Example Usage + +```tsx + + + + + +``` + +--- + +## When to Use KiCad Metadata + +### Importing from KiCad + +When you [import components from KiCad](/guides/importing-modules-and-chips/importing-from-kicad), the converter tools automatically populate these metadata properties. This preserves the original KiCad information for reference and export compatibility. + +### Exporting to KiCad + +When exporting your tscircuit design to KiCad format, these metadata properties are used to generate accurate `.kicad_mod` and `.kicad_sym` files that maintain compatibility with KiCad workflows. + +## Related Documentation + +- [Importing from KiCad](/guides/importing-modules-and-chips/importing-from-kicad) - How to import KiCad components +- [KiCad Footprints](/footprints/kicad-footprints) - Using KiCad footprints with the `kicad:` prefix +- [Installing KiCad Libraries](/guides/importing-modules-and-chips/installing-kicad-libraries-from-github) - Adding KiCad libraries to your project diff --git a/docs/guides/kicad/using-tscircuit-kicad-pcm-urls.md b/docs/guides/kicad/using-tscircuit-kicad-pcm-urls.md new file mode 100644 index 00000000..76a698fc --- /dev/null +++ b/docs/guides/kicad/using-tscircuit-kicad-pcm-urls.md @@ -0,0 +1,67 @@ +--- +title: Using tscircuit KiCad PCM URLs +description: >- + Install tscircuit component libraries directly into KiCad using the Plugin and + Content Manager (PCM) with cloud-hosted repository URLs. +--- + +## Overview + +tscircuit packages can be installed directly into KiCad using the **Plugin and Content Manager (PCM)**. Each published tscircuit package includes a KiCad PCM URL that points to a repository hosted on `tscircuit.app` containing the symbols, footprints, and 3D models for all components in the package. + +This guide walks you through the process of adding a tscircuit package to KiCad using the PCM URL. + +## Step 1: Find the KiCad PCM URL + +Navigate to your tscircuit package page on [tscircuit.com](https://tscircuit.com). In the **Releases** section on the right sidebar, you'll find a **KiCad PCM URL** link. If you don't see this link, enable `kicadPcm` in your tscircuit config (see [tscircuit config](https://docs.tscircuit.com/guides/tscircuit-essentials/tscircuit-config)). + +![Find the KiCad PCM URL link on the tscircuit package page](/img/guides/using-pcm-url/01-find-pcm-url-on-package-page.png) + +## Step 2: Copy the Repository URL + +Click the **KiCad PCM URL** link to open the repository JSON file in your browser. Copy the full URL from the address bar. + +![Copy the repository URL from the browser address bar](/img/guides/using-pcm-url/02-copy-repository-url.png) + +## Step 3: Add the Repository in KiCad PCM + +1. Open KiCad and go to **Tools > Plugin and Content Manager** +2. Click the **Manage...** button in the top-right corner +3. In the "Manage Repositories" dialog, click the **+** button to add a new repository +4. Paste the repository URL you copied and click **OK** +5. Click **Save** to save the repository configuration + +![Add the repository URL in KiCad's Plugin and Content Manager](/img/guides/using-pcm-url/03-add-repository-in-kicad-pcm.png) + +## Step 4: Select the Repository + +After saving, use the repository dropdown at the top-left of the PCM window to select your newly added tscircuit repository. + +![Select the tscircuit repository from the dropdown](/img/guides/using-pcm-url/04-select-repository-from-dropdown.png) + +## Step 5: Install the Library + +1. Navigate to the **Libraries** tab +2. Select the tscircuit library package from the list +3. Click the **Install** button +4. Click **Apply Pending Changes** at the bottom of the window to begin the installation + +![Install the library from the Libraries tab](/img/guides/using-pcm-url/05-install-library-from-libraries-tab.png) + +The download progress will be displayed: + +![Download progress showing successful installation](/img/guides/using-pcm-url/06-download-complete.png) + +## Step 6: Verify Installation + +Once the installation is complete, switch to the **Installed** tab to verify that the library appears in your installed packages list. + +![Library appears in the Installed tab](/img/guides/using-pcm-url/07-library-installed-successfully.png) + +## Step 7: Use the Library in Your Project + +The library is now ready to use in your KiCad projects. Open the **Schematic Editor** and use **Add Symbol** (shortcut: `A`) to browse and place components from the installed library. + +The components will appear under a library name prefixed with `PCM_` (e.g., `PCM_jlc100`). + +![Using the tscircuit library components in KiCad's Schematic Editor](/img/guides/using-pcm-url/08-use-library-in-schematic.png) diff --git a/docs/guides/platform-configuration.md b/docs/guides/platform-configuration.md deleted file mode 100644 index 880ae935..00000000 --- a/docs/guides/platform-configuration.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Platform Configuration ---- - -By default, `@tscircuit/core` uses the default platform diff --git a/docs/guides/publishing-modules.md b/docs/guides/publishing-modules.md deleted file mode 100644 index 2ade2614..00000000 --- a/docs/guides/publishing-modules.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Publishing Modules -sidebar_position: 6 ---- diff --git a/docs/guides/running-tscircuit/_category_.json b/docs/guides/running-tscircuit/_category_.json new file mode 100644 index 00000000..c4aac750 --- /dev/null +++ b/docs/guides/running-tscircuit/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Running tscircuit", + "position": 3, + "link": { + "type": "generated-index", + "description": "Learn different ways to run and use tscircuit in your projects." + }, + "collapsible": true, + "collapsed": true +} diff --git a/docs/guides/running-tscircuit/building-static-sites-with-tsci.mdx b/docs/guides/running-tscircuit/building-static-sites-with-tsci.mdx new file mode 100644 index 00000000..e358941c --- /dev/null +++ b/docs/guides/running-tscircuit/building-static-sites-with-tsci.mdx @@ -0,0 +1,67 @@ +--- +title: Building a Static Site +description: "`tsci build --site` packages your tscircuit project into a static website that anyone can browse without running a server." +--- + +`tsci build --site` packages your tscircuit project into a static website that anyone can browse without running a server. The command evaluates your circuits, exports the generated assets into a `dist` folder, and wires them up to the tscircuit RunFrame viewer so visitors can flip between PCB, schematic, and 3D previews right in the browser. + +The [Common tscircuit gallery](https://common.tscircuit.com/) is an example of a site generated with this workflow. + +## Prerequisites + +Before building a site, make sure you have: + +- A tscircuit project with one or more `*.circuit.tsx` files or another supported entrypoint. +- The tscircuit CLI installed (`npm install -g tsci`, `bunx tsci`, or `npx tsci`). +- Any dependencies that your circuits import (registry components, local packages, etc.). + +## Building the site + +Run the build command from the root of your project: + +```bash +# generates dist/index.html and other assets +npx tsci build --site +``` + +The CLI resolves your entrypoint, evaluates every circuit, and then writes a static site to `dist/site/` alongside the usual `dist/circuit.json` outputs. The generated folder contains: + +- `index.html` – a ready-to-host viewer. +- `lib/…/circuit.json` – one JSON file per design so the viewer can lazy load each project. +- Supporting JavaScript, CSS, and WebAssembly bundles for the RunFrame UI. + +You can inspect the result locally with any static file server, for example: + +```bash +npx serve dist +``` + +Opening `http://localhost:3000` (or the port reported by your static server) shows the same interactive viewer experience used at common.tscircuit.com. + +## Customizing the catalog + +The site automatically lists every circuit that `tsci build` evaluates. If you already use a `tscircuit.config.json` file, the same settings shape the static catalog: `mainEntrypoint` lets you pick a custom starting file, and the existing include/exclude patterns limit which `*.circuit.tsx` sources are exported. + +When you add extra documentation or screenshots, keep them in a public asset folder (for example `public/`), then point to them from your circuits. Static assets referenced at build time are copied into `dist` so they ship with the site bundle. + +## Deploying to Vercel + +Vercel can host the generated site without any special adapters: + +1. Push your project to GitHub or GitLab. +2. Create a new Vercel project that points to the repository. +3. Set the **Build Command** to `npx tsci build --site` (or `bunx tsci build --site` if you prefer Bun). +4. Set the **Output Directory** to `dist`. +5. Trigger a deploy – Vercel runs the build, uploads the static folder, and serves it on your chosen domain. + +For preview deployments, Vercel repeats these steps on every pull request so reviewers can browse the circuits before merging. + +## Deploying elsewhere + +Because the output is plain HTML/JS/CSS, you can host it almost anywhere: + +- **GitHub Pages** – run `npx tsci build --site` in CI and publish the `dist` folder to `gh-pages`. +- **Netlify** – configure the build command and output directory just like Vercel. +- **S3/CloudFront or static buckets** – upload the generated files with `aws s3 sync dist s3://your-bucket`. + +Once deployed, the site stays fast and inexpensive to serve because no server-side rendering or API proxy is required—the viewer fetches the prebuilt `circuit.json` files directly from storage. diff --git a/docs/guides/running-tscircuit/connecting-to-github.mdx b/docs/guides/running-tscircuit/connecting-to-github.mdx new file mode 100644 index 00000000..3344ba30 --- /dev/null +++ b/docs/guides/running-tscircuit/connecting-to-github.mdx @@ -0,0 +1,20 @@ +--- +title: Connect GitHub Repositories to tscircuit +description: Link your project repo to tscircuit for automatic previews and publishing +--- + +You can connect your GitHub repositories to tscircuit to automatically +publish updates, access instant previews and make sharing boards easier. + +You'll want to use the [command line tool](../../intro/quickstart-cli.md) to initialize +an application and push to tscircuit.com using [`tsci push`](../../command-line/tsci-push.md) + +After that, navigate to the tscircuit.com page for your circuit and click "Connect to GitHub" +button on the right side of the page. + +![Connect to GitHub Button](/img/guides/connect-to-github/connect-to-github.png) + +After connecting to GitHub, every time you merge a small GitHub action will +run to update the circuit on tscircuit.com. You + +![Github Commit Status](/img/guides/connect-to-github/github-commit-status-success.png) diff --git a/docs/guides/displaying-circuit-json-on-a-webpage.mdx b/docs/guides/running-tscircuit/displaying-circuit-json-on-a-webpage.mdx similarity index 93% rename from docs/guides/displaying-circuit-json-on-a-webpage.mdx rename to docs/guides/running-tscircuit/displaying-circuit-json-on-a-webpage.mdx index f8ff31a2..f4c56837 100644 --- a/docs/guides/displaying-circuit-json-on-a-webpage.mdx +++ b/docs/guides/running-tscircuit/displaying-circuit-json-on-a-webpage.mdx @@ -1,5 +1,6 @@ --- title: Displaying Circuit JSON on a Webpage +description: Render Circuit JSON in web apps using RunFrame and related components --- [Circuit JSON](https://github.com/tscircuit/circuit-json) is a universal @@ -15,7 +16,7 @@ for a quick preview! ::: -![Circuit JSON Pipeline](../../static/img/circuit-json-explain.png) +![Circuit JSON Pipeline](/img/circuit-json-explain.png) ## React: Display all available previews with `` @@ -40,7 +41,7 @@ export default () => ( You should see something like this: -![RunFrame Preview](../../static/img/runframe-example.png) +![RunFrame Preview](/img/runframe-example.png) For more examples and usage, check out the [runframe repo](https://github.com/tscircuit/runframe) and the [examples directory](https://github.com/tscircuit/runframe/tree/main/examples)! diff --git a/docs/guides/running-tscircuit/platform-configuration.md b/docs/guides/running-tscircuit/platform-configuration.md new file mode 100644 index 00000000..f6393a55 --- /dev/null +++ b/docs/guides/running-tscircuit/platform-configuration.md @@ -0,0 +1,149 @@ +--- +title: Platform Configuration +description: >- + The Platform Configuration allows you to change tscircuit behavior to best + suit the platform the tscircuit code is running on. +--- + +import CircuitPreview from "@site/src/components/CircuitPreview" + +## Overview + +The Platform Configuration allows you to change tscircuit behavior to best suit +the platform the tscircuit code is running on. + +Some use cases: + +- Organizations may want to customize the cloud autorouter to avoid sending sensitive designs outside your company +- Organizations may want to introduce custom footprint strings + using a prefix like `footprint="my-company:*"` +- Organizations may want to use their own internal registry for importing circuits instead of [tscircuit.com](https://tscircuit.com) +- For [autorouting.com](https://autorouting.com), we configure the platform to not perform any autorouting + +## Customizing the Platform + +All of the following features of the platform can be configured: + +- **partsEngine** - The engine used to automatically find parts matching component specifications +- **registryApiUrl** - The registry to use, defaults to `https://api.tscircuit.com`. See [Registry API](../../web-apis/the-registry-api.md) for more details +- **cloudAutorouterUrl** - The cloud autorouter to use, defaults to a tscircuit cloud service that uses freerouting +- Disable specific circuit outputs to optimize build times, such as disabling autorouting +- **footprintLibraryMap** - Configure custom prefixes for loading footprint strings from a server. This is how built-in strings like `kicad:*` and `jlcpcb:*` are loaded. +- **printBoardInformationToSilkscreen** - Print the board information to the silkscreen. This includes standard board and platform information like the board name, version etc. + +> See the full specification for the [tscircuit platform configuration](https://github.com/tscircuit/props/blob/main/lib/platformConfig.ts) + +### The Default Platform + +The tscircuit default platform configuration sources parts from multiple vendors +and uses the tscircuit backend for autorouting and `@tsci/*` imports. + +Current vendors used for automatic part sourcing: + +- [JLCPCB](https://jlcpcb.com) +- Digikey (coming soon!) +- Mouser (coming soon!) + +For each vendor, tscircuit populates multiple available chips. This means even +if tscircuit finds parts for a vendor, you don't have to use that vendor! + +## Using your Platform + +:::info +Want more platform features? Tell us about your use case in [this GitHub Discussion!](https://github.com/orgs/tscircuit/discussions/514) +::: + +### Configure a project with `tscircuit.config.ts` + +For CLI projects, define a `platformConfig` export in `tscircuit.config.ts` at +the root of your project. This lets every board in the project use the same +parts engine, autorouter, registry, or footprint libraries without passing a +platform object into each circuit manually. + +For example, the TI parts engine can define components from Texas Instruments +part data. First install it as a development dependency: + +```sh +bun add -D github:tscircuit/ti-parts-engine +``` + +Then configure it in your project: + +```ts title="tscircuit.config.ts" +import { createTiPlatformConfig } from "@tscircuit/ti-parts-engine" + +export default { + platformConfig: createTiPlatformConfig(), +} +``` + +You can now use TI components inside tscircuit with automatically loaded SPICE +and footprints: + + ( + + + + )`, + }} +/> + +### Provide a platform programmatically + +When you initialize a `RootCircuit`, you can provide the platform configuration +as the `{ platform }` parameter: + +```tsx +import { RootCircuit } from "@tscircuit/core" + +const circuit = new RootCircuit({ + platform: { + registryApiUrl: "https://my-tscircuit-registry.mycompany.com", + }, +}) +``` + +This can also be provided to modules like `@tscircuit/eval` to evaluate tscircuit +code: + +```tsx +import { CircuitRunner } from "@tscircuit/eval-webworker" +import myPartsEngine from "./my-parts-engine" + +const circuitRunner = new CircuitRunner({ + platform: { + partsEngine: myPartsEngine, + }, +}) + +await circuitRunner.execute(` +circuit.add( + + + +)`) + +await circuitRunner.renderUntilSettled() + +const circuitJson = await circuitRunner.getCircuitJson() +``` + +:::info +Interested in running the entire tscircuit platform privately inside your company? +We're happy to help! Reach out to **enterprise@tscircuit.com** +::: diff --git a/docs/guides/programmatically-building-circuits.md b/docs/guides/running-tscircuit/programmatically-building-circuits.md similarity index 79% rename from docs/guides/programmatically-building-circuits.md rename to docs/guides/running-tscircuit/programmatically-building-circuits.md index a3faec64..5691d5b8 100644 --- a/docs/guides/programmatically-building-circuits.md +++ b/docs/guides/running-tscircuit/programmatically-building-circuits.md @@ -1,21 +1,22 @@ --- title: Programmatically Building Circuits +description: Use tscircuit libraries and APIs to generate circuits from scripts or services --- This guide is about using tscircuit inside of scripts, APIs or inside the browser. Maybe you want to create a website that allows your users drag'n'drop to create custom electronics and turn their designs into real circuits automatically. -For most users, there is no need to programmatically build circuits, you can use the [command line](../command-line/tsci-dev.md) or the [online editor](../intro/quickstart-web.md) to build and export your circuits into any supported format. +For most users, there is no need to programmatically build circuits, you can use the [command line](../../command-line/tsci-dev.md) or the [online editor](../../intro/quickstart-web.md) to build and export your circuits into any supported format. -If you're not using Typescript or prefer a "zero-installation" setup, you can fully build your circuits with complex parameters using the [Registry API](../web-apis/the-registry-api.md) +If you're not using Typescript or prefer a "zero-installation" setup, you can fully build your circuits with complex parameters using the [Registry API](../../web-apis/the-registry-api.md) -## Using `@tscircuit/core` directly +## Using `RootCircuit` Directly -`@tscircuit/core` is the core library for tscircuit, it converts React code into [Circuit JSON](https://github.com/tscircuit/circuit-json), a universally intermediary format that represents an electronic device. +`RootCircuit` from `tscircuit` converts React code into [Circuit JSON](https://github.com/tscircuit/circuit-json), a universal intermediary format that represents an electronic device. -Here's an example of how to use `@tscircuit/core` directly to build a circuit into Circuit JSON: +Here's an example of how to use `RootCircuit` directly to build a circuit into Circuit JSON: ```tsx -import { RootCircuit } from "@tscircuit/core" +import { RootCircuit } from "tscircuit" const circuit = new RootCircuit() @@ -96,7 +97,7 @@ other formats: - [Gerber files](https://github.com/tscircuit/circuit-json-to-gerber) - [Specctra DSN Autorouting files](https://github.com/tscircuit/dsn-converter) -- [Pick'n'Place Files](https://github.com/tscircuit/circuit-json-to-pnp) +- [Pick'n'Place Files](https://github.com/tscircuit/circuit-json-to-pnp-csv) - [PCB and Schematic SVGs](https://github.com/tscircuit/circuit-to-svg) -- [Bill of Materials](https://github.com/tscircuit/circuit-json-to-bom) +- [Bill of Materials](https://github.com/tscircuit/circuit-json-to-bom-csv) - [SPICE netlists and simulations](https://github.com/tscircuit/circuit-json-to-spice) diff --git a/docs/guides/running-tscircuit/running-tscircuit-inside-an-iframe.mdx b/docs/guides/running-tscircuit/running-tscircuit-inside-an-iframe.mdx new file mode 100644 index 00000000..f36fe8f0 --- /dev/null +++ b/docs/guides/running-tscircuit/running-tscircuit-inside-an-iframe.mdx @@ -0,0 +1,94 @@ +--- +title: Running tscircuit inside an iframe +description: >- + tscircuit can be evaluated inside an iframe. This makes it easy to embed + snippets on a webpage without complex build systems. +--- + +## Overview + +tscircuit can be evaluated inside an iframe. This makes it easy to embed +snippets on a webpage without complex build systems. + +Here's an example of an iframe running a tscircuit snippet: + +import { TscircuitIframe } from "../../../src/components/TscircuitIframe" + + + + + )`, + }} + entrypoint="main.tsx" +/> + +## Running tscircuit inside an iframe + +To run tscircuit inside an iframe, perform the following steps: + +1. Add an iframe that points to `"https://runframe.tscircuit.com/iframe.html"` +2. Listen for the `runframe_ready_to_receive` message from the iframe +3. Send the code you want to run to the iframe via `postMessage` + +Here's a fully working example: + +```html + + + + RunFrame Host + + + + + + + +``` + +## React iframe wrapper for tscircuit + +An iframe wrapper is available to simplify the process of running tscircuit +inside an iframe. To use it, add the `@tscircuit/runframe` package to your +project and use the [`RunFrameWithIframe` component](https://github.com/tscircuit/runframe/blob/main/lib/components/RunFrameWithIframe/RunFrameWithIframe.tsx) like so: + +```tsx +import { RunFrameWithIframe } from "@tscircuit/runframe/iframe" + +export default () => ( + )`, + }} + entrypoint="main.tsx" + /> +) +``` diff --git a/docs/guides/running-tscircuit/running-tscircuit-standalone.mdx b/docs/guides/running-tscircuit/running-tscircuit-standalone.mdx new file mode 100644 index 00000000..e78a8741 --- /dev/null +++ b/docs/guides/running-tscircuit/running-tscircuit-standalone.mdx @@ -0,0 +1,28 @@ +--- +title: Running tscircuit with a script tag +description: Load `tscircuit`'s browser build from a CDN and render a circuit written inside a ` + + + + + +Here's a quick primer on how to use tscircuit: + +## Core `` props (most-used) + +* `name`: reference designator (e.g., `"U1"`). +* `footprint`: **string** (e.g., `"soic8"`/`"0402"`) **or** a `` element. +* `pinLabels`: map pad → pin label (e.g., `{ pin1: "VCC", pin5: "GND" }`). +* `schPinArrangement`: control schematic sides/order of pins (alias **`schPortArrangement`** is deprecated). + Optional styling/box props: `schPinStyle`, `schPinSpacing`, `schWidth`, `schHeight`. ([GitHub][3]) +* Connectivity helpers: + `internallyConnectedPins`, `externallyConnectedPins`, and **`connections`** (auto‑traces by pin label) +* Extras: `pcbPinLabels`, `cadModel`, `noSchematicRepresentation` + +--- + +## Minimal chip + + + +## Arrange pins on schematic (+ style/size) + + + +## Custom PCB footprint (inline) + + + + + + } +/> + +## Internally / externally shorted pins + + + + + +## Auto‑connect with `connections` + +A more condensed alternative to ``, available on basically all elements + + + +Use with `sel` for type‑safe selectors (e.g., `OUT: sel.U2(MyReg).VOUT`). ([GitHub][3], [docs.tscircuit.com][4]) + +## Part selection & PCB labels + + + +## All normal elements and important props + +Most elements have a `name` and `footprint` prop. Most properties +are optional. + +- `` - root element +- `` - group of elements +- `` - any generic chip +- `` - `resistance` +- `` - `capacitance` +- `` - `inductance` +- `` - `color` +- `` - `variant` (standard/schottky/zener/avalanche/photo/tvs) +- `` - `from`, `to` +- `` - `type` (npn/pnp/nmos/pmos) +- `` - `channelType` (n/p), `mosfetMode` (enhancement/depletion) +- `` - `diameter`, `radius`, `shape` (circle/pill/rect), `solderMaskMargin`, `coveredWithSolderMask` +- `` - `padShape` (circle/rect), `padDiameter`, `footprintVariant` (smd/through_hole), `width`, `height` +- `` - `holeDiameter`, `outerDiameter` +- `` - `spdt` (bool), `dpdt` (bool), `spst` (bool), `spdt` (bool), `isNormallyClosed` +- `` - `pinCount`, `schFacingDirection` (left, up, right, down), `schPinArrangement`, `gender` (male/female/unpopulated), `showSilkscreenPinLabels`, `holeDiameter`, `connections`, `pinLabels`, `rightAngle`, `doubleRow` +- `` - similar to pinheader but pin count must be 2 or 3 +- `` +- `` +- `` - `shape` (rect), `width`, `height` +- `` - `frequency`, `loadCapacitance`, `loadResistance` +- `` - `capacity`, `voltage` +- `` - `maxResistance`, `pinVariant` (two_pin/three_pin). Common footprint "pinrow2"/"pinrow3" + +### Footprint Only Elements + +- `` - `portHints`, `pcbX`, `pcbY`, `shape`, `width`, `height` +- `` - `pcbX`, `pcbY`, `shape`, `width`, `height` + +## Common Footprints + +- "0402", "0603", "0805", "1206", "1210" +- "dip", "dip8", "dip16", "axial", "soic8", "bga64", "tssop8", "stampboard", "stampreceiver", "hc49", "to92", "to220", "ssop", "qfp16", "qfn16", "sot23", "sot23_5", "sot223", "pinrow2", "pinrow6" +- You can generally alter footprints by changing numbers or adding parameters e.g. "soic8_w4mm" creates a 4mm width soic, "pinrow8_p1mm" creates an 8 pin pinrow with 1mm pitch +- For batteries, just use "pinrow2" + +## Selector Syntax + +When specifying a selector, use "{component_name}.{pin_name}" or "net.{net_name}" + +These are common selectors: +- "U1.VCC","R1.pin1","C1.pin2","C1.pos","U2.GND", "J1.SOME_PIN_LABEL" +- Special case Net Selectors: "net.VCC","net.GND","net.GPIO1", "net.BAT_PLUS", "net.BAT_MINUS" + +Selectors are used in the `connections` prop and the `from` and `to` props of the `` element. + +- `` +- `` + + +## Important Notes + +- Make sure you've connected both sides of every passives (resistor, capacitor, inductor) + with a or a connections={{ pin1: ..., pin2: ... }} prop +- Every normal element has a footprint prop + +``` + +## Example Prompt: + +``` +can you create a 555 timer circuit in tscircuit with a square wave output? +``` diff --git a/docs/intro/quickstart-cli.md b/docs/intro/quickstart-cli.md index 2bb72185..ca059859 100644 --- a/docs/intro/quickstart-cli.md +++ b/docs/intro/quickstart-cli.md @@ -1,8 +1,22 @@ --- title: Quickstart CLI sidebar_position: 4 +description: >- + The command line is the best way to use tscircuit. Using the CLI, you can just + run `tsci dev` in a project and see previews of your circuit just like any + other local development tool! --- +import YouTubeEmbed from '../../src/components/YouTubeEmbed'; + +## Overview + +The command line is the best way to use tscircuit. Using the CLI, you can just +run `tsci dev` in a project and see previews of your circuit just like any +other local development tool! + + + ## Install the tscircuit CLI You can install the tscircuit CLI by running `npm install -g tscircuit`. @@ -19,18 +33,27 @@ Next, start the development server by running `tsci dev`. This will start a loca ![tsci dev result](../../static/img/tsci-dev.png) -Go to https://localhost:3020. You'll can now see PCB, Schematic and 3D views of your circuit, which update in real-time as you make changes to your code. +Go to http://localhost:3020. You can now see PCB, Schematic and 3D views of your circuit, which update in real-time as you make changes to your code. ![browser](../../static/img/pcb-runframe.png) +### Using the CLI Offline + +To use the CLI offline, you need to disable the "Force Latest @tscircuit/eval" option in the file menu. Click on "File" in the top menu, then uncheck the "Force Latest @tscircuit/eval" option: + +![Force eval option in file menu](../../static/img/force-eval.png) + ## Pushing to the tscircuit Registry +Next, you push your project by running `tsci push`. This will push your project to your registry. +![tsci push result](../../static/img/tsci-push.png) -This section is coming soon! +Go to your tscircuit account. You can now see PCB, Schematic and 3D views of your circuit in you registry. +![browser](../../static/img/registry-snippet.png) ## Exporting to SVGs, PDF, or Fabrication Files -This section is coming soon! +This section is coming soon! \ No newline at end of file diff --git a/docs/intro/quickstart-web.md b/docs/intro/quickstart-web.md index 84380394..6a07a8db 100644 --- a/docs/intro/quickstart-web.md +++ b/docs/intro/quickstart-web.md @@ -1,5 +1,6 @@ --- title: Quickstart Web +description: Build and preview tscircuit projects directly in the online editor sidebar_position: 3 --- @@ -26,7 +27,7 @@ The editor will open with a template board that looks like this: You can now edit the board by adding or removing elements! Check out the -[essential elements guide](../guides/essential-elements.mdx) to learn more about +[essential elements guide](../guides/tscircuit-essentials/essential-elements.mdx) to learn more about the available elements. If you've already got an idea of what you want to build, try breaking down the problem into modules using our [designing electronics from scratch guide](../building-electronics/designing-electronics-from-scratch.md) @@ -39,7 +40,7 @@ download [fabrication files.](../guides/understanding-fabrication-files.md) -When you're ready to order your board, check out the [ordering prototypes guide](../building-electronics/ordering-prototypes.md). You can +When you're ready to order your board, check out the [ordering prototypes guide](../building-electronics/ordering-prototypes.mdx). You can electronics fully assembled and ready to use from the many services that accept our standard fabrication files. diff --git a/docs/intro/what-is-tscircuit.mdx b/docs/intro/what-is-tscircuit.mdx index 71daa1a2..e1e07370 100644 --- a/docs/intro/what-is-tscircuit.mdx +++ b/docs/intro/what-is-tscircuit.mdx @@ -1,9 +1,12 @@ --- title: What is tscircuit? slug: / +description: Learn what tscircuit is and how the React-powered toolchain works sidebar_position: 1 --- +import YouTubeEmbed from '../../src/components/YouTubeEmbed'; + tscircuit is an open-source React/Typescript electronics toolchain and ecosystem for creating, previewing, simulating and manufacturing Printed Circuit Boards (PCBs). @@ -11,35 +14,55 @@ for creating, previewing, simulating and manufacturing Printed Circuit Boards React and Typescript are standard tools that revolutionized the web development ecosystem. tscircuit combines the powerful static analysis of Typescript with the modular component system of React to make developing electronics faster, -easier and more automated. +easier and more automated. To generate tscircuit with AI chat, check out our +[guide to using tscircuit with AI](../advanced/ai-context.mdx) + + Here's an example of a basic tscircuit electronic device, it's the USB -flashlight that we make in [this tutorial](../tutorials/building-a-simple-usb-flashlight.md). +flashlight that we make in [this tutorial](../tutorials/building-a-simple-usb-flashlight.mdx). import CircuitPreview from "@site/src/components/CircuitPreview" - { - const USBCPort = useUsbC("USBC") - const Button = usePushButton("SW1") return ( - + + .pos", pin2: "net.VBUS" }} + supplierPartNumbers={{ + jlcpcb: ["C110153"], + }} /> - -