diff --git a/.github/workflows/azure-deploy-docs.yml b/.github/workflows/azure-deploy-docs.yml new file mode 100644 index 0000000..6b2f381 --- /dev/null +++ b/.github/workflows/azure-deploy-docs.yml @@ -0,0 +1,64 @@ +name: Azure Static Web Apps CI/CD - Docs + +on: + push: + branches: + - main + pull_request: + types: [ opened, synchronize, reopened, closed ] + branches: + - main + +jobs: + build_and_deploy_job: + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') + runs-on: ubuntu-latest + name: Build and Deploy Job Docs + permissions: + contents: read + env: + NODE_VERSION: "20" + steps: + - uses: actions/checkout@v3 + with: + submodules: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Install playwright browsers + run: npx playwright install --with-deps + + - name: Build docs + run: NODE_ENV=production npm run build + env: + CLARITY_PROJECT_ID: ${{ secrets.CLARITY_PROJECT_ID }} + + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ASHY_FLOWER_DOCS }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "dist" + api_location: "" + skip_app_build: true + + close_pull_request_job: + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + name: Close Pull Request Job + steps: + - name: Close Pull Request + id: closepullrequest + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ASHY_FLOWER_DOCS }} + action: "close" diff --git a/.github/workflows/version-monitor.yml b/.github/workflows/version-monitor.yml new file mode 100644 index 0000000..46228a5 --- /dev/null +++ b/.github/workflows/version-monitor.yml @@ -0,0 +1,232 @@ +name: Version Monitor + +# Trigger the workflow every 30 minutes and allow manual triggering +on: + push: + branches: + - main + schedule: + - cron: "*/30 * * * *" # Run every 30 minutes + workflow_dispatch: # Allow manual trigger from GitHub Actions UI + +# Set permissions for creating branches, commits, and pull requests +permissions: + contents: write + pull-requests: write + +jobs: + monitor: + name: Monitor Version Changes + runs-on: ubuntu-latest + outputs: + update_needed: ${{ steps.monitor.outputs.update_needed }} + new_version: ${{ steps.monitor.outputs.new_version }} + pr_created: ${{ steps.pr.outputs.pr_created }} + pr_url: ${{ steps.pr.outputs.pr_url }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Display configuration + run: | + echo "Version Monitor Configuration" + echo "==========================" + echo "Source URL: ${{ vars.VERSION_SOURCE_URL || 'https://desktop.dl.hagicode.com/index.json' }}" + echo "Request Timeout: 30000ms" + echo "Max Retries: 3" + echo "Repository: ${{ github.repository }}" + + - name: Run version monitor + id: monitor + run: node scripts/version-monitor.js + env: + VERSION_SOURCE_URL: ${{ vars.VERSION_SOURCE_URL || 'https://desktop.dl.hagicode.com/index.json' }} + REQUEST_TIMEOUT: "30000" + MAX_RETRIES: "3" + + - name: Configure Git + if: steps.monitor.outputs.update_needed == 'true' + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + - name: Check existing branch + id: check_branch + if: steps.monitor.outputs.update_needed == 'true' + run: | + BRANCH_NAME="version-update-${{ steps.monitor.outputs.new_version }}" + echo "Checking for existing branch: $BRANCH_NAME" + if git ls-remote --heads origin "$BRANCH_NAME" | grep -q "$BRANCH_NAME"; then + echo "branch_exists=true" >> $GITHUB_OUTPUT + echo "Branch $BRANCH_NAME already exists on remote" + else + echo "branch_exists=false" >> $GITHUB_OUTPUT + echo "Branch $BRANCH_NAME does not exist on remote" + fi + + - name: Create feature branch + if: steps.monitor.outputs.update_needed == 'true' && steps.check_branch.outputs.branch_exists != 'true' + run: | + BRANCH_NAME="version-update-${{ steps.monitor.outputs.new_version }}" + git checkout -b "$BRANCH_NAME" + echo "Created branch: $BRANCH_NAME" + + - name: Commit version changes + if: steps.monitor.outputs.update_needed == 'true' && steps.check_branch.outputs.branch_exists != 'true' + run: | + git add public/version-index.json + git commit -m "chore: update version to ${{ steps.monitor.outputs.new_version }}" + + - name: Push branch + if: steps.monitor.outputs.update_needed == 'true' && steps.check_branch.outputs.branch_exists != 'true' + run: | + BRANCH_NAME="version-update-${{ steps.monitor.outputs.new_version }}" + git push origin "$BRANCH_NAME" + + - name: Check existing PR + id: check_pr + if: steps.monitor.outputs.update_needed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CURRENT_VERSION: ${{ steps.monitor.outputs.new_version }} + run: | + echo "Checking for existing PR for version: ${CURRENT_VERSION}" + EXISTING_PR=$(gh pr list \ + --search "chore: update version to ${CURRENT_VERSION} in:head" \ + --state open \ + --json number,title \ + --jq '.[0]') + + if [ -n "$EXISTING_PR" ]; then + PR_NUMBER=$(echo "$EXISTING_PR" | jq -r '.number') + PR_TITLE=$(echo "$EXISTING_PR" | jq -r '.title') + echo "pr_exists=true" >> $GITHUB_OUTPUT + echo "existing_pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT + echo "existing_pr_url=$(gh pr view $PR_NUMBER --json url -q .url)" >> $GITHUB_OUTPUT + echo "Found existing PR: #$PR_NUMBER - $PR_TITLE" + else + echo "pr_exists=false" >> $GITHUB_OUTPUT + echo "No existing PR found for version ${CURRENT_VERSION}" + fi + + - name: Close previous version PRs + id: close_prs + if: steps.monitor.outputs.update_needed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CURRENT_VERSION: ${{ steps.monitor.outputs.new_version }} + run: | + echo "Closing previous version PRs (excluding current version: ${CURRENT_VERSION})..." + PREVIOUS_PRS=$(gh pr list \ + --search "chore: update version to in:head" \ + --state open \ + --json number,title \ + --jq '.[] | select(.title != "chore: update version to '"${CURRENT_VERSION}"'") | .number') + + if [ -n "$PREVIOUS_PRS" ]; then + echo "$PREVIOUS_PRS" | while read -r pr_number; do + echo "Closing PR #$pr_number" + gh pr close "$pr_number" --comment "由于新的版本更新 PR 自动关闭" + done + else + echo "No previous version PRs to close" + fi + + - name: Create Pull Request + id: pr + if: steps.monitor.outputs.update_needed == 'true' && steps.check_pr.outputs.pr_exists != 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + NEW_VERSION="${{ steps.monitor.outputs.new_version }}" + BRANCH_NAME="version-update-${NEW_VERSION}" + PR_BODY="## Version Update + + This PR updates the version index to reflect the new version detected from the official website. + + - **New Version**: ${NEW_VERSION} + - **Source**: ${{ vars.VERSION_SOURCE_URL || 'https://desktop.dl.hagicode.com/index.json' }} + - **Checked At**: $(date -u +"%Y-%m-%dT%H:%M:%SZ") + + ### Changes + - Updated \`public/version-index.json\` with the latest version data from online API + + ### Next Steps + After merging this PR, the CI/CD pipeline will automatically rebuild and deploy the documentation site with the updated version information. + + --- + _This PR was automatically created by the [Version Monitor](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) workflow._" + + gh pr create \ + --title "chore: update version to ${NEW_VERSION}" \ + --body "$PR_BODY" \ + --base main \ + --head "$BRANCH_NAME" \ + --label "automation,version" + + echo "pr_created=true" >> $GITHUB_OUTPUT + echo "pr_url=$(gh pr view --json url -q .url)" >> $GITHUB_OUTPUT + + - name: Display result + if: always() + run: | + echo "Version Monitor Result" + echo "======================" + echo "Update Needed: ${{ steps.monitor.outputs.update_needed }}" + echo "New Version: ${{ steps.monitor.outputs.new_version }}" + echo "Branch Exists: ${{ steps.check_branch.outputs.branch_exists }}" + echo "PR Exists: ${{ steps.check_pr.outputs.pr_exists }}" + echo "PR Created: ${{ steps.pr.outputs.pr_created }}" + if [ "${{ steps.check_pr.outputs.pr_exists }}" == "true" ]; then + echo "Existing PR: #${{ steps.check_pr.outputs.existing_pr_number }}" + echo "Existing PR URL: ${{ steps.check_pr.outputs.existing_pr_url }}" + else + echo "PR URL: ${{ steps.pr.outputs.pr_url }}" + fi + + notify-version-update: + needs: monitor + if: needs.monitor.outputs.pr_created == 'true' + runs-on: ubuntu-latest + steps: + - uses: HagiCode-org/haginotifier@v1 + with: + msg_type: 'post' + title: 'Version Monitor' + message: | + ## Version Monitor + + **状态**: 🔄 发现新版本 + **新版本**: ${{ needs.monitor.outputs.new_version }} + **仓库**: ${{ github.repository }} + **PR 链接**: ${{ needs.monitor.outputs.pr_url }} + **运行详情**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + env: + FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }} + + notify-failure: + needs: monitor + if: failure() + runs-on: ubuntu-latest + steps: + - uses: HagiCode-org/haginotifier@v1 + with: + msg_type: 'post' + title: 'Version Monitor' + message: | + ## Version Monitor + + **状态**: ❌ 失败 + **仓库**: ${{ github.repository }} + **触发者**: ${{ github.actor }} + **运行详情**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + env: + FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a51b2b2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Dependencies +node_modules/ +.pnp/ +.pnp.js + +# Turbo +.turbo/ + +# Testing +coverage/ + +# Production +build/ +.dist/ +dist/ + +# Misc +.DS_Store +*.pem + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local env files +.env +.env.local +.env.*.local + +# Docusaurus +.docusaurus/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +Thumbs.db + +.claude/skills/ui-ux-pro-max/scripts/__pycache__/ +.astro/ +tsconfig.tsbuildinfo diff --git a/README.md b/README.md index 1dc6372..5aaaf03 100644 --- a/README.md +++ b/README.md @@ -1 +1,83 @@ -# docs \ No newline at end of file +# HagiCode Documentation + +独立的 HagiCode 文档站点,使用 Astro 和 Starlight 构建。 + +## 仓库结构 + +``` +docs/ +├── src/ +│ ├── content/docs/ # 文档内容(Markdown 和 MDX 文件) +│ │ └── blog/ # 博客文章 +│ ├── components/ # 自定义 UI 组件 +│ ├── config/ # 导航和配置 +│ ├── integrations/ # Astro 集成 +│ ├── pages/ # 页面 +│ ├── styles/ # 样式文件 +│ └── utils/ # 工具函数 +├── public/ # 静态资源(图片、图标等) +├── .github/workflows/ # CI/CD 工作流 +├── astro.config.mjs # Astro 配置 +├── package.json # 依赖和脚本 +├── tsconfig.json # TypeScript 配置 +└── illustration-management.md # 配图管理指南 +``` + +## 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 + +```bash +npm run dev +``` + +文档站点将在 http://localhost:31265 启动。 + +### 构建 + +```bash +npm run build +``` + +构建输出将生成在 `dist/` 目录。 + +### 预览构建结果 + +```bash +npm run preview +``` + +## 贡献指南 + +### 编辑文档 + +文档内容位于 `src/content/docs/` 目录。编辑 Markdown 文件后,更改将自动在开发服务器中反映。 + +### 添加博客文章 + +1. 在 `src/content/docs/blog/` 创建新文件 +2. 使用日期前缀命名(例如:`2026-02-21-my-post.mdx`) +3. 添加 frontmatter 元数据 + +### 添加静态资源 + +将图片和其他静态文件放入 `public/` 目录。它们在构建时会被复制到 `dist/` 目录的根路径。 + +## CI/CD + +文档通过 GitHub Actions 自动部署到 Azure Static Web Apps。 + +- 推送到 `main` 分支会触发部署 +- Pull Requests 会触发构建验证 + +## 相关资源 + +- [Astro 文档](https://docs.astro.build) +- [Starlight 文档](https://starlight.astro.build) +- [配图管理指南](./illustration-management.md) diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..b5c009e --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,153 @@ +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; +import starlightBlog from "starlight-blog"; +import sitemap from "@astrojs/sitemap"; +import mdx from "@astrojs/mdx"; +import partytown from "@astrojs/partytown"; +import robotsTxt from "astro-robots-txt"; +import react from "@astrojs/react"; +import linkValidator from "astro-link-validator"; + +import mermaidInjector from "./src/integrations/mermaid-injector.ts"; +import rehypeMermaid from "rehype-mermaid"; +// rehype-raw 暂时禁用,可能与 MDX 处理冲突 +// import rehypeRaw from "rehype-raw"; +import rehypeExternalLinks from "rehype-external-links"; + +// 获取 base 路径:文档站点独立部署在 docs.hagicode.com,开发和生产都使用根路径 +const getBasePath = () => { + // 文档站点现在独立部署在 docs.hagicode.com + // 不再需要 /docs 前缀,开发和生产都使用根路径 + return "/"; +}; + +// https://astro.build/config +export default defineConfig({ + // 站点完整 URL,用于生成 sitemap 和 canonical URL + site: "https://docs.hagicode.com", + // 文档站点部署路径:独立部署在 docs.hagicode.com,使用根路径 + base: getBasePath(), + markdown: { + syntaxHighlight: { + type: "shiki", + excludeLangs: ["mermaid", "math"], + }, + rehypePlugins: [ + // rehypeRaw 暂时禁用,可能与 MDX 处理冲突 + // rehypeRaw, + rehypeMermaid, + [ + rehypeExternalLinks, + { + target: "_blank", + rel: ["noopener", "noreferrer"], + }, + ], + ], + }, + // 配置 Vite 环境变量 + vite: { + resolve: { + alias: { + "@": new URL("./src", import.meta.url).pathname, + "@shared": new URL("./shared/src", import.meta.url).pathname, + }, + }, + define: { + 'import.meta.env.PROD': JSON.stringify( + process.env.NODE_ENV === 'production' + ), + "import.meta.env.VITE_CLARITY_PROJECT_ID": JSON.stringify( + process.env.VITE_CLARITY_PROJECT_ID || "", + ), + "import.meta.env.VITE_CLARITY_DEBUG": JSON.stringify( + process.env.VITE_CLARITY_DEBUG || "", + ), + // Baidu Analytics - Disabled, migrated to 51LA + // "import.meta.env.VITE_BAIDU_ANALYTICS_ID": JSON.stringify( + // process.env.BAIDU_ANALYTICS_ID || "", + // ), + // "import.meta.env.VITE_BAIDU_ANALYTICS_DEBUG": JSON.stringify( + // process.env.BAIDU_ANALYTICS_DEBUG || "", + // ), + "import.meta.env.VITE_51LA_ID": JSON.stringify( + process.env.LI_51LA_ID || "L6b88a5yK4h2Xnci", + ), + "import.meta.env.VITE_51LA_DEBUG": JSON.stringify( + process.env.LI_51LA_DEBUG || "", + ), + }, + }, + integrations: [ + // robots.txt 配置 - 使用 astro-robots-txt 插件 + robotsTxt({ + sitemap: "https://docs.hagicode.com/sitemap-index.xml", + }), + + starlight({ + title: "Hagicode Docs", + description: "Hagicode 项目文档", + favicon: "/favicon.ico", + social: [ + { + icon: "github", + label: "GitHub 仓库", + href: "https://github.com/HagiCode-org/site", + }, + ], + components: { + Header: "./src/components/StarlightHeader.astro", + Footer: "./src/components/StarlightFooter.astro", + MarkdownContent: './src/components/MarkdownContent.astro', + }, + sidebar: [ + { + label: "产品概述", + link: "/product-overview", + }, + { + label: "快速开始", + autogenerate: { directory: "quick-start" }, + }, + { + label: "安装指南", + autogenerate: { directory: "installation" }, + }, + { + label: "相关软件安装", + autogenerate: { directory: "related-software-installation" }, + }, + ], + customCss: ["./src/styles/starlight-override.css"], + editLink: { + baseUrl: "https://github.com/HagiCode-org/site/edit/main/", + }, + plugins: [ + starlightBlog({ + rss: false, + postCount: 20, + }), + ], + }), + sitemap(), + partytown(), + react(), + mermaidInjector(), + // 链接验证集成 - 在 CI 环境中启用外部链接检查 + linkValidator({ + // 仅在 CI 环境中启用外部链接检查,避免本地构建时间过长 + checkExternal: process.env.CI === "true", + // 外部链接超时时间(毫秒) + externalTimeout: 10000, + // 链接检查不再阻塞构建,仅发出警告 + // 独立的链接检查由 .github/workflows/link-check.yml 负责 + failOnBrokenLinks: false, + // 详细输出(用于调试) + verbose: process.env.CI === "true", + // 排除某些路径(如 API 端点、管理后台) + exclude: [], + }), + ], + // 添加 Mermaid 渲染脚本到所有页面 + scopedStyleStrategy: "where", +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d6ff64e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10402 @@ +{ + "name": "@hagicode/docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@hagicode/docs", + "version": "0.0.1", + "dependencies": { + "@astrojs/mdx": "4.3.13", + "@astrojs/partytown": "^2.1.4", + "@astrojs/react": "^4.4.2", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/starlight": "^0.37.4", + "@types/react": "^19.2.13", + "@types/react-dom": "^19.2.3", + "astro": "^5.6.1", + "astro-link-validator": "github:rodgtr1/astro-link-validator", + "astro-robots-txt": "^1.0.0", + "astro-seo": "^1.1.0", + "mermaid": "^11.12.2", + "playwright": "^1.58.2", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "rehype-external-links": "^3.0.0", + "rehype-mermaid": "^3.0.0", + "rehype-raw": "^3.0.0", + "semver": "^7.7.4", + "sharp": "^0.34.2", + "starlight-blog": "^0.25.2" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@astrojs/check": { + "version": "0.9.6", + "resolved": "https://registry.npmmirror.com/@astrojs/check/-/check-0.9.6.tgz", + "integrity": "sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==", + "license": "MIT", + "dependencies": { + "@astrojs/language-server": "^2.16.1", + "chokidar": "^4.0.1", + "kleur": "^4.1.5", + "yargs": "^17.7.2" + }, + "bin": { + "astro-check": "bin/astro-check.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/language-server": { + "version": "2.16.3", + "resolved": "https://registry.npmmirror.com/@astrojs/language-server/-/language-server-2.16.3.tgz", + "integrity": "sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/yaml2ts": "^0.2.2", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.27", + "@volar/language-core": "~2.4.27", + "@volar/language-server": "~2.4.27", + "@volar/language-service": "~2.4.27", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.15", + "volar-service-css": "0.0.68", + "volar-service-emmet": "0.0.68", + "volar-service-html": "0.0.68", + "volar-service-prettier": "0.0.68", + "volar-service-typescript": "0.0.68", + "volar-service-typescript-twoslash-queries": "0.0.68", + "volar-service-yaml": "0.0.68", + "vscode-html-languageservice": "^5.6.1", + "vscode-uri": "^3.1.0" + }, + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmmirror.com/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmmirror.com/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/mdx/node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/mdx/node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/mdx/node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/partytown": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@astrojs/partytown/-/partytown-2.1.4.tgz", + "integrity": "sha512-loUrAu0cGYFDC6dHVRiomdsBJ41VjDYXPA+B3Br51V5hENFgDSOLju86OIj1TvBACcsB22UQV7BlppODDG5gig==", + "license": "MIT", + "dependencies": { + "@qwik.dev/partytown": "^0.11.0", + "mrmime": "^2.0.1" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/react": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@astrojs/react/-/react-4.4.2.tgz", + "integrity": "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ==", + "license": "MIT", + "dependencies": { + "@vitejs/plugin-react": "^4.7.0", + "ultrahtml": "^1.6.0", + "vite": "^6.4.1" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@astrojs/rss": { + "version": "4.0.15", + "resolved": "https://registry.npmmirror.com/@astrojs/rss/-/rss-4.0.15.tgz", + "integrity": "sha512-uXO/k6AhRkIDXmRoc6xQpoPZrimQNUmS43X4+60yunfuMNHtSRN5e/FiSi7NApcZqmugSMc5+cJi8ovqgO+qIg==", + "license": "MIT", + "dependencies": { + "fast-xml-parser": "^5.3.3", + "piccolore": "^0.1.3" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmmirror.com/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz", + "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", + "license": "MIT", + "dependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz", + "integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.1.1", + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/@chevrotain/gast/-/gast-11.1.1.tgz", + "integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz", + "integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/@chevrotain/types/-/types-11.1.1.tgz", + "integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/@chevrotain/utils/-/utils-11.1.1.tgz", + "integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==", + "license": "Apache-2.0" + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", + "license": "MIT", + "dependencies": { + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" + } + }, + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "license": "ISC", + "dependencies": { + "@emmetio/scanner": "^1.0.0" + } + }, + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", + "license": "MIT" + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/core/-/core-0.41.6.tgz", + "integrity": "sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-frames/-/plugin-frames-0.41.6.tgz", + "integrity": "sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.6.tgz", + "integrity": "sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.6.tgz", + "integrity": "sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@mermaid-js/parser/-/parser-1.0.0.tgz", + "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==", + "license": "MIT", + "dependencies": { + "langium": "^4.0.0" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@qwik.dev/partytown": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/@qwik.dev/partytown/-/partytown-0.11.2.tgz", + "integrity": "sha512-795y49CqBiKiwKAD+QBZlzlqEK275hVcazZ7wBPSfgC23L+vWuA7PJmMpgxojOucZHzYi5rAAQ+IP1I3BKVZxw==", + "license": "MIT", + "dependencies": { + "dotenv": "^16.4.7" + }, + "bin": { + "partytown": "bin/partytown.cjs" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.58.0.tgz", + "integrity": "sha512-mr0tmS/4FoVk1cnaeN244A/wjvGDNItZKR8hRhnmCzygyRXYtKF5jVDSIILR1U97CTzAYmbgIj/Dukg62ggG5w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.58.0.tgz", + "integrity": "sha512-+s++dbp+/RTte62mQD9wLSbiMTV+xr/PeRJEc/sFZFSBRlHPNPVaf5FXlzAL77Mr8FtSfQqCN+I598M8U41ccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.58.0.tgz", + "integrity": "sha512-MFWBwTcYs0jZbINQBXHfSrpSQJq3IUOakcKPzfeSznONop14Pxuqa0Kg19GD0rNBMPQI2tFtu3UzapZpH0Uc1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.58.0.tgz", + "integrity": "sha512-yiKJY7pj9c9JwzuKYLFaDZw5gma3fI9bkPEIyofvVfsPqjCWPglSHdpdwXpKGvDeYDms3Qal8qGMEHZ1M/4Udg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.58.0.tgz", + "integrity": "sha512-x97kCoBh5MOevpn/CNK9W1x8BEzO238541BGWBc315uOlN0AD/ifZ1msg+ZQB05Ux+VF6EcYqpiagfLJ8U3LvQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.58.0.tgz", + "integrity": "sha512-Aa8jPoZ6IQAG2eIrcXPpjRcMjROMFxCt1UYPZZtCxRV68WkuSigYtQ/7Zwrcr2IvtNJo7T2JfDXyMLxq5L4Jlg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.58.0.tgz", + "integrity": "sha512-Ob8YgT5kD/lSIYW2Rcngs5kNB/44Q2RzBSPz9brf2WEtcGR7/f/E9HeHn1wYaAwKBni+bdXEwgHvUd0x12lQSA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.58.0.tgz", + "integrity": "sha512-K+RI5oP1ceqoadvNt1FecL17Qtw/n9BgRSzxif3rTL2QlIu88ccvY+Y9nnHe/cmT5zbH9+bpiJuG1mGHRVwF4Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.58.0.tgz", + "integrity": "sha512-T+17JAsCKUjmbopcKepJjHWHXSjeW7O5PL7lEFaeQmiVyw4kkc5/lyYKzrv6ElWRX/MrEWfPiJWqbTvfIvjM1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.58.0.tgz", + "integrity": "sha512-cCePktb9+6R9itIJdeCFF9txPU7pQeEHB5AbHu/MKsfH/k70ZtOeq1k4YAtBv9Z7mmKI5/wOLYjQ+B9QdxR6LA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.58.0.tgz", + "integrity": "sha512-iekUaLkfliAsDl4/xSdoCJ1gnnIXvoNz85C8U8+ZxknM5pBStfZjeXgB8lXobDQvvPRCN8FPmmuTtH+z95HTmg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.58.0.tgz", + "integrity": "sha512-68ofRgJNl/jYJbxFjCKE7IwhbfxOl1muPN4KbIqAIe32lm22KmU7E8OPvyy68HTNkI2iV/c8y2kSPSm2mW/Q9Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.58.0.tgz", + "integrity": "sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.58.0.tgz", + "integrity": "sha512-4gdkkf9UJ7tafnweBCR/mk4jf3Jfl0cKX9Np80t5i78kjIH0ZdezUv/JDI2VtruE5lunfACqftJ8dIMGN4oHew==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.58.0.tgz", + "integrity": "sha512-YFS4vPnOkDTD/JriUeeZurFYoJhPf9GQQEF/v4lltp3mVcBmnsAdjEWhr2cjUCZzZNzxCG0HZOvJU44UGHSdzw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.58.0.tgz", + "integrity": "sha512-x2xgZlFne+QVNKV8b4wwaCS8pwq3y14zedZ5DqLzjdRITvreBk//4Knbcvm7+lWmms9V9qFp60MtUd0/t/PXPw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.58.0.tgz", + "integrity": "sha512-jIhrujyn4UnWF8S+DHSkAkDEO3hLX0cjzxJZPLF80xFyzyUIYgSMRcYQ3+uqEoyDD2beGq7Dj7edi8OnJcS/hg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.58.0.tgz", + "integrity": "sha512-+410Srdoh78MKSJxTQ+hZ/Mx+ajd6RjjPwBPNd0R3J9FtL6ZA0GqiiyNjCO9In0IzZkCNrpGymSfn+kgyPQocg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.58.0.tgz", + "integrity": "sha512-ZjMyby5SICi227y1MTR3VYBpFTdZs823Rs/hpakufleBoufoOIB6jtm9FEoxn/cgO7l6PM2rCEl5Kre5vX0QrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.58.0.tgz", + "integrity": "sha512-ds4iwfYkSQ0k1nb8LTcyXw//ToHOnNTJtceySpL3fa7tc/AsE+UpUFphW126A6fKBGJD5dhRvg8zw1rvoGFxmw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.58.0.tgz", + "integrity": "sha512-fd/zpJniln4ICdPkjWFhZYeY/bpnaN9pGa6ko+5WD38I0tTqk9lXMgXZg09MNdhpARngmxiCg0B0XUamNw/5BQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.58.0.tgz", + "integrity": "sha512-YpG8dUOip7DCz3nr/JUfPbIUo+2d/dy++5bFzgi4ugOGBIox+qMbbqt/JoORwvI/C9Kn2tz6+Bieoqd5+B1CjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.58.0.tgz", + "integrity": "sha512-b9DI8jpFQVh4hIXFr0/+N/TzLdpBIoPzjt0Rt4xJbW3mzguV3mduR9cNgiuFcuL/TeORejJhCWiAXe3E/6PxWA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.58.0.tgz", + "integrity": "sha512-CSrVpmoRJFN06LL9xhkitkwUcTZtIotYAF5p6XOR2zW0Zz5mzb3IPpcoPhB02frzMHFNo1reQ9xSF5fFm3hUsQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.58.0.tgz", + "integrity": "sha512-QFsBgQNTnh5K0t/sBsjJLq24YVqEIVkGpfN2VHsnN90soZyhaiA9UUHufcctVNL4ypJY0wrwad0wslx2KJQ1/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "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": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmmirror.com/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.17.3", + "resolved": "https://registry.npmmirror.com/astro/-/astro-5.17.3.tgz", + "integrity": "sha512-69dcfPe8LsHzklwj+hl+vunWUbpMB6pmg35mACjetxbJeUNNys90JaBM8ZiwsPK689SAj/4Zqb1ayaANls9/MA==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/astro-expressive-code/-/astro-expressive-code-0.41.6.tgz", + "integrity": "sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.6" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/astro-link-validator": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/rodgtr1/astro-link-validator.git#025a27b2582234084b3676bc725418b5fc429dcd", + "license": "MIT", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "picocolors": "^1.0.0" + }, + "peerDependencies": { + "astro": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/astro-remote": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/astro-remote/-/astro-remote-0.3.4.tgz", + "integrity": "sha512-jL5skNQLA0YBc1R3bVGXyHew3FqGqsT7AgLzWAVeTLzFkwVMUYvs4/lKJSmS7ygcF1GnHnoKG6++8GL9VtWwGQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0", + "marked": "^12.0.0", + "marked-footnote": "^1.2.2", + "marked-smartypants": "^1.1.6", + "ultrahtml": "^1.5.3" + }, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/astro-remote/node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmmirror.com/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/astro-robots-txt": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/astro-robots-txt/-/astro-robots-txt-1.0.0.tgz", + "integrity": "sha512-6JQSLid4gMhoWjOm85UHLkgrw0+hHIjnJVIUqxjU2D6feKlVyYukMNYjH44ZDZBK1P8hNxd33PgWlHzCASvedA==", + "license": "MIT", + "dependencies": { + "valid-filename": "^4.0.0", + "zod": "^3.22.2" + } + }, + "node_modules/astro-seo": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/astro-seo/-/astro-seo-1.1.0.tgz", + "integrity": "sha512-G6LDNDyga30o+52v58jU7C35n3cORUzk7RSuY+xf/ZRbW6JiNplyaOO1VoYVKO+xzYNaBcxqNln2RFRR/wgJNQ==", + "license": "MIT", + "dependencies": { + "@astrojs/check": "^0.9.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001770", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chevrotain": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-11.1.1.tgz", + "integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.1.1", + "@chevrotain/gast": "11.1.1", + "@chevrotain/regexp-to-ast": "11.1.1", + "@chevrotain/types": "11.1.1", + "@chevrotain/utils": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmmirror.com/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmmirror.com/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "license": "ISC" + }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/expressive-code/-/expressive-code-0.41.6.tgz", + "integrity": "sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "@expressive-code/plugin-frames": "^0.41.6", + "@expressive-code/plugin-shiki": "^0.41.6", + "@expressive-code/plugin-text-markers": "^0.41.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "5.3.7", + "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.3.7.tgz", + "integrity": "sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.5", + "resolved": "https://registry.npmmirror.com/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/hast-to-hyperscript": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", + "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", + "license": "MIT", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "property-information": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.2.1", + "unist-util-is": "^2.0.0", + "web-namespaces": "^1.1.2" + } + }, + "node_modules/hast-to-hyperscript/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-to-hyperscript/node_modules/property-information": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-4.2.0.tgz", + "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.1" + } + }, + "node_modules/hast-to-hyperscript/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-to-hyperscript/node_modules/unist-util-is": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-2.1.3.tgz", + "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==", + "license": "MIT" + }, + "node_modules/hast-to-hyperscript/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", + "license": "ISC", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^9.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-4.0.0.tgz", + "integrity": "sha512-5xYHyEJMCf8lX/NT4iA5z6N43yoFsrJqXJ5GWwAbLn815URbIz+UNNFEgid33F9paZuDlqVKvB+K3Aqu5+DdSw==", + "license": "MIT", + "dependencies": { + "hast-util-from-parse5": "^4.0.2", + "hast-util-to-parse5": "^4.0.1", + "html-void-elements": "^1.0.1", + "parse5": "^5.0.0", + "unist-util-position": "^3.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.1", + "zwitch": "^1.0.0" + } + }, + "node_modules/hast-util-raw/node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/hast-util-from-parse5": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-4.0.2.tgz", + "integrity": "sha512-I6dtjsGtDqz4fmGSiFClFyiXdKhj5bPceS6intta7k/VDuiKz9P61C6hO6WMiNNmEm1b/EtBH8f+juvz4o0uwQ==", + "license": "MIT", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^4.0.0", + "property-information": "^4.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "node_modules/hast-util-raw/node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/hastscript": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-4.1.0.tgz", + "integrity": "sha512-bOTn9hEfzewvHyXdbYGKqOr/LOz+2zYhKbC17U2YAjd16mnjqB1BQ0nooM/RdMy/htVyli0NAznXiBtwDi1cmQ==", + "license": "MIT", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.2.0", + "property-information": "^4.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "node_modules/hast-util-raw/node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "license": "MIT" + }, + "node_modules/hast-util-raw/node_modules/property-information": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-4.2.0.tgz", + "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.1" + } + }, + "node_modules/hast-util-raw/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-raw/node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-4.0.1.tgz", + "integrity": "sha512-U/61W+fsNfBpCyJBB5Pt3l5ypIfgXqEyW9pyrtxF7XrqDJHzcFrYpnC94d0JDYjvobLpYCzcU9srhMRPEO1YXw==", + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^5.0.0", + "property-information": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.1", + "zwitch": "^1.0.0" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-4.2.0.tgz", + "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.1" + } + }, + "node_modules/hast-util-to-parse5/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5/node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "license": "MIT" + }, + "node_modules/katex": { + "version": "0.16.28", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.28.tgz", + "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/langium": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmmirror.com/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/marked-footnote": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/marked-footnote/-/marked-footnote-1.4.0.tgz", + "integrity": "sha512-fZTxAhI1TcLEs5UOjCfYfTHpyKGaWQevbxaGTEA68B51l7i87SctPFtHETYqPkEN0ka5opvy4Dy1l/yXVC+hmg==", + "license": "MIT", + "peerDependencies": { + "marked": ">=7.0.0" + } + }, + "node_modules/marked-plaintify": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/marked-plaintify/-/marked-plaintify-1.1.1.tgz", + "integrity": "sha512-r3kMKArhfo2H3lD4ctFq/OJTzM0uNvXHh7FBTI1hMDpf4Ac1djjtq4g8NfTBWMxWLmaEz3KL1jCkLygik3gExA==", + "license": "MIT", + "peerDependencies": { + "marked": ">=13.0.0" + } + }, + "node_modules/marked-smartypants": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/marked-smartypants/-/marked-smartypants-1.1.11.tgz", + "integrity": "sha512-Jt0eq/6rf9oXDfEKPzQ0z7UzVWcEAK3L6QBBQzbwV8bT304OvPVLTqpH3yvkSung9foOM4s120TMHEHP76Metg==", + "license": "MIT", + "dependencies": { + "smartypants": "^0.2.2" + }, + "peerDependencies": { + "marked": ">=4 <18" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/mermaid": { + "version": "11.12.3", + "resolved": "https://registry.npmmirror.com/mermaid/-/mermaid-11.12.3.tgz", + "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^1.0.0", + "@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.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid-isomorphic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mermaid-isomorphic/-/mermaid-isomorphic-3.1.0.tgz", + "integrity": "sha512-mzrvfEVjnJIkJlEqxp3eMuR1wS0TeLCH1VK5E/T5yzWaBwI3JqjJuw70yUIThSCDJ5bRs6O3rgfp00oBAbvSeQ==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-free": "^6.0.0", + "katex": "^0.16.0", + "mermaid": "^11.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "playwright": "1" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + } + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmmirror.com/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmmirror.com/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmmirror.com/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/rehype-expressive-code/-/rehype-expressive-code-0.41.6.tgz", + "integrity": "sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.6" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-mermaid": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/rehype-mermaid/-/rehype-mermaid-3.0.0.tgz", + "integrity": "sha512-fxrD5E4Fa1WXUjmjNDvLOMT4XB1WaxcfycFIWiYU0yEMQhcTDElc9aDFnbDFRLxG1Cfo1I3mfD5kg4sjlWaB+Q==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "mermaid-isomorphic": "^3.0.0", + "mini-svg-data-uri": "^1.0.0", + "space-separated-tokens": "^2.0.0", + "unified": "^11.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "playwright": "1" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + } + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-3.0.0.tgz", + "integrity": "sha512-U8OBB1DwrsxK5trvrhZLaJWrFkTFtOaLV7z8O7OAnwJ/+VTNBEaTUgJfMihSxB063m7/eNVA4+yZnDVuTxeTrQ==", + "license": "MIT", + "dependencies": { + "hast-util-raw": "^4.0.0" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.58.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.58.0.tgz", + "integrity": "sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.58.0", + "@rollup/rollup-android-arm64": "4.58.0", + "@rollup/rollup-darwin-arm64": "4.58.0", + "@rollup/rollup-darwin-x64": "4.58.0", + "@rollup/rollup-freebsd-arm64": "4.58.0", + "@rollup/rollup-freebsd-x64": "4.58.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.58.0", + "@rollup/rollup-linux-arm-musleabihf": "4.58.0", + "@rollup/rollup-linux-arm64-gnu": "4.58.0", + "@rollup/rollup-linux-arm64-musl": "4.58.0", + "@rollup/rollup-linux-loong64-gnu": "4.58.0", + "@rollup/rollup-linux-loong64-musl": "4.58.0", + "@rollup/rollup-linux-ppc64-gnu": "4.58.0", + "@rollup/rollup-linux-ppc64-musl": "4.58.0", + "@rollup/rollup-linux-riscv64-gnu": "4.58.0", + "@rollup/rollup-linux-riscv64-musl": "4.58.0", + "@rollup/rollup-linux-s390x-gnu": "4.58.0", + "@rollup/rollup-linux-x64-gnu": "4.58.0", + "@rollup/rollup-linux-x64-musl": "4.58.0", + "@rollup/rollup-openbsd-x64": "4.58.0", + "@rollup/rollup-openharmony-arm64": "4.58.0", + "@rollup/rollup-win32-arm64-msvc": "4.58.0", + "@rollup/rollup-win32-ia32-msvc": "4.58.0", + "@rollup/rollup-win32-x64-gnu": "4.58.0", + "@rollup/rollup-win32-x64-msvc": "4.58.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmmirror.com/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmmirror.com/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/sitemap/-/sitemap-8.0.2.tgz", + "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smartypants": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/smartypants/-/smartypants-0.2.2.tgz", + "integrity": "sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q==", + "license": "BSD-3-Clause", + "bin": { + "smartypants": "bin/smartypants.js", + "smartypantsu": "bin/smartypantsu.js" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/starlight-blog": { + "version": "0.25.2", + "resolved": "https://registry.npmmirror.com/starlight-blog/-/starlight-blog-0.25.2.tgz", + "integrity": "sha512-YsNXI1fT0w9CdgVGRJGR8KxNWJgKuHsad/avo9Z+FU9k9EWJVdr/Ret7tm0HbFFbOGJ8/JY/U64EHYdCAtxQhg==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.0.8", + "@astrojs/rss": "^4.0.11", + "astro-remote": "^0.3.3", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-html": "^9.0.5", + "hast-util-to-string": "^3.0.1", + "marked": "^15.0.4", + "marked-plaintify": "^1.1.1", + "mdast-util-mdx-expression": "^2.0.1", + "unist-util-is": "^6.0.0", + "unist-util-remove": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=18.20.8" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.33.0" + } + }, + "node_modules/starlight-blog/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-js/node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/style-to-object": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-0.2.3.tgz", + "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.8" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.22.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmmirror.com/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/unstorage/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/valid-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/valid-filename/-/valid-filename-4.0.0.tgz", + "integrity": "sha512-VEYTpTVPMgO799f2wI7zWf0x2C54bPX6NAfbZ2Z8kZn76p+3rEYCTYVYzMUcVSMvakxMQTriBf24s3+WeXJtEg==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/volar-service-css": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-css/-/volar-service-css-0.0.68.tgz", + "integrity": "sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==", + "license": "MIT", + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-emmet": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-emmet/-/volar-service-emmet-0.0.68.tgz", + "integrity": "sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==", + "license": "MIT", + "dependencies": { + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-html": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-html/-/volar-service-html-0.0.68.tgz", + "integrity": "sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==", + "license": "MIT", + "dependencies": { + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-prettier": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-prettier/-/volar-service-prettier-0.0.68.tgz", + "integrity": "sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==", + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-typescript/-/volar-service-typescript-0.0.68.tgz", + "integrity": "sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==", + "license": "MIT", + "dependencies": { + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.68.tgz", + "integrity": "sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==", + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.68", + "resolved": "https://registry.npmmirror.com/volar-service-yaml/-/volar-service-yaml-0.0.68.tgz", + "integrity": "sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==", + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.19.2" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/vscode-css-languageservice": { + "version": "6.3.9", + "resolved": "https://registry.npmmirror.com/vscode-css-languageservice/-/vscode-css-languageservice-6.3.9.tgz", + "integrity": "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/vscode-html-languageservice/-/vscode-html-languageservice-5.6.1.tgz", + "integrity": "sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmmirror.com/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-language-server": { + "version": "1.19.2", + "resolved": "https://registry.npmmirror.com/yaml-language-server/-/yaml-language-server-1.19.2.tgz", + "integrity": "sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "lodash": "4.17.21", + "prettier": "^3.5.0", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.7.1" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + } + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmmirror.com/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1090faf --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "@hagicode/docs", + "version": "0.0.1", + "private": true, + "type": "module", + "description": "HagiCode documentation site - built with Astro and Starlight", + "scripts": { + "dev": "astro dev --port ${PORT_DOCS:-31265}", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview --port ${PORT_DOCS:-31265}", + "astro": "astro", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@astrojs/mdx": "4.3.13", + "@astrojs/partytown": "^2.1.4", + "@astrojs/react": "^4.4.2", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/starlight": "^0.37.4", + "@types/react": "^19.2.13", + "@types/react-dom": "^19.2.3", + "astro": "^5.6.1", + "astro-link-validator": "github:rodgtr1/astro-link-validator", + "astro-robots-txt": "^1.0.0", + "astro-seo": "^1.1.0", + "mermaid": "^11.12.2", + "playwright": "^1.58.2", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "rehype-external-links": "^3.0.0", + "rehype-mermaid": "^3.0.0", + "rehype-raw": "^3.0.0", + "semver": "^7.7.4", + "sharp": "^0.34.2", + "starlight-blog": "^0.25.2" + } +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..662d552 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,30 @@ +# Cache Configuration for Static Resources +# This file configures HTTP cache headers for GitHub Pages deployment + +# Enable Expires module for cache expiration + + ExpiresActive On + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/javascript "access plus 1 year" + + +# Enable Headers module for Cache-Control + + # Hashed resources in _astro directory - 1 year immutable cache + # These files contain content hashes in their filenames, so they never change + + Header set Cache-Control "public, max-age=31536000, immutable" + + + # Static assets (images, fonts, icons) - 1 day cache + + Header set Cache-Control "public, max-age=86400" + + + # HTML documents - no cache, must revalidate + # HTML content changes frequently and should always be fresh + + Header set Cache-Control "public, max-age=0, must-revalidate" + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..4531a81 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/img/README.md b/public/img/README.md new file mode 100644 index 0000000..21b4931 --- /dev/null +++ b/public/img/README.md @@ -0,0 +1,94 @@ +# Static Images Directory + +This directory contains static image files that are served directly by the Astro site. + +## ⚠️ Important Note + +**Document images have been migrated!** + +As part of the image migration to Content Collections, all documentation-related images have been moved to `src/content/docs/img/`. This directory now only contains: + +- **home/** - Images used by the root README.md (project homepage) +- **docusaurus-social-card.jpg** - Social media preview image + +## Current Contents + +``` +public/img/ +├── home/ # Root README.md images +│ ├── 亮色主题主界面.png +│ ├── 暗色主题主界面.png +│ ├── 使用 AI 的效率提升报告.png +│ ├── 每日成就报告.png +│ └── 每日编写代码获得的成就.png +├── docusaurus-social-card.jpg # Social media preview +└── README.md # This file +``` + +## Image Management Policy + +### For Documentation Content + +**DO NOT** add new documentation images to this directory. + +Instead, use the new Content Collections image directory: + +``` +src/content/docs/img/ +├── quick-start/ # Quick start guide images +├── installation/ # Installation guide images +├── related-software-installation/ # Related software images +├── product-overview/ # Product overview images +└── shared/ # Shared documentation images +``` + +**Reference images in Markdown using relative paths:** + +```markdown + +![Image](./img/category/image.png) + + +![Image](../img/quick-start/category/image.png) + + +![Image](../../img/category/image.png) +``` + +### For Static Site Assets + +This directory is appropriate for: + +- **Site-wide assets**: favicons, logos, social media images +- **Root README images**: images displayed on the project homepage +- **Public resources**: assets referenced from non-content pages + +Reference these using absolute paths: + +```markdown +![Image](/img/filename.png) +``` + +## Supported Formats + +Common image formats are supported: +- PNG (.png) +- JPEG (.jpg, .jpeg) +- GIF (.gif) +- SVG (.svg) +- WebP (.webp) + +## Best Practices + +1. **Optimize images** - Compress images before adding them +2. **Use descriptive names** - Name files clearly (e.g., `installation-screenshot.png`) +3. **Choose the right location** - Documentation images → `src/content/docs/img/`, site assets → `public/img/` + +## Migration Info + +This directory was cleaned up as part of the astro-image-migration proposal. See the migration scripts in `scripts/image-migration/` for details. + +--- + +**Last Updated**: 2025-02-17 +**Migration**: astro-image-migration diff --git a/public/img/docusaurus-social-card.jpg b/public/img/docusaurus-social-card.jpg new file mode 100644 index 0000000..e69de29 diff --git "a/public/img/home/\344\272\256\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" "b/public/img/home/\344\272\256\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" new file mode 100644 index 0000000..c0276d8 Binary files /dev/null and "b/public/img/home/\344\272\256\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" differ diff --git "a/public/img/home/\344\275\277\347\224\250 AI \347\232\204\346\225\210\347\216\207\346\217\220\345\215\207\346\212\245\345\221\212.png" "b/public/img/home/\344\275\277\347\224\250 AI \347\232\204\346\225\210\347\216\207\346\217\220\345\215\207\346\212\245\345\221\212.png" new file mode 100644 index 0000000..9a83d67 Binary files /dev/null and "b/public/img/home/\344\275\277\347\224\250 AI \347\232\204\346\225\210\347\216\207\346\217\220\345\215\207\346\212\245\345\221\212.png" differ diff --git "a/public/img/home/\345\256\236\346\227\266token\346\266\210\350\200\227\346\212\245\345\221\212.png" "b/public/img/home/\345\256\236\346\227\266token\346\266\210\350\200\227\346\212\245\345\221\212.png" new file mode 100644 index 0000000..2432503 Binary files /dev/null and "b/public/img/home/\345\256\236\346\227\266token\346\266\210\350\200\227\346\212\245\345\221\212.png" differ diff --git "a/public/img/home/\346\232\227\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" "b/public/img/home/\346\232\227\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" new file mode 100644 index 0000000..782ef36 Binary files /dev/null and "b/public/img/home/\346\232\227\350\211\262\344\270\273\351\242\230\344\270\273\347\225\214\351\235\242.png" differ diff --git "a/public/img/home/\346\257\217\346\227\245\346\210\220\345\260\261\346\212\245\345\221\212.png" "b/public/img/home/\346\257\217\346\227\245\346\210\220\345\260\261\346\212\245\345\221\212.png" new file mode 100644 index 0000000..473050e Binary files /dev/null and "b/public/img/home/\346\257\217\346\227\245\346\210\220\345\260\261\346\212\245\345\221\212.png" differ diff --git "a/public/img/home/\346\257\217\346\227\245\347\274\226\345\206\231\344\273\243\347\240\201\350\216\267\345\276\227\347\232\204\346\210\220\345\260\261.png" "b/public/img/home/\346\257\217\346\227\245\347\274\226\345\206\231\344\273\243\347\240\201\350\216\267\345\276\227\347\232\204\346\210\220\345\260\261.png" new file mode 100644 index 0000000..c2644a9 Binary files /dev/null and "b/public/img/home/\346\257\217\346\227\245\347\274\226\345\206\231\344\273\243\347\240\201\350\216\267\345\276\227\347\232\204\346\210\220\345\260\261.png" differ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..38a586b Binary files /dev/null and b/public/logo.png differ diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..6c70e6b --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/staticwebapp.config.json b/public/staticwebapp.config.json new file mode 100644 index 0000000..b679371 --- /dev/null +++ b/public/staticwebapp.config.json @@ -0,0 +1,90 @@ +{ + "navigationFallback": { + "rewrite": "index.html" + }, + "globalOverrides": { + "headers": { + "cache-control": "public, max-age=0, must-revalidate" + } + }, + "overrides": [ + { + "route": "/_astro/*", + "headers": { + "cache-control": "public, max-age=31536000, immutable" + } + }, + { + "route": "/*.jpg", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.jpeg", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.png", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.gif", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.ico", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.svg", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.webp", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.woff", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.woff2", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.ttf", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.eot", + "headers": { + "cache-control": "public, max-age=86400" + } + }, + { + "route": "/*.otf", + "headers": { + "cache-control": "public, max-age=86400" + } + } + ] +} diff --git a/public/version-index.json b/public/version-index.json new file mode 100644 index 0000000..effaac8 --- /dev/null +++ b/public/version-index.json @@ -0,0 +1,863 @@ +{ + "updatedAt": "2026-02-16T10:11:22.0529559Z", + "versions": [ + { + "version": "v0.1.9", + "files": [ + { + "name": "Hagicode.Desktop-0.1.9-arm64-mac.zip", + "path": "v0.1.9/Hagicode.Desktop-0.1.9-arm64-mac.zip", + "size": 170041122, + "lastModified": "2026-02-14T01:28:29.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.9-arm64.dmg", + "path": "v0.1.9/Hagicode.Desktop-0.1.9-arm64.dmg", + "size": 177671092, + "lastModified": "2026-02-14T01:28:40.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.9-mac.zip", + "path": "v0.1.9/Hagicode.Desktop-0.1.9-mac.zip", + "size": 175490577, + "lastModified": "2026-02-14T01:28:50.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.9.AppImage", + "path": "v0.1.9/Hagicode.Desktop-0.1.9.AppImage", + "size": 183906385, + "lastModified": "2026-02-14T01:29:03.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.9.dmg", + "path": "v0.1.9/Hagicode.Desktop-0.1.9.dmg", + "size": 183158560, + "lastModified": "2026-02-14T01:29:15.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.9.appx", + "path": "v0.1.9/Hagicode.Desktop.0.1.9.appx", + "size": 211820379, + "lastModified": "2026-02-14T01:29:35.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.9.exe", + "path": "v0.1.9/Hagicode.Desktop.0.1.9.exe", + "size": 106955432, + "lastModified": "2026-02-14T01:29:42.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.9.exe", + "path": "v0.1.9/Hagicode.Desktop.Setup.0.1.9.exe", + "size": 107154361, + "lastModified": "2026-02-14T01:29:51.0000000" + }, + { + "name": "hagicode-desktop-0.1.9.tar.gz", + "path": "v0.1.9/hagicode-desktop-0.1.9.tar.gz", + "size": 171850761, + "lastModified": "2026-02-14T01:30:08.0000000" + }, + { + "name": "hagicode-desktop_0.1.9_amd64.deb", + "path": "v0.1.9/hagicode-desktop_0.1.9_amd64.deb", + "size": 117423904, + "lastModified": "2026-02-14T01:30:17.0000000" + } + ] + }, + { + "version": "v0.1.8", + "files": [ + { + "name": "Hagicode.Desktop-0.1.8-arm64-mac.zip", + "path": "v0.1.8/Hagicode.Desktop-0.1.8-arm64-mac.zip", + "size": 170039416, + "lastModified": "2026-02-13T12:28:02.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.8-arm64.dmg", + "path": "v0.1.8/Hagicode.Desktop-0.1.8-arm64.dmg", + "size": 177668972, + "lastModified": "2026-02-13T12:28:17.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.8-mac.zip", + "path": "v0.1.8/Hagicode.Desktop-0.1.8-mac.zip", + "size": 175488879, + "lastModified": "2026-02-13T12:34:07.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.8.AppImage", + "path": "v0.1.8/Hagicode.Desktop-0.1.8.AppImage", + "size": 183902403, + "lastModified": "2026-02-13T12:35:21.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.8.dmg", + "path": "v0.1.8/Hagicode.Desktop-0.1.8.dmg", + "size": 183156977, + "lastModified": "2026-02-13T12:37:19.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.8.appx", + "path": "v0.1.8/Hagicode.Desktop.0.1.8.appx", + "size": 211820948, + "lastModified": "2026-02-13T12:38:22.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.8.exe", + "path": "v0.1.8/Hagicode.Desktop.0.1.8.exe", + "size": 106954896, + "lastModified": "2026-02-13T12:38:32.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.8.exe", + "path": "v0.1.8/Hagicode.Desktop.Setup.0.1.8.exe", + "size": 107153833, + "lastModified": "2026-02-13T12:38:49.0000000" + }, + { + "name": "hagicode-desktop-0.1.8.tar.gz", + "path": "v0.1.8/hagicode-desktop-0.1.8.tar.gz", + "size": 171848729, + "lastModified": "2026-02-13T12:40:37.0000000" + }, + { + "name": "hagicode-desktop_0.1.8_amd64.deb", + "path": "v0.1.8/hagicode-desktop_0.1.8_amd64.deb", + "size": 117422480, + "lastModified": "2026-02-13T12:41:15.0000000" + } + ] + }, + { + "version": "v0.1.7", + "files": [ + { + "name": "Hagicode.Desktop-0.1.7-arm64-mac.zip", + "path": "v0.1.7/Hagicode.Desktop-0.1.7-arm64-mac.zip", + "size": 170037490, + "lastModified": "2026-02-11T09:48:02.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.7-arm64.dmg", + "path": "v0.1.7/Hagicode.Desktop-0.1.7-arm64.dmg", + "size": 177698646, + "lastModified": "2026-02-11T09:49:32.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.7-mac.zip", + "path": "v0.1.7/Hagicode.Desktop-0.1.7-mac.zip", + "size": 175486938, + "lastModified": "2026-02-11T09:49:50.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.7.AppImage", + "path": "v0.1.7/Hagicode.Desktop-0.1.7.AppImage", + "size": 183898559, + "lastModified": "2026-02-11T09:50:41.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.7.dmg", + "path": "v0.1.7/Hagicode.Desktop-0.1.7.dmg", + "size": 183166189, + "lastModified": "2026-02-11T09:50:58.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.7.appx", + "path": "v0.1.7/Hagicode.Desktop.0.1.7.appx", + "size": 211817212, + "lastModified": "2026-02-11T09:53:29.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.7.exe", + "path": "v0.1.7/Hagicode.Desktop.0.1.7.exe", + "size": 106955293, + "lastModified": "2026-02-11T09:53:40.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.7.exe", + "path": "v0.1.7/Hagicode.Desktop.Setup.0.1.7.exe", + "size": 107154226, + "lastModified": "2026-02-11T09:53:51.0000000" + }, + { + "name": "hagicode-desktop-0.1.7.tar.gz", + "path": "v0.1.7/hagicode-desktop-0.1.7.tar.gz", + "size": 171847222, + "lastModified": "2026-02-11T09:55:09.0000000" + }, + { + "name": "hagicode-desktop_0.1.7_amd64.deb", + "path": "v0.1.7/hagicode-desktop_0.1.7_amd64.deb", + "size": 117484676, + "lastModified": "2026-02-11T09:55:21.0000000" + } + ] + }, + { + "version": "v0.1.6", + "files": [ + { + "name": "Hagicode.Desktop-0.1.6-arm64-mac.zip", + "path": "v0.1.6/Hagicode.Desktop-0.1.6-arm64-mac.zip", + "size": 170088015, + "lastModified": "2026-02-10T13:08:44.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.6-arm64.dmg", + "path": "v0.1.6/Hagicode.Desktop-0.1.6-arm64.dmg", + "size": 177753633, + "lastModified": "2026-02-10T13:09:08.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.6-mac.zip", + "path": "v0.1.6/Hagicode.Desktop-0.1.6-mac.zip", + "size": 175541033, + "lastModified": "2026-02-10T13:12:47.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.6.AppImage", + "path": "v0.1.6/Hagicode.Desktop-0.1.6.AppImage", + "size": 183935599, + "lastModified": "2026-02-10T13:15:59.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.6.dmg", + "path": "v0.1.6/Hagicode.Desktop-0.1.6.dmg", + "size": 183199829, + "lastModified": "2026-02-10T13:17:39.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.6.appx", + "path": "v0.1.6/Hagicode.Desktop.0.1.6.appx", + "size": 211871579, + "lastModified": "2026-02-10T13:19:03.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.6.exe", + "path": "v0.1.6/Hagicode.Desktop.0.1.6.exe", + "size": 106969879, + "lastModified": "2026-02-10T13:19:52.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.6.exe", + "path": "v0.1.6/Hagicode.Desktop.Setup.0.1.6.exe", + "size": 107168817, + "lastModified": "2026-02-10T13:21:18.0000000" + }, + { + "name": "hagicode-desktop-0.1.6.tar.gz", + "path": "v0.1.6/hagicode-desktop-0.1.6.tar.gz", + "size": 171901250, + "lastModified": "2026-02-10T13:21:44.0000000" + }, + { + "name": "hagicode-desktop_0.1.6_amd64.deb", + "path": "v0.1.6/hagicode-desktop_0.1.6_amd64.deb", + "size": 117517600, + "lastModified": "2026-02-10T13:21:53.0000000" + } + ] + }, + { + "version": "v0.1.5", + "files": [ + { + "name": "Hagicode.Desktop-0.1.5-arm64-mac.zip", + "path": "v0.1.5/Hagicode.Desktop-0.1.5-arm64-mac.zip", + "size": 169573000, + "lastModified": "2026-02-10T01:55:51.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.5-arm64.dmg", + "path": "v0.1.5/Hagicode.Desktop-0.1.5-arm64.dmg", + "size": 177184332, + "lastModified": "2026-02-10T01:56:57.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.5-mac.zip", + "path": "v0.1.5/Hagicode.Desktop-0.1.5-mac.zip", + "size": 175026018, + "lastModified": "2026-02-10T01:59:07.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.5.AppImage", + "path": "v0.1.5/Hagicode.Desktop-0.1.5.AppImage", + "size": 183415071, + "lastModified": "2026-02-10T01:59:38.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.5.dmg", + "path": "v0.1.5/Hagicode.Desktop-0.1.5.dmg", + "size": 182674856, + "lastModified": "2026-02-10T02:00:04.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.5.appx", + "path": "v0.1.5/Hagicode.Desktop.0.1.5.appx", + "size": 211332709, + "lastModified": "2026-02-10T02:03:37.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.5.exe", + "path": "v0.1.5/Hagicode.Desktop.0.1.5.exe", + "size": 106650005, + "lastModified": "2026-02-10T02:05:00.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.5.exe", + "path": "v0.1.5/Hagicode.Desktop.Setup.0.1.5.exe", + "size": 106848938, + "lastModified": "2026-02-10T02:06:14.0000000" + }, + { + "name": "hagicode-desktop-0.1.5.tar.gz", + "path": "v0.1.5/hagicode-desktop-0.1.5.tar.gz", + "size": 171384559, + "lastModified": "2026-02-10T02:07:46.0000000" + }, + { + "name": "hagicode-desktop_0.1.5_amd64.deb", + "path": "v0.1.5/hagicode-desktop_0.1.5_amd64.deb", + "size": 117147644, + "lastModified": "2026-02-10T02:08:28.0000000" + } + ] + }, + { + "version": "v0.1.4", + "files": [ + { + "name": "Hagicode.Desktop-0.1.4-arm64-mac.zip", + "path": "v0.1.4/Hagicode.Desktop-0.1.4-arm64-mac.zip", + "size": 169552579, + "lastModified": "2026-02-09T05:52:37.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.4-arm64.dmg", + "path": "v0.1.4/Hagicode.Desktop-0.1.4-arm64.dmg", + "size": 177172358, + "lastModified": "2026-02-09T05:53:11.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.4-mac.zip", + "path": "v0.1.4/Hagicode.Desktop-0.1.4-mac.zip", + "size": 175005602, + "lastModified": "2026-02-09T05:53:25.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.4.AppImage", + "path": "v0.1.4/Hagicode.Desktop-0.1.4.AppImage", + "size": 183392705, + "lastModified": "2026-02-09T05:53:48.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.4.dmg", + "path": "v0.1.4/Hagicode.Desktop-0.1.4.dmg", + "size": 182658262, + "lastModified": "2026-02-09T05:54:55.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.4.appx", + "path": "v0.1.4/Hagicode.Desktop.0.1.4.appx", + "size": 211316058, + "lastModified": "2026-02-09T05:55:53.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.4.exe", + "path": "v0.1.4/Hagicode.Desktop.0.1.4.exe", + "size": 106632810, + "lastModified": "2026-02-09T05:56:05.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.4.exe", + "path": "v0.1.4/Hagicode.Desktop.Setup.0.1.4.exe", + "size": 106831741, + "lastModified": "2026-02-09T05:56:32.0000000" + }, + { + "name": "hagicode-desktop-0.1.4.tar.gz", + "path": "v0.1.4/hagicode-desktop-0.1.4.tar.gz", + "size": 171364758, + "lastModified": "2026-02-09T05:56:47.0000000" + }, + { + "name": "hagicode-desktop_0.1.4_amd64.deb", + "path": "v0.1.4/hagicode-desktop_0.1.4_amd64.deb", + "size": 117128468, + "lastModified": "2026-02-09T05:59:43.0000000" + } + ] + }, + { + "version": "v0.1.3", + "files": [ + { + "name": "Hagicode.Desktop-0.1.3-arm64-mac.zip", + "path": "v0.1.3/Hagicode.Desktop-0.1.3-arm64-mac.zip", + "size": 169552209, + "lastModified": "2026-02-09T02:10:30.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.3-arm64.dmg", + "path": "v0.1.3/Hagicode.Desktop-0.1.3-arm64.dmg", + "size": 177172483, + "lastModified": "2026-02-09T02:12:10.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.3-mac.zip", + "path": "v0.1.3/Hagicode.Desktop-0.1.3-mac.zip", + "size": 175005235, + "lastModified": "2026-02-09T02:14:09.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.3.AppImage", + "path": "v0.1.3/Hagicode.Desktop-0.1.3.AppImage", + "size": 183393029, + "lastModified": "2026-02-09T02:15:11.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.3.dmg", + "path": "v0.1.3/Hagicode.Desktop-0.1.3.dmg", + "size": 182658124, + "lastModified": "2026-02-09T02:16:30.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.3.appx", + "path": "v0.1.3/Hagicode.Desktop.0.1.3.appx", + "size": 211316260, + "lastModified": "2026-02-09T02:17:45.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.3.exe", + "path": "v0.1.3/Hagicode.Desktop.0.1.3.exe", + "size": 106634737, + "lastModified": "2026-02-09T02:17:57.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.3.exe", + "path": "v0.1.3/Hagicode.Desktop.Setup.0.1.3.exe", + "size": 106833663, + "lastModified": "2026-02-09T02:18:51.0000000" + } + ] + }, + { + "version": "v0.1.2", + "files": [ + { + "name": "Hagicode.Desktop-0.1.2-arm64-mac.zip", + "path": "v0.1.2/Hagicode.Desktop-0.1.2-arm64-mac.zip", + "size": 162579879, + "lastModified": "2026-02-08T15:37:56.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.2-arm64.dmg", + "path": "v0.1.2/Hagicode.Desktop-0.1.2-arm64.dmg", + "size": 170120413, + "lastModified": "2026-02-08T15:38:12.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.2-mac.zip", + "path": "v0.1.2/Hagicode.Desktop-0.1.2-mac.zip", + "size": 168032899, + "lastModified": "2026-02-08T15:39:12.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.2.AppImage", + "path": "v0.1.2/Hagicode.Desktop-0.1.2.AppImage", + "size": 176343947, + "lastModified": "2026-02-08T15:39:51.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.2.dmg", + "path": "v0.1.2/Hagicode.Desktop-0.1.2.dmg", + "size": 175610708, + "lastModified": "2026-02-08T15:40:03.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.2.appx", + "path": "v0.1.2/Hagicode.Desktop.0.1.2.appx", + "size": 204239264, + "lastModified": "2026-02-08T15:41:18.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.2.exe", + "path": "v0.1.2/Hagicode.Desktop.0.1.2.exe", + "size": 104001212, + "lastModified": "2026-02-08T15:41:46.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.2.exe", + "path": "v0.1.2/Hagicode.Desktop.Setup.0.1.2.exe", + "size": 104200135, + "lastModified": "2026-02-08T15:41:54.0000000" + }, + { + "name": "hagicode-desktop-0.1.2.tar.gz", + "path": "v0.1.2/hagicode-desktop-0.1.2.tar.gz", + "size": 164396699, + "lastModified": "2026-02-08T15:42:10.0000000" + }, + { + "name": "hagicode-desktop_0.1.2_amd64.deb", + "path": "v0.1.2/hagicode-desktop_0.1.2_amd64.deb", + "size": 114481460, + "lastModified": "2026-02-08T15:42:21.0000000" + } + ] + }, + { + "version": "v0.1.12", + "files": [ + { + "name": "Hagicode.Desktop-0.1.12-arm64-mac.zip", + "path": "v0.1.12/Hagicode.Desktop-0.1.12-arm64-mac.zip", + "size": 170349093, + "lastModified": "2026-02-16T10:09:04.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.12-arm64.dmg", + "path": "v0.1.12/Hagicode.Desktop-0.1.12-arm64.dmg", + "size": 178031336, + "lastModified": "2026-02-16T10:04:39.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.12-mac.zip", + "path": "v0.1.12/Hagicode.Desktop-0.1.12-mac.zip", + "size": 175794345, + "lastModified": "2026-02-16T10:10:12.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.12.AppImage", + "path": "v0.1.12/Hagicode.Desktop-0.1.12.AppImage", + "size": 184201931, + "lastModified": "2026-02-16T10:10:57.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.12.dmg", + "path": "v0.1.12/Hagicode.Desktop-0.1.12.dmg", + "size": 183473427, + "lastModified": "2026-02-16T10:08:14.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.12.appx", + "path": "v0.1.12/Hagicode.Desktop.0.1.12.appx", + "size": 212119074, + "lastModified": "2026-02-16T10:11:21.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.12.exe", + "path": "v0.1.12/Hagicode.Desktop.0.1.12.exe", + "size": 107055666, + "lastModified": "2026-02-16T10:08:26.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.12.exe", + "path": "v0.1.12/Hagicode.Desktop.Setup.0.1.12.exe", + "size": 107254615, + "lastModified": "2026-02-16T10:08:36.0000000" + }, + { + "name": "hagicode-desktop-0.1.12.tar.gz", + "path": "v0.1.12/hagicode-desktop-0.1.12.tar.gz", + "size": 172153799, + "lastModified": "2026-02-16T10:06:13.0000000" + }, + { + "name": "hagicode-desktop_0.1.12_amd64.deb", + "path": "v0.1.12/hagicode-desktop_0.1.12_amd64.deb", + "size": 117568176, + "lastModified": "2026-02-16T10:03:08.0000000" + } + ] + }, + { + "version": "v0.1.11-beta.1", + "files": [ + { + "name": "Hagicode.Desktop-0.1.11-beta.1-arm64-mac.zip", + "path": "v0.1.11-beta.1/Hagicode.Desktop-0.1.11-beta.1-arm64-mac.zip", + "size": 170041893, + "lastModified": "2026-02-15T10:50:39.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-beta.1-arm64.dmg", + "path": "v0.1.11-beta.1/Hagicode.Desktop-0.1.11-beta.1-arm64.dmg", + "size": 177664522, + "lastModified": "2026-02-15T10:51:48.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-beta.1-mac.zip", + "path": "v0.1.11-beta.1/Hagicode.Desktop-0.1.11-beta.1-mac.zip", + "size": 175491348, + "lastModified": "2026-02-15T10:45:38.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-beta.1.AppImage", + "path": "v0.1.11-beta.1/Hagicode.Desktop-0.1.11-beta.1.AppImage", + "size": 183906552, + "lastModified": "2026-02-15T10:48:51.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-beta.1.dmg", + "path": "v0.1.11-beta.1/Hagicode.Desktop-0.1.11-beta.1.dmg", + "size": 183151530, + "lastModified": "2026-02-15T10:46:59.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.11-beta.1.appx", + "path": "v0.1.11-beta.1/Hagicode.Desktop.0.1.11-beta.1.appx", + "size": 211823280, + "lastModified": "2026-02-15T10:49:35.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.11-beta.1.exe", + "path": "v0.1.11-beta.1/Hagicode.Desktop.0.1.11-beta.1.exe", + "size": 106940638, + "lastModified": "2026-02-15T10:43:42.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.11-beta.1.exe", + "path": "v0.1.11-beta.1/Hagicode.Desktop.Setup.0.1.11-beta.1.exe", + "size": 107139593, + "lastModified": "2026-02-15T10:49:00.0000000" + }, + { + "name": "hagicode-desktop-0.1.11-beta.1.tar.gz", + "path": "v0.1.11-beta.1/hagicode-desktop-0.1.11-beta.1.tar.gz", + "size": 171852599, + "lastModified": "2026-02-15T10:44:24.0000000" + }, + { + "name": "hagicode-desktop_0.1.11-beta.1_amd64.deb", + "path": "v0.1.11-beta.1/hagicode-desktop_0.1.11-beta.1_amd64.deb", + "size": 117424336, + "lastModified": "2026-02-15T10:51:06.0000000" + } + ] + }, + { + "version": "v0.1.11", + "files": [ + { + "name": "Hagicode.Desktop-0.1.11-arm64-mac.zip", + "path": "v0.1.11/Hagicode.Desktop-0.1.11-arm64-mac.zip", + "size": 170347208, + "lastModified": "2026-02-15T11:58:21.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-arm64.dmg", + "path": "v0.1.11/Hagicode.Desktop-0.1.11-arm64.dmg", + "size": 178032237, + "lastModified": "2026-02-15T11:55:36.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11-mac.zip", + "path": "v0.1.11/Hagicode.Desktop-0.1.11-mac.zip", + "size": 175792449, + "lastModified": "2026-02-15T11:55:07.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11.AppImage", + "path": "v0.1.11/Hagicode.Desktop-0.1.11.AppImage", + "size": 184193524, + "lastModified": "2026-02-15T11:55:52.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.11.dmg", + "path": "v0.1.11/Hagicode.Desktop-0.1.11.dmg", + "size": 183466887, + "lastModified": "2026-02-15T11:57:39.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.11.appx", + "path": "v0.1.11/Hagicode.Desktop.0.1.11.appx", + "size": 212112126, + "lastModified": "2026-02-15T11:54:25.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.11.exe", + "path": "v0.1.11/Hagicode.Desktop.0.1.11.exe", + "size": 107053093, + "lastModified": "2026-02-15T11:55:27.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.11.exe", + "path": "v0.1.11/Hagicode.Desktop.Setup.0.1.11.exe", + "size": 107252032, + "lastModified": "2026-02-15T11:58:42.0000000" + }, + { + "name": "hagicode-desktop-0.1.11.tar.gz", + "path": "v0.1.11/hagicode-desktop-0.1.11.tar.gz", + "size": 172151821, + "lastModified": "2026-02-15T11:56:14.0000000" + }, + { + "name": "hagicode-desktop_0.1.11_amd64.deb", + "path": "v0.1.11/hagicode-desktop_0.1.11_amd64.deb", + "size": 117566700, + "lastModified": "2026-02-15T11:56:49.0000000" + } + ] + }, + { + "version": "v0.1.10", + "files": [ + { + "name": "Hagicode.Desktop-0.1.10-arm64-mac.zip", + "path": "v0.1.10/Hagicode.Desktop-0.1.10-arm64-mac.zip", + "size": 170041588, + "lastModified": "2026-02-14T09:11:50.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.10-arm64.dmg", + "path": "v0.1.10/Hagicode.Desktop-0.1.10-arm64.dmg", + "size": 177668393, + "lastModified": "2026-02-14T09:12:49.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.10-mac.zip", + "path": "v0.1.10/Hagicode.Desktop-0.1.10-mac.zip", + "size": 175491042, + "lastModified": "2026-02-14T09:13:27.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.10.AppImage", + "path": "v0.1.10/Hagicode.Desktop-0.1.10.AppImage", + "size": 183906373, + "lastModified": "2026-02-14T09:13:42.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.10.dmg", + "path": "v0.1.10/Hagicode.Desktop-0.1.10.dmg", + "size": 183154128, + "lastModified": "2026-02-14T09:14:02.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.10.appx", + "path": "v0.1.10/Hagicode.Desktop.0.1.10.appx", + "size": 211821981, + "lastModified": "2026-02-14T09:14:37.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.10.exe", + "path": "v0.1.10/Hagicode.Desktop.0.1.10.exe", + "size": 106956175, + "lastModified": "2026-02-14T09:14:48.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.10.exe", + "path": "v0.1.10/Hagicode.Desktop.Setup.0.1.10.exe", + "size": 107155113, + "lastModified": "2026-02-14T09:14:57.0000000" + }, + { + "name": "hagicode-desktop-0.1.10.tar.gz", + "path": "v0.1.10/hagicode-desktop-0.1.10.tar.gz", + "size": 171851051, + "lastModified": "2026-02-14T09:15:56.0000000" + }, + { + "name": "hagicode-desktop_0.1.10_amd64.deb", + "path": "v0.1.10/hagicode-desktop_0.1.10_amd64.deb", + "size": 117424180, + "lastModified": "2026-02-14T09:16:11.0000000" + } + ] + }, + { + "version": "v0.1.1", + "files": [ + { + "name": "Hagicode.Desktop-0.1.1-arm64-mac.zip", + "path": "v0.1.1/Hagicode.Desktop-0.1.1-arm64-mac.zip", + "size": 162545310, + "lastModified": "2026-02-07T11:39:04.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.1-arm64.dmg", + "path": "v0.1.1/Hagicode.Desktop-0.1.1-arm64.dmg", + "size": 170092225, + "lastModified": "2026-02-07T11:40:53.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.1-mac.zip", + "path": "v0.1.1/Hagicode.Desktop-0.1.1-mac.zip", + "size": 167998328, + "lastModified": "2026-02-07T11:43:45.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.1.AppImage", + "path": "v0.1.1/Hagicode.Desktop-0.1.1.AppImage", + "size": 176282807, + "lastModified": "2026-02-07T11:44:01.0000000" + }, + { + "name": "Hagicode.Desktop-0.1.1.dmg", + "path": "v0.1.1/Hagicode.Desktop-0.1.1.dmg", + "size": 175587483, + "lastModified": "2026-02-07T11:47:29.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.1.appx", + "path": "v0.1.1/Hagicode.Desktop.0.1.1.appx", + "size": 204191260, + "lastModified": "2026-02-07T11:48:27.0000000" + }, + { + "name": "Hagicode.Desktop.0.1.1.exe", + "path": "v0.1.1/Hagicode.Desktop.0.1.1.exe", + "size": 103976995, + "lastModified": "2026-02-07T11:48:37.0000000" + }, + { + "name": "Hagicode.Desktop.Setup.0.1.1.exe", + "path": "v0.1.1/Hagicode.Desktop.Setup.0.1.1.exe", + "size": 104175915, + "lastModified": "2026-02-07T11:49:23.0000000" + }, + { + "name": "hagicode-desktop-0.1.1.tar.gz", + "path": "v0.1.1/hagicode-desktop-0.1.1.tar.gz", + "size": 164362850, + "lastModified": "2026-02-07T11:49:39.0000000" + }, + { + "name": "hagicode-desktop_0.1.1_amd64.deb", + "path": "v0.1.1/hagicode-desktop_0.1.1_amd64.deb", + "size": 114449768, + "lastModified": "2026-02-07T11:49:52.0000000" + } + ] + } + ], + "channels": { + "stable": { + "latest": "v0.1.12", + "versions": [ + "v0.1.9", + "v0.1.8", + "v0.1.7", + "v0.1.6", + "v0.1.5", + "v0.1.4", + "v0.1.3", + "v0.1.2", + "v0.1.12", + "v0.1.11", + "v0.1.10", + "v0.1.1" + ] + }, + "beta": { + "latest": "v0.1.11-beta.1", + "versions": [ + "v0.1.11-beta.1" + ] + } + } +} \ No newline at end of file diff --git a/redirects.json b/redirects.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{} diff --git a/scripts/version-monitor.js b/scripts/version-monitor.js new file mode 100644 index 0000000..1f97945 --- /dev/null +++ b/scripts/version-monitor.js @@ -0,0 +1,458 @@ +#!/usr/bin/env node + +/** + * Version Monitor Script for Docs Repository + * + * This script monitors the version from the official website URL and updates + * the local version index file for the documentation site. + * Pull Request creation is handled by the workflow. + * + * Multi-Channel Support: + * - Supports channels field (stable/beta) in version data + * - Prioritizes stable channel by default + * - Can be configured to monitor beta channel via PREFERRED_CHANNEL env var + * - Automatically detects version channel from version string (beta/alpha/rc indicators) + * + * Updates the following file: + * - public/version-index.json + * + * Environment Variables: + * - VERSION_SOURCE_URL: URL to fetch version data (default: https://desktop.dl.hagicode.com/index.json) + * - REQUEST_TIMEOUT: HTTP request timeout in milliseconds (default: 30000) + * - MAX_RETRIES: Maximum number of retry attempts (default: 3) + * - PREFERRED_CHANNEL: Preferred channel to monitor ('stable' or 'beta', default: 'stable') + * + * GitHub Outputs: + * - update_needed: Set to 'true' when version changes + * - new_version: The new version string + * - version_channel: The channel of the new version ('stable' or 'beta') + * - version_source: The source of the version data (e.g., 'channels.stable.latest') + */ + +import { promises as fs } from 'fs'; + +// Logger with levels +const logger = { + debug: (msg) => console.log(`[DEBUG] ${msg}`), + info: (msg) => console.log(`[INFO] ${msg}`), + warn: (msg) => console.log(`[WARN] ${msg}`), + error: (msg) => console.log(`[ERROR] ${msg}`) +}; + +// Configuration from environment variables +const config = { + sourceUrl: process.env.VERSION_SOURCE_URL || 'https://desktop.dl.hagicode.com/index.json', + timeout: parseInt(process.env.REQUEST_TIMEOUT || '30000', 10), + maxRetries: parseInt(process.env.MAX_RETRIES || '3', 10), + retryDelay: 1000 // Base retry delay in milliseconds +}; + +// Local version data file path +const VERSION_INDEX_FILE = 'public/version-index.json'; + +/** + * Sleep utility for retry delays + */ +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +/** + * Fetch with retry mechanism using exponential backoff + */ +async function fetchWithRetry(url, options = {}, maxRetries = config.maxRetries) { + const { timeout = config.timeout, ...fetchOptions } = options; + + for (let i = 0; i < maxRetries; i++) { + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeout); + + const response = await fetch(url, { + ...fetchOptions, + signal: controller.signal + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + return response; + } catch (error) { + if (error.name === 'AbortError') { + logger.warn(`Request timeout (${timeout}ms), attempt ${i + 1}/${maxRetries}`); + } else { + logger.warn(`Request failed: ${error.message}, attempt ${i + 1}/${maxRetries}`); + } + + if (i === maxRetries - 1) { + throw error; + } + + const waitTime = Math.pow(2, i) * config.retryDelay; + logger.debug(`Waiting ${waitTime}ms before retry...`); + await sleep(waitTime); + } + } +} + +/** + * Fetch current version from the official website URL + */ +async function fetchCurrentVersion(url, preferredChannel = 'stable') { + const targetUrl = url || config.sourceUrl; + logger.info(`Fetching version from: ${targetUrl} (preferred channel: ${preferredChannel})`); + + try { + const response = await fetchWithRetry(targetUrl, { + headers: { + 'User-Agent': 'Version-Monitor/1.0' + } + }); + + const data = await response.json(); + + if (!data || typeof data !== 'object') { + throw new Error('Invalid response: not an object'); + } + + let versionInfo; + + if (data.version) { + const isBeta = data.version.includes('beta') || data.version.includes('alpha') || data.version.includes('rc'); + versionInfo = { + version: data.version, + channel: isBeta ? 'beta' : 'stable', + source: 'direct version field' + }; + } else { + versionInfo = extractVersionFromData(data, preferredChannel); + } + + if (!versionInfo.version) { + throw new Error('No version found in response data'); + } + + logger.info(`Current version from source: ${versionInfo.version} (channel: ${versionInfo.channel}, source: ${versionInfo.source})`); + return { ...versionInfo, raw: data }; + } catch (error) { + logger.error(`Failed to fetch version data: ${error.message}`); + throw error; + } +} + +/** + * Extract version from various data structures + */ +function extractVersionFromData(data, preferredChannel = 'stable') { + // Common patterns for version data (legacy support) + if (data.latestVersion) return { version: data.latestVersion, channel: 'stable', source: 'latestVersion' }; + if (data.currentVersion) return { version: data.currentVersion, channel: 'stable', source: 'currentVersion' }; + if (data.release && data.release.version) return { version: data.release.version, channel: 'stable', source: 'release.version' }; + + // Check for channels field (new multi-channel format) + if (data.channels) { + logger.info(`Found channels field in data`); + + if (data.channels[preferredChannel] && data.channels[preferredChannel].latest) { + const version = data.channels[preferredChannel].latest; + logger.info(`Using ${preferredChannel} channel latest: ${version}`); + return { version, channel: preferredChannel, source: `channels.${preferredChannel}.latest` }; + } + + if (preferredChannel !== 'stable' && data.channels.stable && data.channels.stable.latest) { + const version = data.channels.stable.latest; + logger.info(`Preferred channel not available, using stable channel: ${version}`); + return { version, channel: 'stable', source: 'channels.stable.latest (fallback)' }; + } + + if (data.channels.beta && data.channels.beta.latest) { + const version = data.channels.beta.latest; + logger.info(`Only beta channel available: ${version}`); + return { version, channel: 'beta', source: 'channels.beta.latest (fallback)' }; + } + } + + // For versions array, find the latest version + if (Array.isArray(data.versions) && data.versions.length > 0) { + logger.info(`Found ${data.versions.length} versions in array`); + + let latestVersion = data.versions[0]; + let latestVersionObj = data.versions[0]; + + for (const versionObj of data.versions) { + const v1 = versionObj.version || versionObj; + const v2 = latestVersionObj.version || latestVersionObj; + + const comparison = compareVersions(v1, v2); + + if (comparison === 1) { + latestVersion = v1; + latestVersionObj = versionObj; + } + } + + const isBeta = latestVersion.includes('beta') || latestVersion.includes('alpha') || latestVersion.includes('rc'); + + logger.info(`Latest version from array: ${latestVersion} (${isBeta ? 'beta' : 'stable'})`); + return { version: latestVersion, channel: isBeta ? 'beta' : 'stable', source: 'versions array (auto-detected)' }; + } + + logger.warn('No version found in data'); + return { version: null, channel: null, source: null }; +} + +/** + * Load local version from version-index.json + */ +async function loadLocalVersion() { + try { + const content = await fs.readFile(VERSION_INDEX_FILE, 'utf-8'); + const data = JSON.parse(content); + + // Check for channels field first (new format) + if (data.channels && data.channels.stable && data.channels.stable.latest) { + logger.info('Found channels field in local file'); + const version = data.channels.stable.latest; + logger.info(`Local version (from stable channel): ${version}`); + return { version, channel: 'stable', source: 'local channels.stable.latest' }; + } + + if (Array.isArray(data.versions) && data.versions.length > 0) { + if (data.versions.length === 1) { + const localVersion = data.versions[0].version; + logger.info(`Local version (only one): ${localVersion}`); + return { version: localVersion, channel: 'stable', source: 'local single version' }; + } + + logger.info(`Found ${data.versions.length} versions in local file`); + + let latestVersion = data.versions[0].version; + let latestVersionObj = data.versions[0]; + + for (const versionObj of data.versions) { + const v1 = versionObj.version; + const v2 = latestVersionObj.version; + + const comparison = compareVersions(v1, v2); + + if (comparison === 1) { + latestVersion = v1; + latestVersionObj = versionObj; + } + } + + const isBeta = latestVersion.includes('beta') || latestVersion.includes('alpha') || latestVersion.includes('rc'); + + logger.info(`Latest version from local file: ${latestVersion} (${isBeta ? 'beta' : 'stable'})`); + return { version: latestVersion, channel: isBeta ? 'beta' : 'stable', source: 'local versions array' }; + } + + logger.warn('Local version file exists but contains no versions'); + return null; + } catch (error) { + if (error.code === 'ENOENT') { + logger.info('Local version file not found, treating as empty state'); + return null; + } + logger.error(`Failed to load local version: ${error.message}`); + return null; + } +} + +/** + * Update local version index file + */ +async function updateLocalVersionIndex(versionData) { + const content = JSON.stringify(versionData, null, 2); + + try { + // Ensure directory exists + const dirPath = 'public'; + await fs.mkdir(dirPath, { recursive: true }); + + // Write file + await fs.writeFile(VERSION_INDEX_FILE, content, 'utf-8'); + logger.info(`Version index updated: ${VERSION_INDEX_FILE}`); + } catch (error) { + logger.error(`Failed to update version index file: ${error.message}`); + throw error; + } +} + +/** + * Parse a semver version string + */ +function parseSemver(version) { + const v = version.replace(/^v/, ''); + const versionParts = v.split('-'); + const versionNumbers = versionParts[0].split('.'); + + const major = parseInt(versionNumbers[0], 10) || 0; + const minor = parseInt(versionNumbers[1] || '0', 10) || 0; + const patch = parseInt(versionNumbers[2] || '0', 10) || 0; + + let prerelease = []; + if (versionParts.length > 1) { + prerelease = versionParts.slice(1).join('-').split('.').map(id => { + const num = parseInt(id, 10); + return isNaN(num) ? id : num; + }); + } + + return { major, minor, patch, prerelease }; +} + +/** + * Pre-release identifier priority + */ +const PRERELEASE_PRIORITY = { + 'alpha': 1, + 'beta': 2, + 'preview': 3, + 'rc': 4, + 'pre': 1 +}; + +/** + * Compare two pre-release identifier arrays + */ +function comparePrerelease(a, b) { + if (a.length === 0 && b.length === 0) return 0; + if (a.length === 0) return 1; + if (b.length === 0) return -1; + + const maxLength = Math.max(a.length, b.length); + for (let i = 0; i < maxLength; i++) { + const idA = a[i] === undefined ? null : a[i]; + const idB = b[i] === undefined ? null : b[i]; + + if (idA === null && idB === null) return 0; + if (idA === null) return -1; + if (idB === null) return 1; + + if (typeof idA === 'number' && typeof idB === 'number') { + if (idA < idB) return -1; + if (idA > idB) return 1; + } else if (typeof idA === 'string' && typeof idB === 'string') { + const priorityA = PRERELEASE_PRIORITY[idA] ?? 999; + const priorityB = PRERELEASE_PRIORITY[idB] ?? 999; + + if (priorityA !== 999 && priorityB !== 999) { + if (priorityA < priorityB) return -1; + if (priorityA > priorityB) return 1; + } else if (priorityA !== 999) { + return -1; + } else if (priorityB !== 999) { + return 1; + } else { + const cmp = idA.localeCompare(idB); + if (cmp !== 0) return cmp < 0 ? -1 : 1; + } + } else if (typeof idA === 'number') { + return -1; + } else { + return 1; + } + } + + return 0; +} + +/** + * Compare two version strings + */ +function compareVersions(v1, v2) { + const semver1 = parseSemver(v1); + const semver2 = parseSemver(v2); + + if (semver1.major !== semver2.major) { + return semver1.major < semver2.major ? -1 : 1; + } + if (semver1.minor !== semver2.minor) { + return semver1.minor < semver2.minor ? -1 : 1; + } + if (semver1.patch !== semver2.patch) { + return semver1.patch < semver2.patch ? -1 : 1; + } + + return comparePrerelease(semver1.prerelease, semver2.prerelease); +} + +/** + * Main execution function + */ +async function main() { + try { + logger.info('Starting version monitor...'); + logger.debug(`Configuration: ${JSON.stringify({ + sourceUrl: config.sourceUrl, + timeout: config.timeout, + maxRetries: config.maxRetries + })}`); + + const preferredChannel = process.env.PREFERRED_CHANNEL || 'stable'; + logger.info(`Preferred channel: ${preferredChannel}`); + + const { version: currentVersion, channel: currentChannel, source: currentSource, raw: versionData } = await fetchCurrentVersion(null, preferredChannel); + + const localInfo = await loadLocalVersion(); + const localVersion = localInfo?.version; + const localChannel = localInfo?.channel; + + const hasEmptyState = !localVersion; + + if (!hasEmptyState) { + logger.info('='.repeat(60)); + logger.info('VERSION COMPARISON START'); + logger.info('='.repeat(60)); + logger.info(`Local version: "${localVersion}" (channel: ${localChannel || 'unknown'}, source: ${localInfo?.source || 'unknown'})`); + logger.info(`Current version: "${currentVersion}" (channel: ${currentChannel}, source: ${currentSource})`); + logger.info('-'.repeat(60)); + + const versionComparison = compareVersions(currentVersion, localVersion); + + logger.info('-'.repeat(60)); + if (versionComparison === 0) { + logger.info('✅ Version unchanged - no update needed'); + logger.info('='.repeat(60)); + return; + } + + const comparisonSymbol = versionComparison === -1 ? '<' : '>'; + logger.info(`📊 Version comparison result: "${currentVersion}" ${comparisonSymbol} "${localVersion}"`); + logger.info(`🔄 Version changed: ${localVersion} -> ${currentVersion}`); + logger.info(`📡 Channel info: ${localChannel || 'unknown'} -> ${currentChannel}`); + logger.info('='.repeat(60)); + } else { + logger.info('Empty state detected - treating as new version scenario'); + logger.info(`📡 Current channel: ${currentChannel}`); + } + + await updateLocalVersionIndex(versionData); + + if (process.env.GITHUB_OUTPUT) { + const outputs = [ + `update_needed=true`, + `new_version=${currentVersion}`, + `version_channel=${currentChannel}`, + `version_source=${currentSource}` + ]; + await fs.appendFile(process.env.GITHUB_OUTPUT, outputs.join('\n') + '\n'); + logger.info(`Set outputs: update_needed=true, new_version=${currentVersion}, version_channel=${currentChannel}, version_source=${currentSource}`); + } + + logger.info('Version monitor completed successfully - version index updated'); + + } catch (error) { + logger.error(`Version monitor failed: ${error.message}`); + throw error; + } +} + +main().catch(error => { + logger.error(`Fatal error: ${error.message}`); + process.exit(1); +}); diff --git a/shared/package.json b/shared/package.json new file mode 100644 index 0000000..1bc5d89 --- /dev/null +++ b/shared/package.json @@ -0,0 +1,11 @@ +{ + "name": "shared", + "version": "0.0.1", + "private": true, + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts" + } +} diff --git a/shared/src/desktop-context.tsx b/shared/src/desktop-context.tsx new file mode 100644 index 0000000..20c1845 --- /dev/null +++ b/shared/src/desktop-context.tsx @@ -0,0 +1,224 @@ +/** + * Desktop 版本数据的 React Context + * + * 提供 React Context 和 Hook 用于在组件树中共享版本数据 + * 这是可选的功能,用于需要 React 状态管理的场景 + */ + +import React, { createContext, useContext, useEffect, useState } from 'react'; +import type { + DesktopVersion, + PlatformGroup, + DesktopIndexResponse, +} from './types/desktop'; +import type { DesktopVersionData } from './version-manager'; +import { + setDesktopServerData, + getDesktopVersionData, + isDesktopVersionInitialized, +} from './version-manager'; + +/** + * Context 数据接口 + */ +interface DesktopVersionContextValue { + /** 最新版本 */ + latest: DesktopVersion | null; + /** 平台分组 */ + platforms: PlatformGroup[]; + /** 错误信息 */ + error: string | null; + /** 是否正在加载 */ + loading: boolean; + /** 稳定版数据 */ + stable: { + latest: DesktopVersion | null; + all: DesktopVersion[]; + }; + /** 测试版数据 */ + beta: { + latest: DesktopVersion | null; + all: DesktopVersion[]; + }; +} + +/** + * Context 默认值 + */ +const defaultValue: DesktopVersionContextValue = { + latest: null, + platforms: [], + error: null, + loading: true, + stable: { latest: null, all: [] }, + beta: { latest: null, all: [] }, +}; + +/** + * Desktop 版本 Context + */ +export const DesktopVersionContext = createContext( + defaultValue +); + +/** + * Provider Props + */ +export interface DesktopVersionProviderProps { + /** 子组件 */ + children: React.ReactNode; + /** 渠道选择(可选) */ + channel?: 'stable' | 'beta'; + /** 服务端数据(用于 SSR) */ + serverData?: DesktopIndexResponse; +} + +/** + * Desktop 版本数据 Provider + * + * 使用示例: + * ```tsx + * // 客户端模式 + * + * + * + * + * // 服务端模式 + * + * + * + * + * // 指定渠道 + * + * + * + * ``` + */ +export const DesktopVersionProvider: React.FC = ({ + children, + channel, + serverData, +}) => { + const [data, setData] = useState(defaultValue); + + useEffect(() => { + let isMounted = true; + + const loadData = async () => { + // 如果有服务端数据,先注入 + if (serverData) { + setDesktopServerData(serverData); + } + + try { + const versionData = await getDesktopVersionData(); + + if (!isMounted) return; + + setData({ + latest: versionData.latest, + platforms: versionData.platforms, + error: versionData.error, + loading: false, + stable: { + latest: versionData.channels.stable.latest, + all: versionData.channels.stable.all, + }, + beta: { + latest: versionData.channels.beta.latest, + all: versionData.channels.beta.all, + }, + }); + } catch (error) { + if (!isMounted) return; + + setData({ + latest: null, + platforms: [], + error: error instanceof Error ? error.message : 'Unknown error', + loading: false, + stable: { latest: null, all: [] }, + beta: { latest: null, all: [] }, + }); + } + }; + + // 如果已经初始化且有服务端数据,直接使用 + if (isDesktopVersionInitialized() && !serverData) { + getDesktopVersionData().then((versionData) => { + if (isMounted) { + setData({ + latest: versionData.latest, + platforms: versionData.platforms, + error: versionData.error, + loading: false, + stable: { + latest: versionData.channels.stable.latest, + all: versionData.channels.stable.all, + }, + beta: { + latest: versionData.channels.beta.latest, + all: versionData.channels.beta.all, + }, + }); + } + }); + } else { + loadData(); + } + + return () => { + isMounted = false; + }; + }, [serverData]); + + const contextValue: DesktopVersionContextValue = { + ...data, + // 如果指定了渠道,优先返回该渠道的数据 + ...(channel && { + latest: data[channel].latest || data.latest, + platforms: data.platforms, + }), + }; + + return ( + + {children} + + ); +}; + +/** + * 使用 Desktop 版本数据的 Hook + * + * 使用示例: + * ```tsx + * function MyComponent() { + * const { latest, platforms, loading, error } = useDesktopVersion(); + * + * if (loading) return
Loading...
; + * if (error) return
Error: {error}
; + * + * return ( + *
+ *

Latest: {latest?.version}

+ * {platforms.map(p => ( + *
{p.platform}
+ * ))} + *
+ * ); + * } + * ``` + */ +export const useDesktopVersion = (): DesktopVersionContextValue => { + const context = useContext(DesktopVersionContext); + + if (context === defaultValue) { + console.warn( + 'useDesktopVersion used outside of DesktopVersionProvider, ' + + 'data will be fetched but not shared across components' + ); + } + + return context; +}; diff --git a/shared/src/desktop-utils.ts b/shared/src/desktop-utils.ts new file mode 100644 index 0000000..59a2def --- /dev/null +++ b/shared/src/desktop-utils.ts @@ -0,0 +1,456 @@ +/** + * Hagicode Desktop 工具函数 + * 用于获取和处理版本数据 + */ + +import type { + DesktopAsset, + DesktopIndexResponse, + PlatformDownload, + PlatformGroup, + DesktopVersion, +} from './types/desktop'; +import { AssetType } from './types/desktop'; +import semver from 'semver'; + +const INDEX_JSON_URL = "https://desktop.dl.hagicode.com/index.json"; +const LOCAL_VERSION_INDEX = "/version-index.json"; +const DOWNLOAD_BASE_URL = "https://desktop.dl.hagicode.com/"; +const TIMEOUT_MS = 30000; + +/** + * 平台推荐配置 + */ +export const PLATFORM_RECOMMENDATIONS: Record< + "windows" | "macos" | "linux", + { recommendedType: AssetType; label: string; icon: string } +> = { + windows: { + recommendedType: AssetType.WindowsSetup, + label: "Windows", + icon: "seti:windows", + }, + macos: { + recommendedType: AssetType.MacOSApple, + label: "macOS", + icon: "seti:apple", + }, + linux: { + recommendedType: AssetType.LinuxAppImage, + label: "Linux", + icon: "seti:linux", + }, +}; + +/** + * 比较两个版本字符串 + * @param v1 - 第一个版本 + * @param v2 - 第二个版本 + * @returns -1 如果 v1 < v2, 0 如果 v1 = v2, 1 如果 v1 > v2 + */ +function compareVersions(v1: string, v2: string): number { + const cleaned1 = v1.replace(/^v/, ''); + const cleaned2 = v2.replace(/^v/, ''); + + const cmp = semver.compare(cleaned1, cleaned2); + // semver.compare 返回:负数如果 a < b, 0 如果相等, 正数如果 a > b + if (cmp < 0) return -1; + if (cmp > 0) return 1; + return 0; +} + +/** + * 从文件名推断资源类型 + * @param filename - 文件名 + * @returns 资源类型枚举值 + */ +export function inferAssetType(filename: string): AssetType { + const name = filename.toLowerCase(); + + // Windows + if (name.includes("setup") && name.endsWith(".exe")) { + return AssetType.WindowsSetup; + } + if (name.endsWith(".exe")) { + return AssetType.WindowsPortable; + } + if (name.endsWith(".appx")) { + return AssetType.WindowsStore; + } + + // macOS + if (name.includes("arm64") && name.endsWith(".dmg")) { + return AssetType.MacOSApple; + } + if (name.includes("arm64-mac.zip")) { + return AssetType.MacOSApple; + } + if (name.endsWith(".dmg")) { + return AssetType.MacOSIntel; + } + if (name.includes("-mac.zip")) { + return AssetType.MacOSIntel; + } + + // Linux + if (name.endsWith(".appimage")) { + return AssetType.LinuxAppImage; + } + if (name.includes("_amd64.deb")) { + return AssetType.LinuxDeb; + } + if (name.includes(".tar.gz")) { + return AssetType.LinuxTarball; + } + + return AssetType.Unknown; +} + +/** + * 格式化文件大小 + * @param bytes - 文件大小(字节) + * @returns 格式化后的文件大小字符串 + */ +export function formatFileSize(bytes: number): string { + const gb = bytes / (1024 * 1024 * 1024); + if (gb >= 1) { + return `${gb.toFixed(1)} GB`; + } + const mb = bytes / (1024 * 1024); + return `${mb.toFixed(0)} MB`; +} + +/** + * 平台图标常量(用于 UI 显示) + */ +export const PLATFORM_ICONS: Record = { + macos: '🍎', + windows: '🪟', + linux: '🐧', +}; + +/** + * 获取资源类型的架构标签 + * @param assetType - 资源类型枚举值 + * @returns 架构标签(如 ARM64、x64) + */ +export function getArchitectureLabel(assetType: AssetType): string { + const archLabels: Record = { + [AssetType.MacOSApple]: 'ARM64', + [AssetType.MacOSIntel]: 'x64', + [AssetType.WindowsSetup]: 'x64', + [AssetType.WindowsPortable]: 'x64', + [AssetType.WindowsStore]: '', + [AssetType.LinuxAppImage]: '通用', + [AssetType.LinuxDeb]: 'amd64', + [AssetType.LinuxTarball]: '通用', + [AssetType.Source]: '', + [AssetType.Unknown]: '', + }; + return archLabels[assetType] || ''; +} + +/** + * 获取资源类型的文件扩展名 + * @param assetType - 资源类型枚举值 + * @returns 文件扩展名(包含点号,如 .exe、.dmg) + */ +export function getFileExtension(assetType: AssetType): string { + const extensions: Record = { + [AssetType.WindowsSetup]: '.exe', + [AssetType.WindowsPortable]: '.exe', + [AssetType.WindowsStore]: '.appx', + [AssetType.MacOSApple]: '.dmg', + [AssetType.MacOSIntel]: '.dmg', + [AssetType.LinuxAppImage]: '.AppImage', + [AssetType.LinuxDeb]: '.deb', + [AssetType.LinuxTarball]: '.tar.gz', + [AssetType.Source]: '.zip', + [AssetType.Unknown]: '', + }; + return extensions[assetType] || ''; +} + +/** + * 获取资源类型的显示名称 + * @param assetType - 资源类型枚举值 + * @returns 显示名称 + */ +export function getAssetTypeLabel(assetType: AssetType): string { + const labels: Record = { + [AssetType.WindowsSetup]: "安装程序", + [AssetType.WindowsPortable]: "便携版", + [AssetType.WindowsStore]: "Microsoft Store", + [AssetType.MacOSApple]: "Apple Silicon", + [AssetType.MacOSIntel]: "Intel 版", + [AssetType.LinuxAppImage]: "AppImage", + [AssetType.LinuxDeb]: "Debian 包", + [AssetType.LinuxTarball]: "压缩包", + [AssetType.Source]: "源代码", + [AssetType.Unknown]: "其他", + }; + return labels[assetType] || "未知"; +} + +/** + * 获取版本数据 + * 优先使用本地文件,确保构建过程不依赖外部服务 + * 返回的版本数组已按版本号从高到低排序 + * @returns 版本数据响应 + * @throws 当请求失败或超时时抛出错误,或在非浏览器环境调用时抛出错误 + */ +export async function fetchDesktopVersions(): Promise { + // 检查是否在浏览器环境中 + const isBrowser = typeof window !== 'undefined' && typeof fetch !== 'undefined'; + + if (!isBrowser) { + // 在 SSR/构建环境中,抛出错误而不是返回空数据 + // 这样可以避免水合不匹配的问题 + throw new Error("fetchDesktopVersions cannot be called in SSR environment"); + } + + // Try to load from local file first + try { + const response = await fetch(LOCAL_VERSION_INDEX); + if (response.ok) { + const data: DesktopIndexResponse = await response.json(); + + // 验证数据结构 + if (!Array.isArray(data.versions)) { + throw new Error("Invalid data structure: missing versions array"); + } + + // 按版本号排序(从高到低) + data.versions.sort((a, b) => compareVersions(b.version, a.version)); + + return data; + } + } catch (error) { + // Local file not available, fall back to online API + console.warn("Local version index not available, falling back to online API"); + } + + // Fallback to online API + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS); + + try { + const response = await fetch(INDEX_JSON_URL, { + signal: controller.signal, + }); + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data: DesktopIndexResponse = await response.json(); + + // 验证数据结构 + if (!Array.isArray(data.versions)) { + throw new Error("Invalid data structure: missing versions array"); + } + + // 按版本号排序(从高到低) + data.versions.sort((a, b) => compareVersions(b.version, a.version)); + + return data; + } catch (error) { + if (error instanceof Error && error.name === "AbortError") { + throw new Error("Request timeout: failed to fetch version data"); + } + throw error; + } +} + +/** + * 获取指定渠道的最新版本 + * @param channel - 渠道名称 ('stable' | 'beta') + * @returns 该渠道的最新 DesktopVersion 对象 + * @throws 当渠道数据不存在或版本未找到时抛出错误 + */ +export async function getChannelLatestVersion( + channel: 'stable' | 'beta' +): Promise { + const data = await fetchDesktopVersions(); + + // 检查 channels 字段是否存在 + if (!data.channels || !data.channels[channel]) { + throw new Error(`Channel '${channel}' not available in version data`); + } + + const channelInfo = data.channels[channel]; + const latestVersion = channelInfo.latest; + + // 在 versions 数组中查找对应的版本对象 + const latestVersionObj = data.versions.find(v => v.version === latestVersion); + + if (!latestVersionObj) { + throw new Error(`Version '${latestVersion}' not found in versions array for channel '${channel}'`); + } + + return latestVersionObj; +} + +/** + * 获取指定渠道的所有版本 + * @param channel - 渠道名称 ('stable' | 'beta') + * @returns 该渠道的 DesktopVersion 对象数组 + * @throws 当渠道数据不存在时抛出错误 + */ +export async function getAllChannelVersions( + channel: 'stable' | 'beta' +): Promise { + const data = await fetchDesktopVersions(); + + // 检查 channels 字段是否存在 + if (!data.channels || !data.channels[channel]) { + throw new Error(`Channel '${channel}' not available in version data`); + } + + const channelInfo = data.channels[channel]; + const channelVersions = channelInfo.versions; + + // 在 versions 数组中查找对应的版本对象 + const versionObjects = data.versions.filter(v => + channelVersions.includes(v.version) + ); + + // 按版本号排序(从高到低) + versionObjects.sort((a, b) => compareVersions(b.version, a.version)); + + return versionObjects; +} + +/** + * 将资源按平台分组 + * @param assets - 文件资源数组 + * @returns 按平台分组的资源 + */ +export function groupAssetsByPlatform( + assets: DesktopAsset[] | undefined +): PlatformGroup[] { + if (!assets || !Array.isArray(assets)) { + return []; + } + + const platformGroups = new Map(); + + for (const asset of assets) { + const assetType = inferAssetType(asset.name); + if (assetType === AssetType.Unknown) { + continue; + } + + let platform: "windows" | "macos" | "linux" | null = null; + switch (assetType) { + case AssetType.WindowsSetup: + case AssetType.WindowsPortable: + case AssetType.WindowsStore: + platform = "windows"; + break; + case AssetType.MacOSApple: + case AssetType.MacOSIntel: + platform = "macos"; + break; + case AssetType.LinuxAppImage: + case AssetType.LinuxDeb: + case AssetType.LinuxTarball: + platform = "linux"; + break; + default: + continue; + } + + if (!platform) continue; + + if (!platformGroups.has(platform)) { + platformGroups.set(platform, []); + } + + platformGroups.get(platform)!.push({ + url: `${DOWNLOAD_BASE_URL}${asset.path}`, + size: formatFileSize(asset.size), + filename: asset.name, + assetType, + }); + } + + // 转换为数组并按推荐类型排序 + const result: PlatformGroup[] = []; + for (const [platform, downloads] of platformGroups.entries()) { + const recommendation = PLATFORM_RECOMMENDATIONS[ + platform as "windows" | "macos" | "linux" + ]; + + // 将推荐类型排在前面 + downloads.sort((a, b) => { + if (a.assetType === recommendation.recommendedType) return -1; + if (b.assetType === recommendation.recommendedType) return 1; + return 0; + }); + + result.push({ + platform: platform as "windows" | "macos" | "linux", + downloads, + }); + } + + return result; +} + +/** + * 获取平台的推荐下载项 + * @param platform - 平台名称 + * @param downloads - 下载资源列表 + * @returns 推荐的下载项,如果没有则返回第一个 + */ +export function getRecommendedDownload( + platform: "windows" | "macos" | "linux", + downloads: PlatformDownload[] +): PlatformDownload | null { + const recommendation = PLATFORM_RECOMMENDATIONS[platform]; + const recommended = downloads.find( + (d) => d.assetType === recommendation.recommendedType + ); + return recommended || downloads[0] || null; +} + +/** + * 检测用户操作系统 + * 支持查询字符串覆盖 ?os=windows|macos|linux + * @returns 检测到的操作系统 + */ +export function detectOS(): "windows" | "macos" | "linux" | "unknown" { + // 优先检查 URL 查询参数 + if (typeof window !== "undefined") { + const urlParams = new URLSearchParams(window.location.search); + const osParam = urlParams.get("os"); + if (osParam) { + const validOS = ["windows", "macos", "linux"]; + const normalizedParam = osParam.toLowerCase(); + if (validOS.includes(normalizedParam)) { + return normalizedParam as "windows" | "macos" | "linux"; + } + } + + // 基于 UserAgent 检测 + const userAgent = navigator.userAgent; + if (userAgent.includes("Windows")) { + return "windows"; + } + if ( + userAgent.includes("Mac") || + userAgent.includes("iPhone") || + userAgent.includes("iPad") || + userAgent.includes("Mac OS") + ) { + return "macos"; + } + if (userAgent.includes("Linux")) { + return "linux"; + } + } + + return "unknown"; +} diff --git a/shared/src/desktop.ts b/shared/src/desktop.ts new file mode 100644 index 0000000..303427f --- /dev/null +++ b/shared/src/desktop.ts @@ -0,0 +1,9 @@ +/** + * Hagicode Desktop 相关类型定义 + * 基于 desktop.dl.hagicode.com/index.json 的实际数据结构 + * + * @deprecated 请直接从 '@shared/types/desktop' 导入类型 + * 此文件保留用于向后兼容 + */ + +export * from './types/desktop'; diff --git a/shared/src/index.ts b/shared/src/index.ts new file mode 100644 index 0000000..ac240e7 --- /dev/null +++ b/shared/src/index.ts @@ -0,0 +1,9 @@ +// Shared utilities and types +export * from './links'; +export * from './desktop'; +export * from './desktop-utils'; +export * from './version'; + +// Desktop version management +export * from './version-manager'; +export * from './desktop-context'; diff --git a/shared/src/links.ts b/shared/src/links.ts new file mode 100644 index 0000000..17efd70 --- /dev/null +++ b/shared/src/links.ts @@ -0,0 +1,229 @@ +/** + * 公共链接管理库 + * + * 统一管理站点间的跳转链接和公共链接 + * 根据环境自动切换开发/生产环境的链接 + * + * 开发环境链接配置 + * + * 端口可通过环境变量配置: + * - PORT_DOCS: 文档站点端口(默认 31265) + * - PORT_WEBSITE: 营销站点端口(默认 31264) + * + * 如需自定义端口,请在 .env.local 中设置对应的环境变量 + */ + +/** + * 获取当前环境类型 + * 使用 NODE_ENV 环境变量来区分开发/生产环境 + * @returns 'development' | 'production' + */ +export function getEnvironment(): 'development' | 'production' { + // 优先使用 NODE_ENV 环境变量 + // 如果没有设置,则根据 import.meta.env.MODE 判断(Astro 内置) + const nodeEnv = import.meta.env.NODE_ENV || import.meta.env.MODE; + if (nodeEnv === 'development') { + return 'development'; + } + return 'production'; +} + +/** + * 获取文档站点的 base 路径 + * 开发环境为根路径,生产环境为根路径(独立部署在 docs.hagicode.com) + * @returns base 路径 + */ +export function getDocsBasePath(): string { + return '/'; +} + +/** + * 链接配置接口 + */ +export interface LinkConfig { + /** 开发环境链接 */ + dev: string; + /** 生产环境链接 */ + prod: string; + /** 是否为外部链接(新窗口打开) */ + external?: boolean; + /** 是否为相对路径(需要添加 base 前缀) */ + relative?: boolean; +} + +/** + * 站点间链接配置 + */ +export const SITE_LINKS = { + /** 文档站点 */ + docs: { + dev: 'http://localhost:31265/', // docs 应用开发环境端口 + prod: 'https://docs.hagicode.com/', + external: false, + } as LinkConfig, + + /** 官方营销站点 */ + website: { + dev: 'http://localhost:31264/', // website 应用开发环境端口 + prod: 'https://hagicode.com/', + external: false, + } as LinkConfig, + + /** GitHub 仓库 */ + github: { + dev: 'https://github.com/HagiCode-org/site', + prod: 'https://github.com/HagiCode-org/site', + external: true, + } as LinkConfig, + + /** 技术支持群 QQ */ + qqGroup: { + dev: 'https://qm.qq.com/q/Fwb0o094kw', + prod: 'https://qm.qq.com/q/Fwb0o094kw', + external: true, + } as LinkConfig, + + /** 博客页面(相对于文档站点) */ + blog: { + dev: 'http://localhost:31265/blog/', + prod: 'https://docs.hagicode.com/blog/', + external: false, + } as LinkConfig, + + /** 产品概述(相对于文档站点) */ + productOverview: { + dev: 'http://localhost:31265/product-overview/', + prod: 'https://docs.hagicode.com/product-overview/', + external: false, + } as LinkConfig, + + /** 桌面应用下载页 */ + desktop: { + dev: 'http://localhost:31264/desktop/', + prod: 'https://hagicode.com/desktop/', + external: false, + } as LinkConfig, + + /** Docker Compose 安装指南(相对于文档站点) */ + dockerCompose: { + dev: 'http://localhost:31265/installation/docker-compose/', + prod: 'https://docs.hagicode.com/installation/docker-compose/', + external: false, + } as LinkConfig, + + /** 容器部署落地页 */ + container: { + dev: 'http://localhost:31264/container/', + prod: 'https://hagicode.com/container/', + external: false, + } as LinkConfig, + + /** 博客 RSS 订阅(相对于文档站点) */ + rss: { + dev: 'http://localhost:31265/blog/rss.xml', + prod: 'https://docs.hagicode.com/blog/rss.xml', + external: false, + } as LinkConfig, +} as const; + +/** + * GLM(智谱 AI)推广链接配置 + * 用于博客广告区域和其他推广位置 + */ +export const GLM_PROMO_LINKS = { + /** 智谱 GLM Coding 订阅链接(带推广码) */ + glmCoding: { + url: 'https://www.bigmodel.cn/glm-coding?ic=14BY54APZA', + label: '立即开拼', + title: '智谱 GLM Coding: 20+ 大编程工具无缝支持', + description: 'Claude Code、Cline 等 20+ 大编程工具无缝支持,"码力"全开,越拼越爽!', + discount: '10% 优惠', + }, + + /** Docker Compose 部署指南链接 */ + dockerComposeGuide: { + url: '/installation/docker-compose/', + label: '查看部署指南', + title: 'Docker Compose 部署: 一键部署 Hagicode', + description: '一键部署 Hagicode,快速体验 AI 编程助手', + isInternal: true, + }, +} as const; + +/** + * 获取 GLM Coding 推广链接 + * @returns GLM Coding 推广链接 URL + */ +export function getGlmCodingUrl(): string { + return GLM_PROMO_LINKS.glmCoding.url; +} + +/** + * 获取 Docker Compose 指南链接(带 base 路径) + * @returns Docker Compose 指南完整 URL + */ +export function getDockerComposeGuideUrl(): string { + const basePath = getDocsBasePath(); + const path = GLM_PROMO_LINKS.dockerComposeGuide.url; + // 确保 base 路径和链接路径正确拼接 + if (basePath === '/') { + return path; + } + return `${basePath}${path}`.replace(/\/+/g, '/'); +} + +/** + * 公共链接类型 + */ +export type PublicLinkKey = keyof typeof SITE_LINKS; + +/** + * 获取指定链接的当前环境 URL + * @param key - 链接键名 + * @returns 当前环境下的完整 URL + */ +export function getLink(key: PublicLinkKey): string { + const config = SITE_LINKS[key]; + const env = getEnvironment(); + + if (env === 'development') { + return config.dev; + } + return config.prod; +} + +/** + * 获取指定链接的配置信息 + * @param key - 链接键名 + * @returns 链接配置对象 + */ +export function getLinkConfig(key: PublicLinkKey): LinkConfig { + return SITE_LINKS[key]; +} + +/** + * 判断链接是否为外部链接 + * @param key - 链接键名 + * @returns 是否为外部链接 + */ +export function isExternalLink(key: PublicLinkKey): boolean { + return SITE_LINKS[key].external === true; +} + +/** + * 获取链接的打开方式属性 + * @param key - 链接键名 + * @returns target 属性值 + */ +export function getLinkTarget(key: PublicLinkKey): '_blank' | undefined { + return isExternalLink(key) ? '_blank' : undefined; +} + +/** + * 获取链接的 rel 属性(用于外部链接的安全) + * @param key - 链接键名 + * @returns rel 属性值 + */ +export function getLinkRel(key: PublicLinkKey): 'noopener noreferrer' | undefined { + return isExternalLink(key) ? 'noopener noreferrer' : undefined; +} diff --git a/shared/src/types/desktop.ts b/shared/src/types/desktop.ts new file mode 100644 index 0000000..d32d5da --- /dev/null +++ b/shared/src/types/desktop.ts @@ -0,0 +1,115 @@ +/** + * Hagicode Desktop 相关类型定义 + * 基于 desktop.dl.hagicode.com/index.json 的实际数据结构 + */ + +/** + * 资源类型枚举 + * 从文件名推断的平台和类型 + */ +export enum AssetType { + WindowsSetup = "windows-setup", // Windows 安装程序 (推荐) + WindowsPortable = "windows-portable", // Windows 便携版 + WindowsStore = "windows-store", // Microsoft Store + MacOSApple = "macos-apple", // macOS Apple Silicon (推荐) + MacOSIntel = "macos-intel", // macOS Intel/通用 + LinuxAppImage = "linux-appimage", // Linux AppImage (推荐) + LinuxDeb = "linux-deb", // Linux Debian 包 + LinuxTarball = "linux-tarball", // Linux 压缩包 + Source = "source", // 源代码 + Unknown = "unknown", +} + +/** + * 文件资源信息 + * 来自 index.json 的 assets 数组 + */ +export interface DesktopAsset { + /** 文件名 */ + name: string; + /** 相对路径 */ + path: string; + /** 文件大小 (字节) */ + size: number; + /** 最后修改时间 (Unix 时间戳) */ + lastModified: number | null; +} + +/** + * 版本信息 + * 来自 index.json 的 versions 数组 + */ +export interface DesktopVersion { + /** 版本号 (如 "v0.1.1") */ + version: string; + /** 文件详细信息数组 */ + files: DesktopAsset[]; +} + +/** + * 渠道信息 + */ +export interface ChannelInfo { + /** 该渠道最新版本号 */ + latest: string; + /** 该渠道包含的版本号列表 */ + versions: string[]; +} + +/** + * index.json 响应结构(更新后) + */ +export interface DesktopIndexResponse { + /** Unix 时间戳或 ISO 时间戳字符串 */ + updatedAt: number | string; + /** 版本列表(完整历史) */ + versions: DesktopVersion[]; + /** 渠道信息(可选,向后兼容) */ + channels?: { + /** 稳定版渠道 */ + stable: ChannelInfo; + /** 测试版渠道 */ + beta: ChannelInfo; + }; +} + +/** + * 应用层使用的平台分类下载信息 + * 从文件名推断并格式化后的数据 + */ +export interface PlatformDownload { + /** 完整下载链接 */ + url: string; + /** 格式化的文件大小 */ + size: string; + /** 文件名 */ + filename: string; + /** 资源类型 */ + assetType: AssetType; +} + +/** + * 平台分组信息 + * 按平台分组的下载资源 + */ +export interface PlatformGroup { + /** 平台名称 */ + platform: "windows" | "macos" | "linux"; + /** 该平台的下载资源列表 */ + downloads: PlatformDownload[]; +} + +/** + * 平台推荐配置 + * 定义每个平台的推荐下载类型 + */ +export interface PlatformRecommendation { + /** 平台名称 */ + platform: string; + /** 推荐的资源类型 */ + recommendedType: AssetType; + /** 平台显示名称 */ + label: string; + /** Starlight 图标名称 */ + icon: string; +} diff --git a/shared/src/version-manager.ts b/shared/src/version-manager.ts new file mode 100644 index 0000000..e3c8aaf --- /dev/null +++ b/shared/src/version-manager.ts @@ -0,0 +1,322 @@ +/** + * Desktop 版本数据管理器 + * + * 提供单例模式的版本数据管理,支持服务端注入和客户端获取 + * 用于统一管理 Desktop 版本信息,避免重复请求 + */ + +import type { + DesktopIndexResponse, + DesktopVersion, + PlatformGroup, + ChannelInfo, +} from './types/desktop'; +import { + fetchDesktopVersions, + groupAssetsByPlatform, +} from './desktop-utils'; + +/** + * 版本数据接口 + * 包含最新版本、平台分组、错误信息和渠道数据 + */ +export interface DesktopVersionData { + /** 最新版本信息 */ + latest: DesktopVersion | null; + /** 按平台分组的下载资源 */ + platforms: PlatformGroup[]; + /** 错误信息 */ + error: string | null; + /** 渠道信息 */ + channels: { + /** 稳定版渠道 */ + stable: { + /** 最新版本 */ + latest: DesktopVersion | null; + /** 所有版本 */ + all: DesktopVersion[]; + }; + /** 测试版渠道 */ + beta: { + /** 最新版本 */ + latest: DesktopVersion | null; + /** 所有版本 */ + all: DesktopVersion[]; + }; + }; +} + +/** + * 版本管理器类 + * 单例模式,确保全局只有一个实例 + */ +class VersionManager { + private static instance: VersionManager | null = null; + private data: DesktopVersionData | null = null; + private initialized: boolean = false; + private fetching: boolean = false; + private pendingPromises: Array<{ + resolve: (data: DesktopVersionData) => void; + reject: (error: Error) => void; + }> = []; + + private constructor() { + // 私有构造函数,防止直接实例化 + } + + /** + * 获取单例实例 + */ + static getInstance(): VersionManager { + if (!VersionManager.instance) { + VersionManager.instance = new VersionManager(); + } + return VersionManager.instance; + } + + /** + * 设置服务端注入的数据(用于 SSR) + * 在 Astro 页面的服务端调用此方法,将版本数据注入到客户端 + * + * @param data - 从服务端获取的版本数据 + */ + setServerData(data: DesktopIndexResponse): void { + const versionData = this.transformToVersionData(data); + this.data = versionData; + this.initialized = true; + + // 解析所有等待的 Promise + for (const { resolve } of this.pendingPromises) { + resolve(versionData); + } + this.pendingPromises = []; + } + + /** + * 获取版本数据 + * 如果数据已初始化,直接返回缓存数据 + * 否则发起请求获取数据 + * + * @returns 版本数据 + */ + async getVersionData(): Promise { + // 如果数据已初始化,直接返回 + if (this.initialized && this.data) { + return this.data; + } + + // 检查是否有服务端注入的全局数据 + if (typeof window !== 'undefined' && (window as any).__DESKTOP_VERSION_DATA__) { + const serverData = (window as any).__DESKTOP_VERSION_DATA__; + if (serverData) { + const versionData = this.transformToVersionData(serverData); + this.data = versionData; + this.initialized = true; + // 清除全局数据以避免内存泄漏 + delete (window as any).__DESKTOP_VERSION_DATA__; + return versionData; + } + } + + // 如果正在获取数据,等待结果 + if (this.fetching) { + return new Promise((resolve, reject) => { + this.pendingPromises.push({ resolve, reject }); + }); + } + + // 开始获取数据 + this.fetching = true; + + try { + const responseData = await fetchDesktopVersions(); + const versionData = this.transformToVersionData(responseData); + + this.data = versionData; + this.initialized = true; + + // 解析所有等待的 Promise + for (const { resolve } of this.pendingPromises) { + resolve(versionData); + } + this.pendingPromises = []; + + return versionData; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + const errorData: DesktopVersionData = { + latest: null, + platforms: [], + error: errorMessage, + channels: { + stable: { latest: null, all: [] }, + beta: { latest: null, all: [] }, + }, + }; + + // 拒绝所有等待的 Promise + for (const { reject } of this.pendingPromises) { + reject(error instanceof Error ? error : new Error(errorMessage)); + } + this.pendingPromises = []; + + throw error; + } finally { + this.fetching = false; + } + } + + /** + * 获取指定渠道的版本数据 + * + * @param channel - 渠道名称 ('stable' | 'beta') + * @returns 渠道版本数据 + */ + async getChannelVersionData( + channel: 'stable' | 'beta' + ): Promise<{ + latest: DesktopVersion | null; + all: DesktopVersion[]; + platforms: PlatformGroup[]; + error: string | null; + }> { + const data = await this.getVersionData(); + + return { + latest: data.channels[channel].latest, + all: data.channels[channel].all, + platforms: data.platforms, + error: data.error, + }; + } + + /** + * 检查是否已初始化 + * + * @returns 是否已初始化 + */ + isInitialized(): boolean { + return this.initialized; + } + + /** + * 清除缓存 + * 主要用于测试或手动刷新场景 + */ + clearCache(): void { + this.data = null; + this.initialized = false; + this.fetching = false; + + // 拒绝所有等待的 Promise + for (const { reject } of this.pendingPromises) { + reject(new Error('Cache cleared')); + } + this.pendingPromises = []; + } + + /** + * 将 DesktopIndexResponse 转换为 DesktopVersionData + * + * @param data - 原始版本数据响应 + * @returns 转换后的版本数据 + */ + private transformToVersionData( + data: DesktopIndexResponse + ): DesktopVersionData { + // 优先使用 stable 渠道的最新版本作为默认 latest + let latest: DesktopVersion | null = null; + + if (data.channels && data.channels.stable && data.channels.stable.latest) { + // 如果有 channels.stable.latest,使用它 + const stableLatestVersion = data.channels.stable.latest; + latest = data.versions.find(v => v.version === stableLatestVersion) || null; + } + + // 如果没有找到 stable 版本,则使用最新的版本 + if (!latest && data.versions.length > 0) { + latest = data.versions[0]; + } + + // 获取平台分组(基于 latest 版本) + const platforms = latest + ? groupAssetsByPlatform(latest.files) + : []; + + // 处理渠道数据 + const channels = { + stable: this.processChannel(data, 'stable'), + beta: this.processChannel(data, 'beta'), + }; + + return { + latest, + platforms, + error: null, + channels, + }; + } + + /** + * 处理单个渠道的数据 + * + * @param data - 原始版本数据响应 + * @param channel - 渠道名称 + * @returns 渠道版本数据 + */ + private processChannel( + data: DesktopIndexResponse, + channel: 'stable' | 'beta' + ): { latest: DesktopVersion | null; all: DesktopVersion[] } { + if (!data.channels || !data.channels[channel]) { + return { latest: null, all: [] }; + } + + const channelInfo = data.channels[channel]; + const channelVersions = data.versions.filter((v) => + channelInfo.versions.includes(v.version) + ); + + // 查找最新版本 + const latestVersion = + channelVersions.find((v) => v.version === channelInfo.latest) || null; + + return { + latest: latestVersion, + all: channelVersions, + }; + } +} + +// 导出单例获取方法 +export const getVersionManager = (): VersionManager => { + return VersionManager.getInstance(); +}; + +// 导出便捷方法 +export const setDesktopServerData = (data: DesktopIndexResponse): void => { + getVersionManager().setServerData(data); +}; + +export const getDesktopVersionData = (): Promise => { + return getVersionManager().getVersionData(); +}; + +export const getDesktopChannelData = ( + channel: 'stable' | 'beta' +): Promise<{ + latest: DesktopVersion | null; + all: DesktopVersion[]; + platforms: PlatformGroup[]; + error: string | null; +}> => { + return getVersionManager().getChannelVersionData(channel); +}; + +export const isDesktopVersionInitialized = (): boolean => { + return getVersionManager().isInitialized(); +}; + +export const clearDesktopVersionCache = (): void => { + getVersionManager().clearCache(); +}; diff --git a/shared/src/version.ts b/shared/src/version.ts new file mode 100644 index 0000000..193fada --- /dev/null +++ b/shared/src/version.ts @@ -0,0 +1,201 @@ +/** + * Version utilities for accessing desktop app version information + * from the Docs application's version-index.json file + */ + +import { promises as fs } from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import semver from 'semver'; + +// Import types from desktop.ts +import type { + DesktopIndexResponse, + DesktopVersion, + DesktopAsset +} from './desktop'; + +// Re-export types from desktop.ts for convenience +export type { + DesktopIndexResponse, + DesktopVersion, + DesktopAsset +}; + +/** + * Get the path to the version-index.json file in the Docs app + * This function resolves the path relative to the shared package location + * + * @returns {string} Absolute path to version-index.json + */ +function getVersionIndexPath(): string { + // Get the directory of the current module (packages/shared/src/) + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + const sharedDir = path.dirname(__dirname); // packages/shared/ + + // Navigate from packages/shared/ to apps/docs/public/ + return path.join(sharedDir, '..', '..', 'apps', 'docs', 'public', 'version-index.json'); +} + +/** + * Load and parse the version-index.json file from the Docs app + * + * @returns {Promise} Version index data + * @throws {Error} If the file cannot be read or parsed + */ +export async function getVersionIndex(): Promise { + try { + const versionPath = getVersionIndexPath(); + const content = await fs.readFile(versionPath, 'utf-8'); + return JSON.parse(content) as DesktopIndexResponse; + } catch (error) { + if (error instanceof Error) { + throw new Error(`Failed to load version index: ${error.message}`); + } + throw new Error('Failed to load version index: Unknown error'); + } +} + +/** + * Get the latest version string from the version index + * + * @returns {Promise} The latest version number (e.g., "v0.1.4") + * @throws {Error} If no versions are available or the file cannot be read + */ +export async function getLatestVersion(): Promise { + try { + const data = await getVersionIndex(); + + if (!data.versions || data.versions.length === 0) { + throw new Error('No versions found in version index'); + } + + const latest = getLatestVersionFromVersions(data.versions); + return latest.version; + } catch (error) { + if (error instanceof Error) { + throw new Error(`Failed to get latest version: ${error.message}`); + } + throw new Error('Failed to get latest version: Unknown error'); + } +} + +/** + * Get version data for a specific version string + * + * @param {string} version - Version string to look up (e.g., "v0.1.4") + * @returns {Promise} Version data or undefined if not found + */ +export async function getVersion(version: string): Promise { + try { + const data = await getVersionIndex(); + return data.versions.find(v => v.version === version); + } catch (error) { + if (error instanceof Error) { + throw new Error(`Failed to get version ${version}: ${error.message}`); + } + throw new Error(`Failed to get version ${version}: Unknown error`); + } +} + +/** + * Get all available versions + * + * @returns {Promise} Array of version strings + */ +export async function getAllVersions(): Promise { + try { + const data = await getVersionIndex(); + return data.versions.map(v => v.version); + } catch (error) { + if (error instanceof Error) { + throw new Error(`Failed to get all versions: ${error.message}`); + } + throw new Error('Failed to get all versions: Unknown error'); + } +} + +/** + * Get the latest version from a version array by comparing all versions using semver + * This is a utility function that can be used with any DesktopVersion array + * + * @param {DesktopVersion[]} versions - Array of DesktopVersion objects to search + * @returns {DesktopVersion} The latest DesktopVersion object + * @throws {Error} If versions array is empty + */ +export function getLatestVersionFromVersions( + versions: DesktopVersion[] +): DesktopVersion { + if (!versions || versions.length === 0) { + throw new Error('Versions array is empty'); + } + + // Find the latest version by comparing all versions using semver + return versions.reduce((latest, current) => { + const comparison = compareVersions(current.version, latest.version); + return comparison > 0 ? current : latest; + }); +} + +/** + * Parsed semantic version components + */ +export interface Semver { + /** Major version number */ + major: number; + /** Minor version number */ + minor: number; + /** Patch version number */ + patch: number; + /** Pre-release identifiers (e.g., ["beta", "1"] for "v1.2.3-beta.1") */ + prerelease: Array; +} + +/** + * Parse a semver version string into its components using the semver library + * @param {string} version - Version string (e.g., "v1.2.3", "v1.2.3-beta", "v1.2.3-beta.1", "v1.2", "v1") + * @returns {Semver | null} Parsed Semver interface or null if invalid + */ +export function parseSemver(version: string): Semver | null { + // Remove 'v' prefix if present and parse + const cleaned = version.replace(/^v/, ''); + + // Try to parse with strict mode first + try { + const sem = new semver.SemVer(cleaned); + return { + major: sem.major, + minor: sem.minor, + patch: sem.patch, + prerelease: sem.prerelease as Array + }; + } catch { + // If strict parsing fails, try coerce for partial versions like "1.2" or "1" + const sem = semver.coerce(cleaned); + if (!sem) return null; + return { + major: sem.major, + minor: sem.minor, + patch: sem.patch, + prerelease: sem.prerelease as Array + }; + } +} + +/** + * Compare two version strings using semver specification (via semver library) + * @param {string} v1 - First version + * @param {string} v2 - Second version + * @returns {number} -1 if v1 < v2, 0 if v1 = v2, 1 if v1 > v2 + */ +export function compareVersions(v1: string, v2: string): number { + const cleaned1 = v1.replace(/^v/, ''); + const cleaned2 = v2.replace(/^v/, ''); + + const cmp = semver.compare(cleaned1, cleaned2); + // semver.compare returns: negative if a < b, 0 if equal, positive if a > b + if (cmp < 0) return -1; + if (cmp > 0) return 1; + return 0; +} diff --git a/shared/tsconfig.json b/shared/tsconfig.json new file mode 100644 index 0000000..2ffe910 --- /dev/null +++ b/shared/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "moduleResolution": "bundler", + "resolveJsonModule": true, + "allowJs": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "composite": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["**/*"], + "exclude": ["dist", "node_modules"] +} diff --git a/src/components/51LAAnalytics.astro b/src/components/51LAAnalytics.astro new file mode 100644 index 0000000..49b50da --- /dev/null +++ b/src/components/51LAAnalytics.astro @@ -0,0 +1,37 @@ +--- +/** + * 51LA Analytics 用户行为分析集成组件 + * 仅在生产环境加载 51LA 脚本 + * + * @see https://www.51.la/ + */ +// Astro 组件在服务端执行时可以直接访问 process.env +// 对于构建时静态生成,process.env 在构建时可用 +// 默认使用硬编码的 ID,环境变量可覆盖 +const default51LAId = 'L6b88a5yK4h2Xnci'; +const laId = import.meta.env.VITE_51LA_ID || default51LAId; +const isProduction = import.meta.env.PROD; + +// 在构建时检查是否应该加载 51LA Analytics +// 仅在生产环境加载(使用默认 ID 或环境变量提供的 ID) +const shouldLoad51LA = isProduction; + +// 可选的构建时调试日志 +if (import.meta.env.VITE_51LA_DEBUG) { + console.log('[51LA Analytics] Build-time state:', { + isProduction, + laId: laId ? '***' + laId.slice(-4) : 'not set', + shouldLoad51LA: !!shouldLoad51LA, + NODE_ENV: process.env.NODE_ENV, + }); +} +--- + +{shouldLoad51LA && ( + <> + + + +)} diff --git a/src/components/BaiduAnalytics.astro b/src/components/BaiduAnalytics.astro new file mode 100644 index 0000000..1303010 --- /dev/null +++ b/src/components/BaiduAnalytics.astro @@ -0,0 +1,39 @@ +--- +/** + * Baidu Analytics 用户行为分析集成组件 + * 仅在生产环境加载 Baidu Analytics 脚本 + * + * @see https://tongji.baidu.com/ + */ +// Astro 组件在服务端执行时可以直接访问 process.env +// 对于构建时静态生成,process.env 在构建时可用 +// 默认使用硬编码的 ID,环境变量可覆盖 +const defaultBaiduAnalyticsId = '04ac03637b01a1f4cc0bdfa376387fe5'; +const baiduAnalyticsId = import.meta.env.VITE_BAIDU_ANALYTICS_ID || defaultBaiduAnalyticsId; +const isProduction = import.meta.env.PROD; + +// 在构建时检查是否应该加载 Baidu Analytics +// 仅在生产环境加载(使用默认 ID 或环境变量提供的 ID) +const shouldLoadBaiduAnalytics = isProduction; + +// 可选的构建时调试日志 +if (import.meta.env.VITE_BAIDU_ANALYTICS_DEBUG) { + console.log('[Baidu Analytics] Build-time state:', { + isProduction, + baiduAnalyticsId: baiduAnalyticsId ? '***' + baiduAnalyticsId.slice(-4) : 'not set', + shouldLoadBaiduAnalytics: !!shouldLoadBaiduAnalytics, + NODE_ENV: process.env.NODE_ENV, + }); +} +--- + +{shouldLoadBaiduAnalytics && ( + +)} diff --git a/src/components/BlogFooterAd.astro b/src/components/BlogFooterAd.astro new file mode 100644 index 0000000..61e3916 --- /dev/null +++ b/src/components/BlogFooterAd.astro @@ -0,0 +1,204 @@ +--- +/** + * 博客文章结尾广告组件 + * 在博客文章正文之后显示扩展的链接列表区域 + */ +import { GLM_PROMO_LINKS, getLink } from '@shared/links'; + +interface Props { + /** 是否隐藏广告 */ + hideAd?: boolean; +} + +const { hideAd = false } = Astro.props; + +// 如果设置隐藏广告,则不渲染 +if (hideAd) { + return null; +} + +const { glmCoding, dockerComposeGuide } = GLM_PROMO_LINKS; +--- + + + + diff --git a/src/components/BlogHeaderAd.astro b/src/components/BlogHeaderAd.astro new file mode 100644 index 0000000..3b33046 --- /dev/null +++ b/src/components/BlogHeaderAd.astro @@ -0,0 +1,158 @@ +--- +/** + * 博客文章开头广告组件 + * 在博客文章标题之后、正文之前显示 GLM 推广卡片 + */ +import { GLM_PROMO_LINKS } from '@shared/links'; + +interface Props { + /** 是否隐藏广告 */ + hideAd?: boolean; +} + +const { hideAd = false } = Astro.props; + +// 如果设置隐藏广告,则不渲染 +if (hideAd) { + return null; +} + +const { glmCoding } = GLM_PROMO_LINKS; +--- + +
+
+ + + + + + +
+
+
+ 速来拼好模,智谱 GLM Coding 超值订阅 + (本项目同样使用智谱 AI 开发) +
+
+ {glmCoding.description}立即开拼,享限时惊喜价! +
+
+ + {glmCoding.label} + + + + + +
+ + diff --git a/src/components/Clarity.astro b/src/components/Clarity.astro new file mode 100644 index 0000000..a968bbe --- /dev/null +++ b/src/components/Clarity.astro @@ -0,0 +1,36 @@ +--- +/** + * Microsoft Clarity 用户行为分析集成组件 + * 仅在生产环境加载 Clarity 脚本 + * + * @see https://learn.microsoft.com/en-us/clarity/ + */ +// Astro 组件在服务端执行时可以直接访问 process.env +// 对于构建时静态生成,process.env 在构建时可用 +const clarityProjectId = process.env.VITE_CLARITY_PROJECT_ID || process.env.CLARITY_PROJECT_ID; +const isProduction = import.meta.env.PROD; + +// 在构建时检查是否应该加载 Clarity +// 仅在生产环境且配置了 Project ID 时加载 +const shouldLoadClarity = isProduction && clarityProjectId; + +// 可选的构建时调试日志 +if (process.env.VITE_CLARITY_DEBUG || process.env.CLARITY_DEBUG) { + console.log('[Clarity] Build-time state:', { + isProduction, + clarityProjectId: clarityProjectId ? '***' + clarityProjectId.slice(-4) : 'not set', + shouldLoadClarity: !!shouldLoadClarity, + NODE_ENV: process.env.NODE_ENV, + }); +} +--- + +{shouldLoadClarity && ( + +)} diff --git a/src/components/ClarityDebug.astro b/src/components/ClarityDebug.astro new file mode 100644 index 0000000..0b34f90 --- /dev/null +++ b/src/components/ClarityDebug.astro @@ -0,0 +1,19 @@ +--- +// 调试组件 - 输出环境变量状态 +const clarityProjectId = import.meta.env.VITE_CLARITY_PROJECT_ID; +const isProduction = import.meta.env.PROD; +const clarityDebug = import.meta.env.CLARITY_DEBUG; + +console.log('[ClarityDebug] Build-time state:', { + clarityProjectId, + isProduction, + clarityDebug, + shouldLoad: isProduction && clarityProjectId, +}); +--- +
diff --git a/src/components/InstallButton.tsx b/src/components/InstallButton.tsx new file mode 100644 index 0000000..1e16a2e --- /dev/null +++ b/src/components/InstallButton.tsx @@ -0,0 +1,336 @@ +/** + * InstallButton 组件 - 文档站点版本 (React) + * 支持自动平台检测、下拉菜单选择版本、Docker 版本跳转 + * 用于 Header 导航栏 + */ +import React, { useState, useMemo, useEffect } from 'react'; +import { getLink } from '@shared/links'; +import { + groupAssetsByPlatform, + detectOS, + getAssetTypeLabel, + inferAssetType, + getArchitectureLabel, + PLATFORM_ICONS, + getFileExtension +} from '@shared/desktop-utils'; +import { getDesktopVersionData } from '@shared/version-manager'; +import type { DesktopVersion, PlatformGroup } from '@shared/desktop'; + +interface DownloadOption { + label: string; + url: string; + size?: string; + assetType: string; +} + +interface PlatformDownloads { + platform: 'windows' | 'macos' | 'linux'; + platformLabel: string; + options: DownloadOption[]; +} + +interface InstallButtonProps { + /** + * 显示模式 + * - full: 完整模式(预留) + * - compact: 紧凑模式,用于 Header 导航栏 + */ + variant?: 'full' | 'compact'; + + /** + * 可选的额外类名 + */ + className?: string; + + /** + * 版本数据(服务端传入,优先使用) + */ + initialVersion?: DesktopVersion | null; + + /** + * 平台数据(服务端传入,优先使用) + */ + initialPlatforms?: PlatformGroup[]; + + /** + * 错误信息 + */ + versionError?: string | null; + + /** + * 版本渠道(默认 'stable') + * - stable: 稳定版 + * - beta: 测试版 + */ + channel?: 'stable' | 'beta'; +} + +/** + * 将 PlatformGroup[] 转换为 PlatformDownloads[] 格式 + */ +function convertPlatformGroups(platforms: PlatformGroup[]): PlatformDownloads[] { + const platformLabels = { windows: 'Windows', macos: 'macOS', linux: 'Linux' }; + + return platforms.map(platform => ({ + platform: platform.platform, + platformLabel: platformLabels[platform.platform], + options: platform.downloads.map(download => ({ + label: download.filename, + url: download.url, + size: download.size, + assetType: download.assetType + })) + })); +} + +export default function InstallButton({ + variant = 'compact', + className = '', + initialVersion = null, + initialPlatforms = [], + versionError = null, + channel = 'stable' +}: InstallButtonProps) { + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + const [version, setVersion] = useState(initialVersion); + const [platforms, setPlatforms] = useState(initialPlatforms); + const [error, setError] = useState(versionError); + + // 客户端数据获取(如果服务端没有提供数据) + useEffect(() => { + if (initialVersion || initialPlatforms.length > 0 || versionError) { + return; // 已有数据或错误,无需重新获取 + } + + let mounted = true; + getDesktopVersionData() + .then((data) => { + if (!mounted) return; + + // 根据渠道选择最新版本 + let latest = data.latest; + if (channel && data.channels[channel]?.latest) { + latest = data.channels[channel].latest; + } else if (data.channels.stable?.latest) { + latest = data.channels.stable.latest; + } + + if (latest) { + setVersion(latest); + setPlatforms(data.platforms); + } + }) + .catch((err) => { + if (!mounted) return; + console.error('Failed to fetch desktop versions:', err); + setError(err.message); + }); + + return () => { + mounted = false; + }; + }, [initialVersion, initialPlatforms, versionError, channel]); + + // 生成唯一的组件 ID + const buttonId = useMemo(() => `install-button-${Math.random().toString(36).substring(2, 11)}`, []); + + // 转换平台数据格式 + const platformData = useMemo(() => { + if (!platforms || platforms.length === 0) return []; + return convertPlatformGroups(platforms); + }, [platforms]); + + // 根据用户系统设置默认下载链接 + const currentUrl = useMemo(() => { + if (platformData.length === 0) { + return getLink('desktop'); + } + + const userOS = detectOS(); + const userPlatform = platformData.find(p => p.platform === userOS); + + if (userPlatform) { + // 优先选择推荐版本 + const recommended = userPlatform.options.find(opt => { + const label = opt.label.toLowerCase(); + if (userOS === 'windows') return label.includes('setup'); + if (userOS === 'macos') return label.includes('arm64'); + if (userOS === 'linux') return label.includes('appimage'); + return false; + }); + return recommended ? recommended.url : userPlatform.options[0].url; + } + + return platformData[0].options[0].url; + }, [platformData]); + + // 点击外部关闭下拉菜单 + useEffect(() => { + const handleClickOutside = () => { + setIsDropdownOpen(false); + }; + + if (isDropdownOpen) { + document.addEventListener('click', handleClickOutside); + return () => document.removeEventListener('click', handleClickOutside); + } + }, [isDropdownOpen]); + + // ESC 键关闭下拉菜单 + useEffect(() => { + const handleEscape = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + setIsDropdownOpen(false); + } + }; + + document.addEventListener('keydown', handleEscape); + return () => document.removeEventListener('keydown', handleEscape); + }, []); + + const handleToggleDropdown = (e: React.MouseEvent) => { + e.stopPropagation(); + setIsDropdownOpen(!isDropdownOpen); + }; + + // 点击下拉菜单中的链接后关闭菜单 + const handleLinkClick = () => { + setIsDropdownOpen(false); + }; + + // 如果有错误或没有数据,显示降级链接 + if (error || !version || platformData.length === 0) { + return ( + + ); + } + + return ( +
+
+ {/* 主下载按钮 */} + + + + + 立即安装 + + + {/* 下拉切换按钮 */} + {platformData.length > 0 && ( + <> + + + {/* 下拉菜单 */} + + + )} +
+
+ ); +} diff --git a/src/components/MarkdownContent.astro b/src/components/MarkdownContent.astro new file mode 100644 index 0000000..62a0685 --- /dev/null +++ b/src/components/MarkdownContent.astro @@ -0,0 +1,56 @@ +--- +/** + * 自定义 MarkdownContent 组件 + * 覆盖 starlight-blog 的 MarkdownContent 组件,添加广告支持 + * + * 此组件基于 starlight-blog 的原始实现,添加了以下功能: + * - 在博客文章开头显示 BlogHeaderAd 广告 + * - 在博客文章结尾显示 BlogFooterAd 广告 + * - 支持通过 frontmatter 的 hideAd 属性控制广告显示 + */ +import Default from '@astrojs/starlight/components/MarkdownContent.astro' +import StarlightBlogMarkdownContent from 'starlight-blog/components/MarkdownContent.astro' + +import BlogHeaderAd from './BlogHeaderAd.astro' +import BlogFooterAd from './BlogFooterAd.astro' + +const { id, locale } = Astro.locals.starlightRoute + +// 检查是否为博客文章页面 +// 博客文章的 id 格式为 "blog/YYYY-MM-DD-xxx" +const isBlogPost = id?.startsWith('blog/') && !id.endsWith('blog/') && !id.endsWith('blog') + +// 获取 hideAd 设置 +// 从 starlightBlog 数据中查找当前文章,然后获取 hideAd 属性 +let hideAd = false +if (isBlogPost && Astro.locals.starlightBlog) { + const blogData = Astro.locals.starlightBlog + // 查找匹配当前 id 的博客文章 + const currentPost = blogData.posts.find(post => post.entry.id === id) + if (currentPost) { + hideAd = currentPost.entry.data.hideAd ?? false + } +} +--- + +{ + isBlogPost ? ( +
+ + + + + +
+ ) : ( + + + + ) +} + + diff --git a/src/components/MermaidInjector.astro b/src/components/MermaidInjector.astro new file mode 100644 index 0000000..6da599d --- /dev/null +++ b/src/components/MermaidInjector.astro @@ -0,0 +1,11 @@ +--- +/** + * Mermaid 注入器组件 + * 用作 Starlight 的 Logo 组件,在渲染 Logo 的同时注入 Mermaid 渲染脚本 + */ +import { Logo as DefaultLogo } from '@astrojs/starlight/components'; +import MermaidRenderer from '../scripts/mermaid-renderer.astro'; +--- + + + diff --git a/src/components/StarlightFooter.astro b/src/components/StarlightFooter.astro new file mode 100644 index 0000000..aa1d7bc --- /dev/null +++ b/src/components/StarlightFooter.astro @@ -0,0 +1,412 @@ +--- +/** + * Starlight 自定义 Footer - 三栏高栏布局 + * 统一首页和文档区的 Footer 设计 + * 使用共享链接库管理所有外部链接 + */ +import EditLink from 'virtual:starlight/components/EditLink'; +import LastUpdated from 'virtual:starlight/components/LastUpdated'; +import Pagination from 'virtual:starlight/components/Pagination'; +import config from 'virtual:starlight/user-config'; +import { Icon } from '@astrojs/starlight/components'; +import Clarity from './Clarity.astro'; +// import BaiduAnalytics from './BaiduAnalytics.astro'; // Disabled, migrated to 51LA +import Analytics51LA from './51LAAnalytics.astro'; +import { getLink, getLinkTarget, getLinkRel } from '@shared/links'; +import type { PublicLinkKey } from '@shared/links'; + +// 从共享库获取链接 +const desktopLink = getLink('desktop'); +const websiteLink = getLink('website'); +const githubLink = getLink('github'); +const qqGroupLink = getLink('qqGroup'); +const blogLink = getLink('blog'); +const productOverviewLink = getLink('productOverview'); +const rssLink = getLink('rss'); + +// 外部链接的 target 和 rel 属性 +const externalLinkTarget = getLinkTarget('github'); +const externalLinkRel = getLinkRel('github'); +const qqGroupTarget = getLinkTarget('qqGroup'); +const qqGroupRel = getLinkRel('qqGroup'); +--- + + + + +{/* */} {/* Disabled, migrated to 51LA */} + + + diff --git a/src/components/StarlightHead.astro b/src/components/StarlightHead.astro new file mode 100644 index 0000000..8aa5775 --- /dev/null +++ b/src/components/StarlightHead.astro @@ -0,0 +1,55 @@ +--- +/** + * Starlight 自定义 Head 组件 + * 使用 astro-seo 插件添加完整的 SEO meta 标签 + */ +import { SEO } from 'astro-seo'; + +// 站点默认信息 +const siteTitle = 'Hagicode Docs - 智能 · 便捷 · 有趣的 AI 编码助手'; +const siteDescription = 'Hagicode 项目文档 - 用 AI 重新定义代码开发体验。OpenSpec 工作流、多线程会话管理、成就系统,让编码更高效、更有趣'; + +// 构建完整的 URL +const url = new URL(Astro.url.pathname, Astro.site); +const canonicalUrl = url.href; + +// 完整的图片 URL +const baseUrl = import.meta.env.VITE_SITE_BASE || ''; +const fullImageUrl = `https://hagicode.com${baseUrl}/img/docusaurus-social-card.jpg`; + +// 只对有效页面应用 SEO,跳过404等特殊页面 +const isValidPage = Astro.url.pathname !== '/404'; +--- + +{isValidPage && ( + <> + + + + +)} diff --git a/src/components/StarlightHeader.astro b/src/components/StarlightHeader.astro new file mode 100644 index 0000000..0ce2758 --- /dev/null +++ b/src/components/StarlightHeader.astro @@ -0,0 +1,170 @@ +--- +/** + * 自定义 Starlight Header 组件 + * 在文档页面的 header 中添加导航链接和安装按钮,同时保留所有原有功能 + */ +import config from 'virtual:starlight/user-config'; +import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; +import Search from 'virtual:starlight/components/Search'; +import SiteTitle from 'virtual:starlight/components/SiteTitle'; +import SocialIcons from 'virtual:starlight/components/SocialIcons'; +import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; +import { Icon } from '@astrojs/starlight/components'; +import { navLinks } from '@/config/navigation'; +import InstallButton from './InstallButton'; + +/** + * Render the `Search` component if Pagefind is enabled or the default search component has been overridden. + */ +const shouldRenderSearch = + config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro'; +--- + +
+
+ + +
+
+ {shouldRenderSearch && } +
+
+ + + + +
+
+ + diff --git a/src/components/StructuredData.astro b/src/components/StructuredData.astro new file mode 100644 index 0000000..67df7f8 --- /dev/null +++ b/src/components/StructuredData.astro @@ -0,0 +1,44 @@ +--- +/** + * Schema.org 结构化数据组件 + * 为页面添加 JSON-LD 格式的结构化数据 + */ + +interface StructuredDataProps { + type: 'WebPage' | 'Article' | 'BlogPosting' | 'Organization'; + data: { + name?: string; + headline?: string; + description: string; + url?: string; + datePublished?: string; + dateModified?: string; + author?: { + name: string; + url?: string; + }; + image?: string; + inLanguage?: string; + publisher?: { + name: string; + logo?: string; + }; + }; + canonicalUrl: string; +} + +const { type, data, canonicalUrl } = Astro.props; + +// 构建结构化数据对象 +const structuredData = { + '@context': 'https://schema.org', + '@type': type, + url: canonicalUrl, + ...data, +}; + +// 转换为 JSON 字符串 +const jsonLd = JSON.stringify(structuredData); +--- + + +``` + +## 12 种启动风格设计清单 + +我们将这 12 种风格分为了六大类,以满足不同场景和审美需求。 + +### A. 极简主义 + +> "少即是多"。对于追求极致加载速度的场景,我们提供了最轻量的方案。 + +#### 1. Minimalist Dot (极简呼吸) +屏幕中心只有一个简单的圆点,配合呼吸动画。 +* **实现**:CSS `@keyframes` 控制scale和opacity。 +* **适用**:任何需要保持页面绝对干净的场合。 + +#### 2. Brand Reveal (品牌揭示) +通过 SVG `stroke-dasharray` 动画,模拟手绘般绘制出 HagiCode 的 Logo 线条,随后淡入文字。 +* **技巧**:使用 SVG 路径动画,极具质感。 + +### B. 骨架屏拟态 + +> "欺骗眼睛的艺术"。通过模拟真实 UI 布局,让用户感觉页面已经加载了一半。 + +#### 3. Sidebar Chat Skeleton (侧边栏骨架屏) +这可能是最实用的一种。我们手动用 HTML 构建了与 React 组件 `Sidebar` 和 `ChatInput` 一模一样的布局,并覆盖灰色条纹动画。 +* **价值**:当 React hydrate 完成时,骨架屏瞬间变成真实组件,用户几乎感觉不到切换。 + +#### 4. Card Stack Skeleton (卡片堆叠) +模拟提案卡片加载时的堆叠动效,使用 3D 变换让卡片微微浮动。 + +### C. 抽象与艺术 + +> 展示 HagiCode 的极客基因。 + +#### 5. Geometric Morph (几何变形) +在屏幕中心渲染一个几何体(正方形),它会随着时间平滑地变换为圆形、三角形,最后变成 Logo。 +* **技术**:CSS `border-radius` 的平滑过渡。 + +#### 6. Code Rain (代码雨) +向《黑客帝国》致敬。使用 JetBrains Mono 字体,在背景中落下淡淡的字符流。 +* **注意**:为了性能,字符流必须限制在较小的区域或降低刷新频率。 + +#### 7. Neon Pulse (霓虹脉冲) +赛博朋克风格的发光圆环,利用 `box-shadow` 的多重叠加产生强烈的发光感。 + +### D. 品牌与主题 + +> 让系统"活"起来。 + +#### 8. Seasonal Theme (节日主题) +这是一个动态加载器。根据当前日期判断节日(如春节、圣诞节),加载对应的 SVG 动画。 +* **例子**:春节时,屏幕下方会有红灯笼轻轻摆动。 + +#### 9. Gradient Flow (渐变流) +背景使用 HagiCode 品牌色的流体渐变,配合 `background-size` 和 `background-position` 的动画,营造出极光般的流动感。 + +### E. 技术感 + +> 向开发者致敬。 + +#### 10. Terminal Boot (终端启动) +模拟控制台输出。一行行代码快速滚动: +```text +> Initializing HagiCode Core... +> Loading models... +> Connecting to neural network... +``` +这会让每一个开发者都感到亲切。 + +#### 11. Progress Bar (极简进度条) +屏幕顶部一条细细的进度条,右侧显示百分比。虽然我们无法获取真实的下载进度,但可以用一个定时器模拟出一个"可信"的加载过程(前 80% 快速,后 20% 减速)。 + +### F. 创意 + +#### 12. Pixel Assembly (像素组装) +这是一个很有趣的创意。屏幕上散落着一些方块,它们汇聚到中心,逐渐拼凑出 HagiCode 的 Logo 图标。象征着代码的构建过程。 + +## 最佳实践与踩坑总结 + +在 HagiCode 的实际开发中,我们总结了一些至关重要的实践细节。 + +### 1. 防御式 CSS 是必须的 +千万别偷懒不写前缀。曾经有一次,我们没有给启动页样式加 ID 限制,导致 React 挂载后的全局 `div` 样式意外影响了启动页,导致布局崩坏。 +**经验**:所有 CSS 选择器都挂在 `#boot-screen` 下,且使用 `!important` 提升优先级(仅在启动页 CSS 中)。 + +### 2. 优雅的过渡 +React mount 成功后,不要直接 `remove()` 启动页 DOM。 +**正确做法**: +1. React 触发 `window.dispatchEvent(new Event('hagicode:ready'))`。 +2. 启动页监听到事件,先设置 `opacity: 0`。 +3. 等待 300ms (CSS transition 时间),确保用户看不见了,再执行 `.remove()`。 + +### 3. 主题变量同步 +启动页的颜色代码是写死在 `index.html` 里的。如果我们修改了 Tailwind 的主色,必须同步修改这里。 +**优化方案**:在 Vite 构建脚本中,编写一个简单的插件,读取 `tailwind.config.js` 并将颜色变量注入到 `index.html` 的模板变量中,实现单一数据源。 + +### 4. 字体预加载 +启动页通常需要使用品牌字体,但如果字体加载慢,会出现 FOUT (Flash of Unstyled Text)。 +**解决方案**:在 `` 中加入 ``。这是提升体验的低成本高回报手段。 + +### 5. 性能监控 +我们在 `index.html` 底部注入了 `performance.mark('boot-start')`,并在 React 挂载成功时标记 `boot-end`。 +**意义**:通过 Application Insights 收集这些数据,我们可以真实看到启动页对用户感知等待时间(Perceived Loading Time)的缩短程度。数据表明,优秀的骨架屏能让用户对"慢速网络"的容忍度提升 50% 以上。 + +## 总结 + +一个好的启动页,不仅仅是"等待时的装饰",它是产品与用户第一次交互的握手信号。在 HagiCode 项目中,这套基于 **Variants 模式**的启动系统,让我们能够灵活地在不同节日、不同版本间切换风格,极大地增强了产品的趣味性和专业感。 + +本文分享的方案完全基于原生 Web 标准,没有引入任何沉重的依赖,这正是 HagiCode 追求"轻量且强大"的体现。如果你觉得这套方案有价值,欢迎来 HagiCode 仓库看看我们的源码实现,甚至贡献你的创意设计! + +## 参考资料 + +- **HagiCode 项目地址**:[https://github.com/HagiCode-org/site](https://github.com/HagiCode-org/site) +- **官网了解更多**:[https://hagicode.com](https://hagicode.com) +- **观看实战演示**:[https://www.bilibili.com/video/BV1pirZBuEzq/](https://www.bilibili.com/video/BV1pirZBuEzq/) +- **一键安装体验**:[https://hagicode.com/installation/docker-compose](https://hagicode.com/installation/docker-compose) + +如果本文对你有帮助,欢迎来 GitHub 给个 Star,公测已开始,期待你的反馈! + + + +--- + +感谢您的阅读,如果您觉得本文有用,快点击下方点赞按钮👍,让更多的人看到本文。 + +本内容采用人工智能辅助协作,经本人审核,符合本人观点与立场。 + +- **本文作者:** [newbe36524](https://www.newbe.pro) +- **本文链接:** [https://hagicode.com/blog/2026-02-03-hagicode-react-19-hydration-splash-screen/](https://hagicode.com/blog/2026-02-03-hagicode-react-19-hydration-splash-screen/) +- **版权声明:** 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! \ No newline at end of file diff --git a/src/content/docs/blog/2026-02-04-starlight-docs-integration-microsoft-clarity.mdx b/src/content/docs/blog/2026-02-04-starlight-docs-integration-microsoft-clarity.mdx new file mode 100644 index 0000000..06fac91 --- /dev/null +++ b/src/content/docs/blog/2026-02-04-starlight-docs-integration-microsoft-clarity.mdx @@ -0,0 +1,301 @@ +--- +title: "基于 Starlight 文档站点接入 Microsoft Clarity 的完整实践指南" +date: 2026-02-04 +--- + +# 从数据洞察到用户增长:HagiCode 博客接入 Clarity Analytics 的完整指南 + +> 本文将分享如何在 Starlight 文档站点中优雅地接入 Microsoft Clarity,不仅能看清用户行为,还能确保隐私合规。这套方案是我们在 HagiCode 项目中实践总结出来的,希望能给同样在折腾数据统计的你一点参考。 + +## 背景:为什么我们需要 Clarity? + +以下代码展示了如何在 Astro 集成中根据环境变量动态注入 Microsoft Clarity 脚本,仅在生效时进行生产环境加载。 + + +```markdown +105 | interface Props { +106 | // 未来可扩展: 允许手动覆盖 Project ID +107 | projectId?: string; +108 | } +109 | +110 | const { +111 | projectId = import.meta.env.CLARITY_PROJECT_ID, +112 | } = Astro.props; +113 | +114 | const isProduction = import.meta.env.PROD; +115 | --- +116 | +117 | {isProduction && projectId && ( +118 | +)} +``` + +**关键点解析**: +- `is:inline`:告诉 Astro 不要处理这个 script 标签内的内容,直接输出到 HTML。这对第三方统计脚本至关重要,否则 Astro 的打包优化可能会导致脚本失效。 +- `define:vars`:这是 Astro 3+ 的特性,允许在作用域内安全地注入变量。 +- `import.meta.env.PROD`:确保在本地开发时(除非为了调试)不产生无效统计,保持数据纯净。 + +### 进阶:隐私合规与 Cookie 控制 + +仅仅加上代码是不够的,特别是在 GDPR 管辖区域。我们需要尊重用户的选择。 + +HagiCode 的做法是提供一个简单的开关。虽然这不是全功能的 Cookie Banner,但对于纯展示的技术文档站点来说,通常属于"必要"或"统计"类 Cookie,可以通过隐私声明告知并默认开启,或者在 Footer 链接到隐私设置页面。 + +如果需要更严谨的控制,你可以结合 `localStorage` 来记录用户的选择: + +本文将介绍用于主题切换与持久化的 TypeScript 工具函数,通过类型安全与环境检测实现严谨控制。 + + +```markdown +367 | export function getInitialTheme(): Theme; +368 | export function getSystemTheme(): Theme; +369 | export function setTheme(theme: Theme): void; +370 | export function applyTheme(theme: Theme): void; +371 | ``` +372 | +373 | **设计原则**: +374 | - **纯函数**:无副作用(除了 `setTheme` 和 `applyTheme`) +375 | - **类型安全**:完整的 TypeScript 类型推导 +376 | - **环境检测**:SSR 安全(`typeof window` 检查) +377 | - **单一职责**:每个函数只做一件事 +378 | +379 | **关键实现**: +380 | ```typescript +381 | export function getInitialTheme(): Theme { +382 | if (typeof window === 'undefined') return 'dark'; +383 | +384 | const stored = localStorage.getItem(THEME_KEY); +385 | if (stored === 'light' || stored === 'dark') return stored; +386 | +``` + +*文件:`openspec/changes/archive/2026-01-29-theme-toggle-implementation/design.md`* + +```javascript +// 简单示例:检查用户是否拒绝统计 +const consent = localStorage.getItem('clarity_consent'); +if (consent !== 'denied') { + // 执行上面的 Clarity 初始化代码 + window.clarity('start', clarityId); +} +``` + +## 经验总结与坑点 + +在将这套方案落地到 HagiCode 的过程中,我们总结了几个容易被忽视的细节: + +1. **`StarlightWrapper.astro` 是个陷阱**: + 如前所述,不要试图去创建一个全局 Wrapper 来注入脚本,这在 Starlight 中行不通。老老实实覆盖特定组件(如 `StarlightFooter.astro` 或 `StarlightHead.astro`)才是正解。 + +2. **脚本位置的性能考量**: + 虽然 Clarity 建议放在 `` 中以确保数据准确性,但对于文档站点,首屏加载速度(LCP)直接影响了 SEO 和用户留存。我们选择了放在 Footer(Body 底部),这会轻微丢失极少量"秒退"用户的数据,但换来了更快的页面加载体验,这是一个值得的权衡。 + +3. **开发环境的干扰**: + 一定要加上 `import.meta.env.PROD` 判断。在开发模式下,你会频繁刷新页面,这会产生大量无意义的测试数据,污染你的 Clarity 仪表盘。 + +## 效果验证 + +部署完成后,你可以在 Clarity 控制台查看实时数据。通常在几分钟内,你就能看到用户的heatmap(热力图)和 recordings(录屏)。 + +对于 HagiCode 来说,通过这些数据我们发现: +- 很多用户会反复查看"快速开始"章节,说明我们的安装指引可能还不够直观。 +- "API 参考"页面的停留时间最长,证实了我们核心用户群体的需求。 + +## 总结 + +接入 Microsoft Clarity 并不需要复杂的服务端改造,也不需要引入沉重的 SDK。 + +利用 Starlight 的组件覆盖机制,我们仅通过一个轻量级的 `StarlightFooter.astro` 组件,就实现了全局数据统计。这种"微集成"的方式,既保证了代码的整洁,又赋予了我们洞察用户行为的能力。 + +如果你也在运营技术类项目,特别是像 **HagiCode** 这样需要不断迭代文档的项目,强烈建议尝试接入 Clarity。数据会告诉你,用户真正的痛点在哪里。 + +## 参考资料 + +- [HagiCode GitHub 仓库](https://github.com/HagiCode-org/site) - 查看我们在实际项目中的配置文件 +- [Microsoft Clarity 官方文档](https://learn.microsoft.com/en-us/clarity/) +- [Starlight 组件覆盖指南](https://starlight.astro.build/guides/overriding-components/) + + + +--- + +感谢您的阅读,如果您觉得本文有用,快点击下方点赞按钮👍,让更多的人看到本文。 + +本内容采用人工智能辅助协作,经本人审核,符合本人观点与立场。 + +- **本文作者:** [newbe36524](https://www.newbe.pro) +- **本文链接:** [https://hagicode.com/blog/2026-02-04-starlight-docs-integration-microsoft-clarity/](https://hagicode.com/blog/2026-02-04-starlight-docs-integration-microsoft-clarity/) +- **版权声明:** 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! \ No newline at end of file diff --git a/src/content/docs/blog/authors.yml b/src/content/docs/blog/authors.yml new file mode 100644 index 0000000..bc85ca6 --- /dev/null +++ b/src/content/docs/blog/authors.yml @@ -0,0 +1,7 @@ +newbe36524: + name: Newbe36524 + title: Co-creator of Hagicode + url: https://github.com/newbe36524 + email: newbe36524@hotmail.com + socials: + github: newbe36524 diff --git a/src/content/docs/contributor-guide.mdx b/src/content/docs/contributor-guide.mdx new file mode 100644 index 0000000..da223c2 --- /dev/null +++ b/src/content/docs/contributor-guide.mdx @@ -0,0 +1,280 @@ +--- +title: 文档贡献指南 +description: 了解如何为 Hagicode 文档项目做出贡献,包括文档编写规范、图片引用方式和提交流程。 +sidebar_position: 100 +--- + +感谢您对 Hagicode 文档项目的关注!本指南将帮助您了解如何为文档做出贡献。 + +## 贡献方式 + +我们欢迎各种形式的贡献: + +- 📝 **修正错误**:修复文档中的错别字、链接错误或过时信息 +- ✨ **改进内容**:增强文档的清晰度、添加示例或补充说明 +- 🖼️ **添加图片**:为文档添加截图、图表或其他视觉元素 +- 🌐 **翻译文档**:将文档翻译成其他语言 + +## 开始贡献 + +### 1. 准备工作 + +在开始之前,请确保: + +- 您有一个 GitHub 账号 +- 熟悉基本的 Markdown 语法 +- 了解 Git 的基本操作 + +### 2. Fork 和克隆 + +1. Fork 本仓库到您的 GitHub 账号 +2. 克隆您的 Fork 到本地: + ```bash + git clone https://github.com/your-username/pcode-docs.git + cd pcode-docs + ``` + +### 3. 创建分支 + +为您的更改创建一个新分支: +```bash +git checkout -b feat/your-change-description +``` + +### 4. 进行更改 + +在您喜欢的编辑器中进行修改。 + +## 文档编写规范 + +### Markdown 语法 + +我们使用标准的 Markdown 语法,并支持以下扩展: + +- **标题**:使用 `#` 表示标题级别 +- **列表**:支持有序和无序列表 +- **代码块**:使用三个反引号包围代码,可指定语言 +- **表格**:使用 Markdown 表格语法 +- **链接**:使用 `[文本](URL)` 格式 + +### 内容组织 + +- **清晰简洁**:使用简单直接的语言表达 +- **结构化**:合理使用标题和子标题组织内容 +- **示例丰富**:提供实际的代码示例和截图 +- **更新及时**:确保内容与最新版本一致 + +### 语言风格 + +- **使用中文**:主要使用简体中文编写文档 +- **专业术语**:保留英文技术术语的原样(如 API、CLI 等) +- **友好语气**:使用友好、帮助性的语气 + +## 图片引用规范 + +### 图片存储位置 + +文档相关的图片必须存储在 `src/content/docs/img/` 目录下,与内容文件保持关联。 + +``` +apps/docs/src/content/docs/img/ +├── quick-start/ # 快速开始文档图片 +│ ├── create-normal-session/ +│ ├── create-project/ +│ └── create-proposal-session/ +├── installation/ # 安装指南文档图片 +│ ├── desktop/ +│ └── docker-compose/ +├── related-software-installation/ # 相关软件安装图片 +│ └── postgresql/ +├── product-overview/ # 产品概述图片 +└── shared/ # 共享图片资源 +``` + +### 图片引用方式 + +:::important[重要规范] +**必须使用相对路径引用图片**,而不是绝对路径。 + +::: + +#### ✅ 正确示例 + +使用相对路径,从 Markdown 文件位置计算到图片目录的路径: + +```markdown + + + + + + + + +``` + +:::tip[示例说明] +以上示例展示了不同位置文件的相对路径写法。实际使用时,请根据您的文件位置和图片路径进行调整。 +::: + +#### ❌ 错误示例 + +**不要使用绝对路径引用文档图片**: + +```markdown + + +``` + +:::note[为什么使用相对路径?] +- **类型安全**:Astro Content Collections 会在开发阶段验证图片路径 +- **IDE 支持**:编辑器可以提供自动补全和预览 +- **更好的维护性**:图片与内容文件关联更紧密 +- **性能优化**:可以利用 Astro 的图片优化功能 +::: + +### 相对路径计算规则 + +从 Markdown 文件位置计算到 `src/content/docs/img/` 的相对路径: + +``` +文件位置: src/content/docs/file.md +相对路径前缀: ./img/ + + +文件位置: src/content/docs/category/file.md +相对路径前缀: ../img/ + + +文件位置: src/content/docs/category/subcategory/file.md +相对路径前缀: ../../img/ + +``` + +### 图片命名建议 + +- **使用描述性名称**:如 `create-project-step1.png` 而不是 `image1.png` +- **使用连字符分隔**:如 `installation-wizard.png` 而不是 `installation_wizard.png` +- **包含序号**:多步骤截图使用序号,如 `step1-xxx.png`、`step2-xxx.png` +- **中文名称支持**:允许使用中文文件名,但建议使用英文 + +### 图片格式要求 + +- **推荐格式**:PNG(截图)、JPG(照片)、SVG(图标) +- **文件大小**:单个图片文件建议不超过 500KB +- **图片尺寸**:宽度建议在 800-1200px 之间 +- **清晰度**:确保文字清晰可读 + +### 添加图片的步骤 + +1. **放置图片文件**:将图片放到 `src/content/docs/img/` 对应的子目录中 +2. **使用相对路径引用**:在 Markdown 中使用正确的相对路径 +3. **验证引用**:运行开发服务器确认图片正常显示 + +```bash +# 启动开发服务器 +npm run dev + +# 在浏览器中访问文档页面,确认图片正常显示 +``` + +## 本地预览 + +在提交更改之前,建议本地预览您的修改: + +### 安装依赖 + +```bash +npm install +``` + +### 启动开发服务器 + +```bash +npm run dev +``` + +访问 `http://localhost:4321` 查看您的更改。 + +### 构建验证 + +确保构建成功: + +```bash +npm run build +``` + +## 提交更改 + +### 1. 提交您的更改 + +```bash +git add . +git commit -m "描述您的更改" +``` + +### 2. 推送到您的 Fork + +```bash +git push origin feat/your-change-description +``` + +### 3. 创建 Pull Request + +1. 访问原仓库的 GitHub 页面 +2. 点击 "New Pull Request" +3. 选择您的分支 +4. 填写 PR 描述,说明您的更改 +5. 提交 PR + +### PR 描述模板 + +```markdown +## 变更说明 +简要描述您做了哪些更改。 + +## 相关问题 +关联相关的 Issue 或 PR。 + +## 测试 +- [ ] 已在本地测试通过 +- [ ] 已检查链接有效性 +- [ ] 已验证图片正常显示 + +## 截图 +如果有界面变更,请提供截图。 +``` + +## 代码审查 + +我们的维护者会审查您的 PR,可能会: + +- 提出修改建议 +- 请求额外的更改 +- 或直接合并您的 PR + +请保持关注 PR 的通知,及时回应反馈。 + +## 发布流程 + +合并后的更改会自动发布到生产环境。通常: + +1. PR 合并到 main 分支 +2. CI/CD 自动构建和部署 +3. 更改在几分钟内生效 + +## 获取帮助 + +如果您在贡献过程中遇到问题: + +- 📧 [提交 Issue](https://github.com/HagiCode-org/site/issues) +- 💬 加入我们的技术交流群 +- 📖 查看 [Astro 官方文档](https://docs.astro.build) + +## 许可证 + +通过贡献到本项目,您同意您的贡献将在与项目相同的许可证下发布。 + +--- + +再次感谢您的贡献!🎉 diff --git "a/src/content/docs/img/installation/install-desktop/hagicode-desktop-\346\255\243\345\234\250\345\256\211\350\243\205\344\270\255.png" "b/src/content/docs/img/installation/install-desktop/hagicode-desktop-\346\255\243\345\234\250\345\256\211\350\243\205\344\270\255.png" new file mode 100644 index 0000000..4cf4533 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/hagicode-desktop-\346\255\243\345\234\250\345\256\211\350\243\205\344\270\255.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\217\257\344\273\245\345\234\250\347\211\210\346\234\254\347\256\241\347\220\206\351\241\265\351\235\242\345\257\271\344\270\215\345\220\214\347\232\204\347\211\210\346\234\254\350\277\233\350\241\214\345\210\207\346\215\242.png" "b/src/content/docs/img/installation/install-desktop/\345\217\257\344\273\245\345\234\250\347\211\210\346\234\254\347\256\241\347\220\206\351\241\265\351\235\242\345\257\271\344\270\215\345\220\214\347\232\204\347\211\210\346\234\254\350\277\233\350\241\214\345\210\207\346\215\242.png" new file mode 100644 index 0000000..34608ef Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\217\257\344\273\245\345\234\250\347\211\210\346\234\254\347\256\241\347\220\206\351\241\265\351\235\242\345\257\271\344\270\215\345\220\214\347\232\204\347\211\210\346\234\254\350\277\233\350\241\214\345\210\207\346\215\242.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\200\346\255\245\357\274\214\347\202\271\345\207\273\345\274\200\345\247\213\345\256\211\350\243\205.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\200\346\255\245\357\274\214\347\202\271\345\207\273\345\274\200\345\247\213\345\256\211\350\243\205.png" new file mode 100644 index 0000000..3fbb582 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\200\346\255\245\357\274\214\347\202\271\345\207\273\345\274\200\345\247\213\345\256\211\350\243\205.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245-\346\255\243\345\234\250\345\256\211\350\243\205dotnet-\350\277\220\350\241\214\346\227\266\347\232\204\347\244\272\344\276\213.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245-\346\255\243\345\234\250\345\256\211\350\243\205dotnet-\350\277\220\350\241\214\346\227\266\347\232\204\347\244\272\344\276\213.png" new file mode 100644 index 0000000..f0ae60c Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245-\346\255\243\345\234\250\345\256\211\350\243\205dotnet-\350\277\220\350\241\214\346\227\266\347\232\204\347\244\272\344\276\213.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\345\256\211\350\243\205\346\211\200\346\234\211\344\276\235\350\265\226\351\241\271\345\256\214\346\210\220.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\345\256\211\350\243\205\346\211\200\346\234\211\344\276\235\350\265\226\351\241\271\345\256\214\346\210\220.png" new file mode 100644 index 0000000..045af76 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\345\256\211\350\243\205\346\211\200\346\234\211\344\276\235\350\265\226\351\241\271\345\256\214\346\210\220.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\345\256\214\346\210\220\344\271\213\345\220\216\345\217\257\344\273\245\344\270\200\351\224\256\345\256\211\350\243\205\344\276\235\350\265\226\351\241\271.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\345\256\214\346\210\220\344\271\213\345\220\216\345\217\257\344\273\245\344\270\200\351\224\256\345\256\211\350\243\205\344\276\235\350\265\226\351\241\271.png" new file mode 100644 index 0000000..c2f48c5 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\345\256\214\346\210\220\344\271\213\345\220\216\345\217\257\344\273\245\344\270\200\351\224\256\345\256\211\350\243\205\344\276\235\350\265\226\351\241\271.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\347\211\210\346\234\254\347\232\204\344\276\235\350\265\226\351\241\271.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\347\211\210\346\234\254\347\232\204\344\276\235\350\265\226\351\241\271.png" new file mode 100644 index 0000000..f7c6ee2 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\270\211\346\255\245\357\274\214\346\243\200\346\237\245\347\211\210\346\234\254\347\232\204\344\276\235\350\265\226\351\241\271.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\272\214\346\255\245\357\274\214\350\207\252\345\212\250\344\270\213\350\275\275\346\234\200\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\272\214\346\255\245\357\274\214\350\207\252\345\212\250\344\270\213\350\275\275\346\234\200\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205.png" new file mode 100644 index 0000000..bf07b4a Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\344\272\214\346\255\245\357\274\214\350\207\252\345\212\250\344\270\213\350\275\275\346\234\200\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-server-\345\220\257\345\212\250\344\271\213\345\220\216\345\217\257\344\273\245\347\202\271\345\207\273-hagicode-\345\274\200\345\247\213\344\275\277\347\224\250.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-server-\345\220\257\345\212\250\344\271\213\345\220\216\345\217\257\344\273\245\347\202\271\345\207\273-hagicode-\345\274\200\345\247\213\344\275\277\347\224\250.png" new file mode 100644 index 0000000..1bb4fb7 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-server-\345\220\257\345\212\250\344\271\213\345\220\216\345\217\257\344\273\245\347\202\271\345\207\273-hagicode-\345\274\200\345\247\213\344\275\277\347\224\250.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-\346\255\243\345\234\250\345\220\257\345\212\250-hagicode-server.png" "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-\346\255\243\345\234\250\345\220\257\345\212\250-hagicode-server.png" new file mode 100644 index 0000000..37a9a9a Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\220\221\345\257\274\347\254\254\345\233\233\346\255\245-\346\255\243\345\234\250\345\220\257\345\212\250-hagicode-server.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\345\234\250\351\246\226\351\241\265\345\217\257\344\273\245\351\200\232\350\277\207\345\220\257\345\212\250\346\234\215\345\212\241\346\235\245\345\220\257\345\212\250hagicode-server.png" "b/src/content/docs/img/installation/install-desktop/\345\234\250\351\246\226\351\241\265\345\217\257\344\273\245\351\200\232\350\277\207\345\220\257\345\212\250\346\234\215\345\212\241\346\235\245\345\220\257\345\212\250hagicode-server.png" new file mode 100644 index 0000000..7d125ee Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\345\234\250\351\246\226\351\241\265\345\217\257\344\273\245\351\200\232\350\277\207\345\220\257\345\212\250\346\234\215\345\212\241\346\235\245\345\220\257\345\212\250hagicode-server.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\350\277\233\345\205\245hagicode-\344\271\213\345\220\216\345\217\257\344\273\245\351\200\232\350\277\207\345\206\205\351\203\250\345\220\221\345\257\274\345\274\200\345\247\213\345\210\233\345\273\272\351\241\271\347\233\256.png" "b/src/content/docs/img/installation/install-desktop/\350\277\233\345\205\245hagicode-\344\271\213\345\220\216\345\217\257\344\273\245\351\200\232\350\277\207\345\206\205\351\203\250\345\220\221\345\257\274\345\274\200\345\247\213\345\210\233\345\273\272\351\241\271\347\233\256.png" new file mode 100644 index 0000000..e5f4321 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\350\277\233\345\205\245hagicode-\344\271\213\345\220\216\345\217\257\344\273\245\351\200\232\350\277\207\345\206\205\351\203\250\345\220\221\345\257\274\345\274\200\345\247\213\345\210\233\345\273\272\351\241\271\347\233\256.png" differ diff --git "a/src/content/docs/img/installation/install-desktop/\351\200\232\350\277\207\350\276\223\345\205\245\344\270\200\344\270\252\346\226\207\344\273\266\345\244\271-\345\217\257\344\273\245\346\211\253\346\217\217\350\277\231\344\270\252\346\226\207\344\273\266\345\244\271\345\234\260\344\270\213\346\211\200\346\234\211\347\232\204-git-\344\273\223\345\272\223\350\277\233\350\241\214\345\257\274\345\205\245.png" "b/src/content/docs/img/installation/install-desktop/\351\200\232\350\277\207\350\276\223\345\205\245\344\270\200\344\270\252\346\226\207\344\273\266\345\244\271-\345\217\257\344\273\245\346\211\253\346\217\217\350\277\231\344\270\252\346\226\207\344\273\266\345\244\271\345\234\260\344\270\213\346\211\200\346\234\211\347\232\204-git-\344\273\223\345\272\223\350\277\233\350\241\214\345\257\274\345\205\245.png" new file mode 100644 index 0000000..de5ed15 Binary files /dev/null and "b/src/content/docs/img/installation/install-desktop/\351\200\232\350\277\207\350\276\223\345\205\245\344\270\200\344\270\252\346\226\207\344\273\266\345\244\271-\345\217\257\344\273\245\346\211\253\346\217\217\350\277\231\344\270\252\346\226\207\344\273\266\345\244\271\345\234\260\344\270\213\346\211\200\346\234\211\347\232\204-git-\344\273\223\345\272\223\350\277\233\350\241\214\345\257\274\345\205\245.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/1.\346\211\223\345\274\200\345\256\211\350\243\205\347\225\214\351\235\242.png" "b/src/content/docs/img/installation/install-postgres-windows/1.\346\211\223\345\274\200\345\256\211\350\243\205\347\225\214\351\235\242.png" new file mode 100644 index 0000000..722aff8 Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/1.\346\211\223\345\274\200\345\256\211\350\243\205\347\225\214\351\235\242.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/10.\345\256\236\346\227\266\345\261\225\347\244\272\345\256\211\350\243\205\350\277\233\345\272\246.png" "b/src/content/docs/img/installation/install-postgres-windows/10.\345\256\236\346\227\266\345\261\225\347\244\272\345\256\211\350\243\205\350\277\233\345\272\246.png" new file mode 100644 index 0000000..e3311f3 Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/10.\345\256\236\346\227\266\345\261\225\347\244\272\345\256\211\350\243\205\350\277\233\345\272\246.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/11.\345\256\211\350\243\205\345\267\262\345\256\214\346\210\220.png" "b/src/content/docs/img/installation/install-postgres-windows/11.\345\256\211\350\243\205\345\267\262\345\256\214\346\210\220.png" new file mode 100644 index 0000000..30c7d0b Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/11.\345\256\211\350\243\205\345\267\262\345\256\214\346\210\220.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/2.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\346\226\207\344\273\266\345\244\271.png" "b/src/content/docs/img/installation/install-postgres-windows/2.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\346\226\207\344\273\266\345\244\271.png" new file mode 100644 index 0000000..e3ece42 Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/2.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\346\226\207\344\273\266\345\244\271.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/3.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\345\206\205\345\256\271.png" "b/src/content/docs/img/installation/install-postgres-windows/3.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\345\206\205\345\256\271.png" new file mode 100644 index 0000000..51c7baf Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/3.\350\256\276\347\275\256\345\256\211\350\243\205\347\232\204\345\206\205\345\256\271.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/4.\350\256\276\347\275\256\344\271\213\345\220\216\346\225\260\346\215\256\345\272\223\345\255\230\346\224\276\346\225\260\346\215\256\347\232\204\346\226\207\344\273\266\345\244\271.png" "b/src/content/docs/img/installation/install-postgres-windows/4.\350\256\276\347\275\256\344\271\213\345\220\216\346\225\260\346\215\256\345\272\223\345\255\230\346\224\276\346\225\260\346\215\256\347\232\204\346\226\207\344\273\266\345\244\271.png" new file mode 100644 index 0000000..b5a8adc Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/4.\350\256\276\347\275\256\344\271\213\345\220\216\346\225\260\346\215\256\345\272\223\345\255\230\346\224\276\346\225\260\346\215\256\347\232\204\346\226\207\344\273\266\345\244\271.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/5.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\210\235\345\247\213\347\224\250\346\210\267\347\232\204\345\257\206\347\240\201.png" "b/src/content/docs/img/installation/install-postgres-windows/5.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\210\235\345\247\213\347\224\250\346\210\267\347\232\204\345\257\206\347\240\201.png" new file mode 100644 index 0000000..1d5cbc2 Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/5.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\345\210\235\345\247\213\347\224\250\346\210\267\347\232\204\345\257\206\347\240\201.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/6.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\347\253\257\345\217\243.png" "b/src/content/docs/img/installation/install-postgres-windows/6.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\347\253\257\345\217\243.png" new file mode 100644 index 0000000..03e7a3b Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/6.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\347\253\257\345\217\243.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/7.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\345\255\227\347\254\246\351\233\206\345\222\214\346\226\207\345\214\226.png" "b/src/content/docs/img/installation/install-postgres-windows/7.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\345\255\227\347\254\246\351\233\206\345\222\214\346\226\207\345\214\226.png" new file mode 100644 index 0000000..a15bf12 Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/7.\350\256\276\347\275\256\346\225\260\346\215\256\345\272\223\347\232\204\345\255\227\347\254\246\351\233\206\345\222\214\346\226\207\345\214\226.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/8.\346\237\245\347\234\213\345\256\211\350\243\205\347\232\204\350\256\241\345\210\222.png" "b/src/content/docs/img/installation/install-postgres-windows/8.\346\237\245\347\234\213\345\256\211\350\243\205\347\232\204\350\256\241\345\210\222.png" new file mode 100644 index 0000000..5637e9b Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/8.\346\237\245\347\234\213\345\256\211\350\243\205\347\232\204\350\256\241\345\210\222.png" differ diff --git "a/src/content/docs/img/installation/install-postgres-windows/9.\345\207\206\345\244\207\345\274\200\345\247\213\345\256\211\350\243\205\357\274\214\347\202\271\345\207\273\344\270\213\344\270\200\346\255\245\345\274\200\345\247\213.png" "b/src/content/docs/img/installation/install-postgres-windows/9.\345\207\206\345\244\207\345\274\200\345\247\213\345\256\211\350\243\205\357\274\214\347\202\271\345\207\273\344\270\213\344\270\200\346\255\245\345\274\200\345\247\213.png" new file mode 100644 index 0000000..6567f2d Binary files /dev/null and "b/src/content/docs/img/installation/install-postgres-windows/9.\345\207\206\345\244\207\345\274\200\345\247\213\345\256\211\350\243\205\357\274\214\347\202\271\345\207\273\344\270\213\344\270\200\346\255\245\345\274\200\345\247\213.png" differ diff --git a/src/content/docs/img/product-overview/core-features-architecture/illustration.png b/src/content/docs/img/product-overview/core-features-architecture/illustration.png new file mode 100644 index 0000000..870a410 Binary files /dev/null and b/src/content/docs/img/product-overview/core-features-architecture/illustration.png differ diff --git a/src/content/docs/img/product-overview/core-features-architecture/prompt.json b/src/content/docs/img/product-overview/core-features-architecture/prompt.json new file mode 100644 index 0000000..a0cb930 --- /dev/null +++ b/src/content/docs/img/product-overview/core-features-architecture/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "api-integration\n", + "customPrompt": "Draw connected stack layers with cute labels and icons, like building blocks or a friendly tower.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Illustrate connectivity with playful dotted lines and cute icons connecting to each other. Keep it simple like a child's drawing of how things connect, with clear but friendly visual metaphors for data exchange.. Draw connected stack layers with cute labels and icons, like building blocks or a friendly tower.. A simple hand-drawn stack showing Hagicode's three layers of features. Bottom: basic features (sessions, chat), Middle: helper features (proposals, diagrams), Top: user experience (themes, settings). Draw like a friendly tower with connected levels, using simple doodle icons for each feature group. Like building blocks stacked neatly.\n", + "generationParams": { + "size": "1536x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:38:15Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/positioning-competitive-comparison/illustration.png b/src/content/docs/img/product-overview/positioning-competitive-comparison/illustration.png new file mode 100644 index 0000000..4ae4145 Binary files /dev/null and b/src/content/docs/img/product-overview/positioning-competitive-comparison/illustration.png differ diff --git a/src/content/docs/img/product-overview/positioning-competitive-comparison/prompt.json b/src/content/docs/img/product-overview/positioning-competitive-comparison/prompt.json new file mode 100644 index 0000000..b8bd2a2 --- /dev/null +++ b/src/content/docs/img/product-overview/positioning-competitive-comparison/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "brand-marketing\n", + "customPrompt": "Make Hagicode's section stand out with cheerful colors and positive doodle elements.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Elevate brand presence with cheerful, hand-drawn style visuals that maintain professionalism while feeling warm and welcoming. Focus on memorability through friendly aesthetic choices.. Make Hagicode's section stand out with cheerful colors and positive doodle elements.. A friendly comparison doodle like notebook notes comparing two options. Create a simple hand-drawn table showing Traditional AI vs Hagicode. Use playful icons for each feature: proposals, permissions, knowledge, teamwork. Draw checkmarks and smiley faces to show Hagicode's advantages, like comparing notes in class.\n", + "generationParams": { + "size": "1536x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:35:01Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/self-bootstrapping-documentation/illustration.png b/src/content/docs/img/product-overview/self-bootstrapping-documentation/illustration.png new file mode 100644 index 0000000..d195980 Binary files /dev/null and b/src/content/docs/img/product-overview/self-bootstrapping-documentation/illustration.png differ diff --git a/src/content/docs/img/product-overview/self-bootstrapping-documentation/prompt.json b/src/content/docs/img/product-overview/self-bootstrapping-documentation/prompt.json new file mode 100644 index 0000000..e32fa4c --- /dev/null +++ b/src/content/docs/img/product-overview/self-bootstrapping-documentation/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Use a circular doodle pattern to show continuous improvement in a fun, encouraging way.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Use a circular doodle pattern to show continuous improvement in a fun, encouraging way.. A hand-drawn flow showing how documentation improves itself. Draw simple stages connected by friendly arrows: creating proposals, AI helping write, and making things better. Show documents in a happy cycle of improvement, like a classroom chart showing progress. Include doodle icons for proposals and happy improvements.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:35:46Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/self-bootstrapping-iteration/illustration.png b/src/content/docs/img/product-overview/self-bootstrapping-iteration/illustration.png new file mode 100644 index 0000000..aaaf17c Binary files /dev/null and b/src/content/docs/img/product-overview/self-bootstrapping-iteration/illustration.png differ diff --git a/src/content/docs/img/product-overview/self-bootstrapping-iteration/prompt.json b/src/content/docs/img/product-overview/self-bootstrapping-iteration/prompt.json new file mode 100644 index 0000000..5c3963e --- /dev/null +++ b/src/content/docs/img/product-overview/self-bootstrapping-iteration/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Draw an upward-trending spiral with happy improvement milestones along the way.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Draw an upward-trending spiral with happy improvement milestones along the way.. A playful doodle showing continuous improvement as an upward spiral. Draw the development cycle with simple hand-drawn elements: new features, quality checks, and document updates. Create a spiral or wheel going upward with cute icons for progress, like a classroom chart showing getting better and better.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:37:25Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/self-bootstrapping-repository/illustration.png b/src/content/docs/img/product-overview/self-bootstrapping-repository/illustration.png new file mode 100644 index 0000000..1a3df3a Binary files /dev/null and b/src/content/docs/img/product-overview/self-bootstrapping-repository/illustration.png differ diff --git a/src/content/docs/img/product-overview/self-bootstrapping-repository/prompt.json b/src/content/docs/img/product-overview/self-bootstrapping-repository/prompt.json new file mode 100644 index 0000000..4daab91 --- /dev/null +++ b/src/content/docs/img/product-overview/self-bootstrapping-repository/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Emphasize how knowledge stays safe and organized with warm, reassuring doodle elements.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Emphasize how knowledge stays safe and organized with warm, reassuring doodle elements.. A friendly doodle showing a project repository like a well-organized notebook. Display knowledge artifacts with hand-drawn icons: decisions, changes, and standards all stored neatly. Show git and documents working together like friends, with cute elements representing preserved knowledge and happy organization.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:36:41Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/story-complex-change/illustration.png b/src/content/docs/img/product-overview/story-complex-change/illustration.png new file mode 100644 index 0000000..94d638e Binary files /dev/null and b/src/content/docs/img/product-overview/story-complex-change/illustration.png differ diff --git a/src/content/docs/img/product-overview/story-complex-change/prompt.json b/src/content/docs/img/product-overview/story-complex-change/prompt.json new file mode 100644 index 0000000..12c80f5 --- /dev/null +++ b/src/content/docs/img/product-overview/story-complex-change/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "desktop-app\n", + "customPrompt": "Draw a side-by-side comparison: confused doodles vs happy organized doodles.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Showcase desktop interfaces with simple, rounded window frames and friendly UI elements drawn in colored pencil. Emphasize productivity tools in a warm, approachable way that feels like a helpful study companion.. Draw a side-by-side comparison: confused doodles vs happy organized doodles.. A friendly doodle comparing messy vs organized change management. Show the traditional way as a confused tangle of doodles, then Hagicode way as neat and organized with clear documents, task lists, and happy teamwork. Use hand-drawn elements to show chaos turning into order, like tidying up a messy desk.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:40:08Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/story-newcomer-onboarding/illustration.png b/src/content/docs/img/product-overview/story-newcomer-onboarding/illustration.png new file mode 100644 index 0000000..2d26e2d Binary files /dev/null and b/src/content/docs/img/product-overview/story-newcomer-onboarding/illustration.png differ diff --git a/src/content/docs/img/product-overview/story-newcomer-onboarding/prompt.json b/src/content/docs/img/product-overview/story-newcomer-onboarding/prompt.json new file mode 100644 index 0000000..9404e7a --- /dev/null +++ b/src/content/docs/img/product-overview/story-newcomer-onboarding/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "desktop-app\n", + "customPrompt": "Include friendly before-and-after doodles showing the happy improvement.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Showcase desktop interfaces with simple, rounded window frames and friendly UI elements drawn in colored pencil. Emphasize productivity tools in a warm, approachable way that feels like a helpful study companion.. Include friendly before-and-after doodles showing the happy improvement.. A warm doodle showing a new developer's happy journey with Hagicode. Draw a friendly character exploring code with AI help. Show a simple timeline with cute milestones: Day 1 - learning fast, Day 2 - AI helps with coding, Day 3 - fixing bugs together. Include smiley faces and speed lines to show how much easier and happier it is.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:39:22Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/story-team-knowledge/illustration.png b/src/content/docs/img/product-overview/story-team-knowledge/illustration.png new file mode 100644 index 0000000..6282b91 Binary files /dev/null and b/src/content/docs/img/product-overview/story-team-knowledge/illustration.png differ diff --git a/src/content/docs/img/product-overview/story-team-knowledge/prompt.json b/src/content/docs/img/product-overview/story-team-knowledge/prompt.json new file mode 100644 index 0000000..7f48357 --- /dev/null +++ b/src/content/docs/img/product-overview/story-team-knowledge/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "web-app\n", + "customPrompt": "Emphasize the happy transformation from scattered mess to organized knowledge with friendly doodles.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Feature web application design with simple browser windows and playful icons representing online features. Keep layouts clean and friendly, like a well-organized notebook doodle.. Emphasize the happy transformation from scattered mess to organized knowledge with friendly doodles.. A reassuring doodle showing how team knowledge stays safe. First show the problem: scattered notes and lost information as confused doodles. Then show Hagicode's solution: neat proposals and documents like a well-organized notebook. Draw happy team members easily finding what they need, like a library where everything is in its place.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:40:56Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/illustration.png b/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/illustration.png new file mode 100644 index 0000000..0b1793b Binary files /dev/null and b/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/illustration.png differ diff --git a/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/prompt.json b/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/prompt.json new file mode 100644 index 0000000..602f18b --- /dev/null +++ b/src/content/docs/img/product-overview/value-proposition-ai-assisted-coding/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Emphasize friendship and collaboration with warm, inviting character interactions.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Emphasize friendship and collaboration with warm, inviting character interactions.. A friendly doodle showing a developer and AI helper working together like study buddies. Draw them side by side with simple conversation bubbles, code snippets drawn in crayon, and happy expressions. Include interconnected elements showing they're helping each other understand code, like a classroom partnership.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:33:09Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/value-proposition-dual-mode/illustration.png b/src/content/docs/img/product-overview/value-proposition-dual-mode/illustration.png new file mode 100644 index 0000000..a2f5914 Binary files /dev/null and b/src/content/docs/img/product-overview/value-proposition-dual-mode/illustration.png differ diff --git a/src/content/docs/img/product-overview/value-proposition-dual-mode/prompt.json b/src/content/docs/img/product-overview/value-proposition-dual-mode/prompt.json new file mode 100644 index 0000000..fde51c4 --- /dev/null +++ b/src/content/docs/img/product-overview/value-proposition-dual-mode/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Use cheerful contrasting colors: blue for reading, green for editing, like colored pencils on paper.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Use cheerful contrasting colors: blue for reading, green for editing, like colored pencils on paper.. A simple hand-drawn side-by-side comparison showing two conversation modes. Left side: read-only mode with a magnifying glass and 'read' symbols, drawn like a child's doodle. Right side: edit mode with tools and 'write' symbols. Use a friendly hand-drawn line to separate them, like dividing a notebook page.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:32:12Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/value-proposition-proposal-driven/illustration.png b/src/content/docs/img/product-overview/value-proposition-proposal-driven/illustration.png new file mode 100644 index 0000000..5ba4b0e Binary files /dev/null and b/src/content/docs/img/product-overview/value-proposition-proposal-driven/illustration.png differ diff --git a/src/content/docs/img/product-overview/value-proposition-proposal-driven/prompt.json b/src/content/docs/img/product-overview/value-proposition-proposal-driven/prompt.json new file mode 100644 index 0000000..e610ddd --- /dev/null +++ b/src/content/docs/img/product-overview/value-proposition-proposal-driven/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Include playful task lists and verification checkmarks drawn in colored pencil style.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Include playful task lists and verification checkmarks drawn in colored pencil style.. A hand-drawn doodle showing the proposal-driven development workflow. Show the journey from idea to plan with simple crayon-style elements: a lightbulb for ideas, a document with checkmarks for tasks, and friendly arrows showing progress. Like a classroom notebook illustration that makes planning feel fun and approachable.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:31:26Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/illustration.png b/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/illustration.png new file mode 100644 index 0000000..4493786 Binary files /dev/null and b/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/illustration.png differ diff --git a/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/prompt.json b/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/prompt.json new file mode 100644 index 0000000..d001010 --- /dev/null +++ b/src/content/docs/img/product-overview/value-proposition-self-bootstrapping/prompt.json @@ -0,0 +1,16 @@ +{ + "_comment": "Image generation prompt configuration", + "basePrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.\n", + "context": "code-generation\n", + "customPrompt": "Use circular or looping doodle patterns to show the self-building concept in a fun way.\n", + "userPrompt": "Children's hand-drawing style illustration with crayon or colored pencil texture. Use simple, playful lines with a friendly and educational aesthetic. Incorporate bright, cheerful colors that maintain good contrast for accessibility. Keep technical concepts clear while presenting them in an approachable, non-intimidating way. Style should feel like a warm classroom illustration that makes technology feel friendly and accessible to newcomers.. Highlight code creation with simplified code blocks drawn in crayon style. Include hand-drawn elements like lightbulbs for ideas and checkmarks for completed tasks, keeping technical concepts accessible and fun.. Use circular or looping doodle patterns to show the self-building concept in a fun way.. A playful doodle showing Hagicode building itself, like a robot drawing a smaller version of itself. Show recursive imagery with simple hand-drawn elements: a tool creating its own blueprint, code that appears to write itself. Include cute icons for documents and improvements, all drawn in friendly crayon style.\n", + "generationParams": { + "size": "1024x1024", + "quality": "high", + "format": "png" + }, + "_metadata": { + "generatedAt": "2026-02-17T09:34:00Z", + "version": "1.0.0" + } +} diff --git a/src/content/docs/img/quick-start/create-normal-session/01-create-normal-session.png b/src/content/docs/img/quick-start/create-normal-session/01-create-normal-session.png new file mode 100644 index 0000000..3dd0232 Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/01-create-normal-session.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/02-chat-input.png b/src/content/docs/img/quick-start/create-normal-session/02-chat-input.png new file mode 100644 index 0000000..0074b21 Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/02-chat-input.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/03-ai-response.png b/src/content/docs/img/quick-start/create-normal-session/03-ai-response.png new file mode 100644 index 0000000..e2c6a3f Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/03-ai-response.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/04-execution-result.png b/src/content/docs/img/quick-start/create-normal-session/04-execution-result.png new file mode 100644 index 0000000..0a46ef1 Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/04-execution-result.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/05-mode-switch.png b/src/content/docs/img/quick-start/create-normal-session/05-mode-switch.png new file mode 100644 index 0000000..9063f40 Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/05-mode-switch.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/06-edit-permission.png b/src/content/docs/img/quick-start/create-normal-session/06-edit-permission.png new file mode 100644 index 0000000..451c5bb Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/06-edit-permission.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/07-readme-changes.png b/src/content/docs/img/quick-start/create-normal-session/07-readme-changes.png new file mode 100644 index 0000000..5506bae Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/07-readme-changes.png differ diff --git a/src/content/docs/img/quick-start/create-normal-session/08-delete-session.png b/src/content/docs/img/quick-start/create-normal-session/08-delete-session.png new file mode 100644 index 0000000..45beedf Binary files /dev/null and b/src/content/docs/img/quick-start/create-normal-session/08-delete-session.png differ diff --git a/src/content/docs/img/quick-start/create-project/step1-click-new-project-button.png b/src/content/docs/img/quick-start/create-project/step1-click-new-project-button.png new file mode 100644 index 0000000..51ff125 Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step1-click-new-project-button.png differ diff --git a/src/content/docs/img/quick-start/create-project/step2-fill-project-information.png b/src/content/docs/img/quick-start/create-project/step2-fill-project-information.png new file mode 100644 index 0000000..270eb19 Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step2-fill-project-information.png differ diff --git a/src/content/docs/img/quick-start/create-project/step3-project-list-view.png b/src/content/docs/img/quick-start/create-project/step3-project-list-view.png new file mode 100644 index 0000000..82cd7fc Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step3-project-list-view.png differ diff --git a/src/content/docs/img/quick-start/create-project/step4-click-sdd-tab.png b/src/content/docs/img/quick-start/create-project/step4-click-sdd-tab.png new file mode 100644 index 0000000..22357c4 Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step4-click-sdd-tab.png differ diff --git a/src/content/docs/img/quick-start/create-project/step5-sdd-initialized-status.png b/src/content/docs/img/quick-start/create-project/step5-sdd-initialized-status.png new file mode 100644 index 0000000..5ecc7c0 Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step5-sdd-initialized-status.png differ diff --git a/src/content/docs/img/quick-start/create-project/step6-click-optimize-button.png b/src/content/docs/img/quick-start/create-project/step6-click-optimize-button.png new file mode 100644 index 0000000..d8b6aec Binary files /dev/null and b/src/content/docs/img/quick-start/create-project/step6-click-optimize-button.png differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/1.\347\202\271\345\207\273\346\226\260\345\273\272\344\270\273\346\204\217\346\214\211\351\222\256.png" "b/src/content/docs/img/quick-start/create-proposal-session/1.\347\202\271\345\207\273\346\226\260\345\273\272\344\270\273\346\204\217\346\214\211\351\222\256.png" new file mode 100644 index 0000000..2238b2e Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/1.\347\202\271\345\207\273\346\226\260\345\273\272\344\270\273\346\204\217\346\214\211\351\222\256.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/10.tab\344\270\212\344\274\232\346\230\276\347\244\272\350\247\204\345\210\222\347\233\270\345\205\263\347\232\204\346\226\207\344\273\266.png" "b/src/content/docs/img/quick-start/create-proposal-session/10.tab\344\270\212\344\274\232\346\230\276\347\244\272\350\247\204\345\210\222\347\233\270\345\205\263\347\232\204\346\226\207\344\273\266.png" new file mode 100644 index 0000000..3cbb66e Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/10.tab\344\270\212\344\274\232\346\230\276\347\244\272\350\247\204\345\210\222\347\233\270\345\205\263\347\232\204\346\226\207\344\273\266.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/11.\347\202\271\345\207\273\344\270\200\344\270\252\345\205\267\344\275\223\347\232\204\346\226\207\344\273\266\357\274\214\345\217\257\344\273\245\350\277\233\350\241\214\350\241\214\345\206\205\350\257\204\346\263\250.png" "b/src/content/docs/img/quick-start/create-proposal-session/11.\347\202\271\345\207\273\344\270\200\344\270\252\345\205\267\344\275\223\347\232\204\346\226\207\344\273\266\357\274\214\345\217\257\344\273\245\350\277\233\350\241\214\350\241\214\345\206\205\350\257\204\346\263\250.png" new file mode 100644 index 0000000..2222413 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/11.\347\202\271\345\207\273\344\270\200\344\270\252\345\205\267\344\275\223\347\232\204\346\226\207\344\273\266\357\274\214\345\217\257\344\273\245\350\277\233\350\241\214\350\241\214\345\206\205\350\257\204\346\263\250.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/12.\344\271\237\345\217\257\344\273\245\345\234\250\346\226\207\344\273\266\347\232\204\345\272\225\351\203\250\346\267\273\345\212\240\346\226\207\344\273\266\347\272\247\345\210\253\347\232\204\350\257\204\346\263\250.png" "b/src/content/docs/img/quick-start/create-proposal-session/12.\344\271\237\345\217\257\344\273\245\345\234\250\346\226\207\344\273\266\347\232\204\345\272\225\351\203\250\346\267\273\345\212\240\346\226\207\344\273\266\347\272\247\345\210\253\347\232\204\350\257\204\346\263\250.png" new file mode 100644 index 0000000..af626cd Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/12.\344\271\237\345\217\257\344\273\245\345\234\250\346\226\207\344\273\266\347\232\204\345\272\225\351\203\250\346\267\273\345\212\240\346\226\207\344\273\266\347\272\247\345\210\253\347\232\204\350\257\204\346\263\250.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/13.\346\226\207\344\273\266\350\257\204\346\263\250\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\345\217\263\344\270\212\350\247\222\346\210\226\350\200\205\347\202\271\345\207\273\345\256\241\346\237\245tab\346\235\245\346\237\245\347\234\213\345\275\223\345\211\215\350\257\204\346\263\250\347\232\204\345\206\205\345\256\271.png" "b/src/content/docs/img/quick-start/create-proposal-session/13.\346\226\207\344\273\266\350\257\204\346\263\250\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\345\217\263\344\270\212\350\247\222\346\210\226\350\200\205\347\202\271\345\207\273\345\256\241\346\237\245tab\346\235\245\346\237\245\347\234\213\345\275\223\345\211\215\350\257\204\346\263\250\347\232\204\345\206\205\345\256\271.png" new file mode 100644 index 0000000..951361d Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/13.\346\226\207\344\273\266\350\257\204\346\263\250\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\345\217\263\344\270\212\350\247\222\346\210\226\350\200\205\347\202\271\345\207\273\345\256\241\346\237\245tab\346\235\245\346\237\245\347\234\213\345\275\223\345\211\215\350\257\204\346\263\250\347\232\204\345\206\205\345\256\271.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/14.\345\234\250\345\256\241\346\237\245tab\350\277\230\345\217\257\344\273\245\346\267\273\345\212\240\345\205\250\345\261\200\346\200\247\347\232\204\345\222\214\346\226\207\344\273\266\346\227\240\345\205\263\347\232\204\350\257\204\346\263\250.png" "b/src/content/docs/img/quick-start/create-proposal-session/14.\345\234\250\345\256\241\346\237\245tab\350\277\230\345\217\257\344\273\245\346\267\273\345\212\240\345\205\250\345\261\200\346\200\247\347\232\204\345\222\214\346\226\207\344\273\266\346\227\240\345\205\263\347\232\204\350\257\204\346\263\250.png" new file mode 100644 index 0000000..1dd3b39 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/14.\345\234\250\345\256\241\346\237\245tab\350\277\230\345\217\257\344\273\245\346\267\273\345\212\240\345\205\250\345\261\200\346\200\247\347\232\204\345\222\214\346\226\207\344\273\266\346\227\240\345\205\263\347\232\204\350\257\204\346\263\250.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/15.\345\205\250\345\261\200\350\257\204\346\263\250\351\234\200\350\246\201\347\202\271\345\207\273\344\277\235\345\255\230\346\211\215\344\274\232\347\224\237\346\225\210.png" "b/src/content/docs/img/quick-start/create-proposal-session/15.\345\205\250\345\261\200\350\257\204\346\263\250\351\234\200\350\246\201\347\202\271\345\207\273\344\277\235\345\255\230\346\211\215\344\274\232\347\224\237\346\225\210.png" new file mode 100644 index 0000000..f29a13d Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/15.\345\205\250\345\261\200\350\257\204\346\263\250\351\234\200\350\246\201\347\202\271\345\207\273\344\277\235\345\255\230\346\211\215\344\274\232\347\224\237\346\225\210.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/16.\345\205\250\351\203\250\350\257\204\346\263\250\347\241\256\350\256\244\345\256\214\346\257\225\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\346\217\220\344\272\244\345\205\250\351\203\250\346\211\271\346\263\250\346\214\211\351\222\256\357\274\214\344\273\216\350\200\214\350\256\251ai\346\240\271\346\215\256\344\275\240\347\232\204\346\211\271\346\263\250\344\277\256\346\224\271.png" "b/src/content/docs/img/quick-start/create-proposal-session/16.\345\205\250\351\203\250\350\257\204\346\263\250\347\241\256\350\256\244\345\256\214\346\257\225\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\346\217\220\344\272\244\345\205\250\351\203\250\346\211\271\346\263\250\346\214\211\351\222\256\357\274\214\344\273\216\350\200\214\350\256\251ai\346\240\271\346\215\256\344\275\240\347\232\204\346\211\271\346\263\250\344\277\256\346\224\271.png" new file mode 100644 index 0000000..a1de6fb Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/16.\345\205\250\351\203\250\350\257\204\346\263\250\347\241\256\350\256\244\345\256\214\346\257\225\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\347\202\271\345\207\273\346\217\220\344\272\244\345\205\250\351\203\250\346\211\271\346\263\250\346\214\211\351\222\256\357\274\214\344\273\216\350\200\214\350\256\251ai\346\240\271\346\215\256\344\275\240\347\232\204\346\211\271\346\263\250\344\277\256\346\224\271.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/17.\346\211\271\346\263\250\346\217\220\344\272\244\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235tab\347\234\213\345\210\260ai\344\277\256\346\224\271\347\232\204\350\277\207\347\250\213.png" "b/src/content/docs/img/quick-start/create-proposal-session/17.\346\211\271\346\263\250\346\217\220\344\272\244\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235tab\347\234\213\345\210\260ai\344\277\256\346\224\271\347\232\204\350\277\207\347\250\213.png" new file mode 100644 index 0000000..5ccaf11 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/17.\346\211\271\346\263\250\346\217\220\344\272\244\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235tab\347\234\213\345\210\260ai\344\277\256\346\224\271\347\232\204\350\277\207\347\250\213.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/18.\350\247\204\345\210\222\344\272\272\345\267\245\347\241\256\350\256\244\346\227\240\350\257\257\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\344\277\241\346\201\257tab\347\202\271\345\207\273\347\253\213\345\215\263\346\211\247\350\241\214.png" "b/src/content/docs/img/quick-start/create-proposal-session/18.\350\247\204\345\210\222\344\272\272\345\267\245\347\241\256\350\256\244\346\227\240\350\257\257\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\344\277\241\346\201\257tab\347\202\271\345\207\273\347\253\213\345\215\263\346\211\247\350\241\214.png" new file mode 100644 index 0000000..2132414 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/18.\350\247\204\345\210\222\344\272\272\345\267\245\347\241\256\350\256\244\346\227\240\350\257\257\344\271\213\345\220\216\357\274\214\345\217\257\344\273\245\345\234\250\344\277\241\346\201\257tab\347\202\271\345\207\273\347\253\213\345\215\263\346\211\247\350\241\214.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/19.\350\247\204\345\210\222\346\255\243\345\234\250\346\211\247\350\241\214\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/19.\350\247\204\345\210\222\346\255\243\345\234\250\346\211\247\350\241\214\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" new file mode 100644 index 0000000..9f06752 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/19.\350\247\204\345\210\222\346\255\243\345\234\250\346\211\247\350\241\214\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/2.\345\241\253\345\206\231\344\270\273\346\204\217\347\232\204\345\237\272\346\234\254\344\277\241\346\201\257.png" "b/src/content/docs/img/quick-start/create-proposal-session/2.\345\241\253\345\206\231\344\270\273\346\204\217\347\232\204\345\237\272\346\234\254\344\277\241\346\201\257.png" new file mode 100644 index 0000000..0f61f02 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/2.\345\241\253\345\206\231\344\270\273\346\204\217\347\232\204\345\237\272\346\234\254\344\277\241\346\201\257.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/20.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\210\220\344\271\213\345\220\216\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/20.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\210\220\344\271\213\345\220\216\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" new file mode 100644 index 0000000..4db472c Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/20.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\210\220\344\271\213\345\220\216\347\232\204\351\230\266\346\256\265\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/21.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\257\225\344\271\213\345\220\216\344\273\243\347\240\201\347\232\204\345\217\230\346\233\264\346\225\210\346\236\234\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/21.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\257\225\344\271\213\345\220\216\344\273\243\347\240\201\347\232\204\345\217\230\346\233\264\346\225\210\346\236\234\345\261\225\347\244\272.png" new file mode 100644 index 0000000..ae9569d Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/21.\350\247\204\345\210\222\346\211\247\350\241\214\345\256\214\346\257\225\344\271\213\345\220\216\344\273\243\347\240\201\347\232\204\345\217\230\346\233\264\346\225\210\346\236\234\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/22.\345\257\271\346\211\247\350\241\214\347\273\223\346\236\234\344\270\215\346\273\241\346\204\217\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\344\270\255\347\273\247\347\273\255\350\246\201\346\261\202ai\346\214\211\347\205\247\344\275\240\347\232\204\350\246\201\346\261\202\344\277\256\346\224\271.png" "b/src/content/docs/img/quick-start/create-proposal-session/22.\345\257\271\346\211\247\350\241\214\347\273\223\346\236\234\344\270\215\346\273\241\346\204\217\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\344\270\255\347\273\247\347\273\255\350\246\201\346\261\202ai\346\214\211\347\205\247\344\275\240\347\232\204\350\246\201\346\261\202\344\277\256\346\224\271.png" new file mode 100644 index 0000000..a73f6a1 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/22.\345\257\271\346\211\247\350\241\214\347\273\223\346\236\234\344\270\215\346\273\241\346\204\217\357\274\214\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\344\270\255\347\273\247\347\273\255\350\246\201\346\261\202ai\346\214\211\347\205\247\344\275\240\347\232\204\350\246\201\346\261\202\344\277\256\346\224\271.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/23.\345\246\202\346\236\234\345\205\250\351\203\250\347\273\223\346\236\234\345\267\262\347\273\217\350\276\276\345\210\260\346\273\241\346\204\217\346\225\210\346\236\234\344\272\206\357\274\214\351\202\243\344\271\210\345\217\257\344\273\245\347\202\271\345\207\273\345\275\222\346\241\243\350\247\204\345\210\222\346\235\245\345\256\214\347\273\223\346\265\201\347\250\213.png" "b/src/content/docs/img/quick-start/create-proposal-session/23.\345\246\202\346\236\234\345\205\250\351\203\250\347\273\223\346\236\234\345\267\262\347\273\217\350\276\276\345\210\260\346\273\241\346\204\217\346\225\210\346\236\234\344\272\206\357\274\214\351\202\243\344\271\210\345\217\257\344\273\245\347\202\271\345\207\273\345\275\222\346\241\243\350\247\204\345\210\222\346\235\245\345\256\214\347\273\223\346\265\201\347\250\213.png" new file mode 100644 index 0000000..c965c27 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/23.\345\246\202\346\236\234\345\205\250\351\203\250\347\273\223\346\236\234\345\267\262\347\273\217\350\276\276\345\210\260\346\273\241\346\204\217\346\225\210\346\236\234\344\272\206\357\274\214\351\202\243\344\271\210\345\217\257\344\273\245\347\202\271\345\207\273\345\275\222\346\241\243\350\247\204\345\210\222\346\235\245\345\256\214\347\273\223\346\265\201\347\250\213.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/24.\345\275\222\346\241\243\346\255\243\345\234\250\350\277\233\350\241\214\344\270\255.png" "b/src/content/docs/img/quick-start/create-proposal-session/24.\345\275\222\346\241\243\346\255\243\345\234\250\350\277\233\350\241\214\344\270\255.png" new file mode 100644 index 0000000..496417c Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/24.\345\275\222\346\241\243\346\255\243\345\234\250\350\277\233\350\241\214\344\270\255.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/25.\345\275\222\346\241\243\345\256\214\346\210\220\351\230\266\346\256\265\347\232\204\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/25.\345\275\222\346\241\243\345\256\214\346\210\220\351\230\266\346\256\265\347\232\204\345\261\225\347\244\272.png" new file mode 100644 index 0000000..3108361 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/25.\345\275\222\346\241\243\345\256\214\346\210\220\351\230\266\346\256\265\347\232\204\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/26.\345\275\222\346\241\243\345\256\214\346\210\220\344\271\213\345\220\216\344\273\243\347\240\201\345\217\230\346\233\264\347\232\204\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/26.\345\275\222\346\241\243\345\256\214\346\210\220\344\271\213\345\220\216\344\273\243\347\240\201\345\217\230\346\233\264\347\232\204\345\261\225\347\244\272.png" new file mode 100644 index 0000000..6b3300f Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/26.\345\275\222\346\241\243\345\256\214\346\210\220\344\271\213\345\220\216\344\273\243\347\240\201\345\217\230\346\233\264\347\232\204\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/3.\344\270\273\346\204\217\347\232\2049\344\270\252\351\230\266\346\256\265\345\261\225\347\244\272.png" "b/src/content/docs/img/quick-start/create-proposal-session/3.\344\270\273\346\204\217\347\232\2049\344\270\252\351\230\266\346\256\265\345\261\225\347\244\272.png" new file mode 100644 index 0000000..1ff7f47 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/3.\344\270\273\346\204\217\347\232\2049\344\270\252\351\230\266\346\256\265\345\261\225\347\244\272.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/4.\346\226\260\345\273\272\344\270\273\346\204\217\344\271\213\345\220\216\344\274\232\350\207\252\345\212\250\350\277\233\350\241\214\346\217\217\350\277\260\344\274\230\345\214\226\357\274\214\346\212\212\347\224\250\346\210\267\344\270\273\350\257\211\347\273\223\345\220\210\351\241\271\347\233\256\347\232\204\345\256\236\351\231\205\346\203\205\345\206\265\350\277\233\350\241\214\346\217\217\350\277\260\347\232\204\344\274\230\345\214\226.png" "b/src/content/docs/img/quick-start/create-proposal-session/4.\346\226\260\345\273\272\344\270\273\346\204\217\344\271\213\345\220\216\344\274\232\350\207\252\345\212\250\350\277\233\350\241\214\346\217\217\350\277\260\344\274\230\345\214\226\357\274\214\346\212\212\347\224\250\346\210\267\344\270\273\350\257\211\347\273\223\345\220\210\351\241\271\347\233\256\347\232\204\345\256\236\351\231\205\346\203\205\345\206\265\350\277\233\350\241\214\346\217\217\350\277\260\347\232\204\344\274\230\345\214\226.png" new file mode 100644 index 0000000..995feda Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/4.\346\226\260\345\273\272\344\270\273\346\204\217\344\271\213\345\220\216\344\274\232\350\207\252\345\212\250\350\277\233\350\241\214\346\217\217\350\277\260\344\274\230\345\214\226\357\274\214\346\212\212\347\224\250\346\210\267\344\270\273\350\257\211\347\273\223\345\220\210\351\241\271\347\233\256\347\232\204\345\256\236\351\231\205\346\203\205\345\206\265\350\277\233\350\241\214\346\217\217\350\277\260\347\232\204\344\274\230\345\214\226.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/5.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\347\232\204\346\225\210\346\236\234\357\274\214\345\257\271\346\257\224\344\270\273\350\257\211\345\222\214\346\217\217\350\277\260.png" "b/src/content/docs/img/quick-start/create-proposal-session/5.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\347\232\204\346\225\210\346\236\234\357\274\214\345\257\271\346\257\224\344\270\273\350\257\211\345\222\214\346\217\217\350\277\260.png" new file mode 100644 index 0000000..990e13d Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/5.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\347\232\204\346\225\210\346\236\234\357\274\214\345\257\271\346\257\224\344\270\273\350\257\211\345\222\214\346\217\217\350\277\260.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/6.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\357\274\214\344\270\273\346\204\217\345\220\215\347\247\260\344\271\237\347\224\237\346\210\220\345\245\275\344\271\213\345\220\216\357\274\214\345\260\261\345\217\257\344\273\245\347\202\271\345\207\273\347\224\237\346\210\220\350\247\204\345\210\222\346\235\245\347\224\237\346\210\220\344\270\200\344\273\275\345\205\263\344\272\216\350\277\231\344\270\252\344\270\273\346\204\217\347\232\204\350\247\204\345\210\222.png" "b/src/content/docs/img/quick-start/create-proposal-session/6.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\357\274\214\344\270\273\346\204\217\345\220\215\347\247\260\344\271\237\347\224\237\346\210\220\345\245\275\344\271\213\345\220\216\357\274\214\345\260\261\345\217\257\344\273\245\347\202\271\345\207\273\347\224\237\346\210\220\350\247\204\345\210\222\346\235\245\347\224\237\346\210\220\344\270\200\344\273\275\345\205\263\344\272\216\350\277\231\344\270\252\344\270\273\346\204\217\347\232\204\350\247\204\345\210\222.png" new file mode 100644 index 0000000..106e1c5 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/6.\346\217\217\350\277\260\344\274\230\345\214\226\344\271\213\345\220\216\357\274\214\344\270\273\346\204\217\345\220\215\347\247\260\344\271\237\347\224\237\346\210\220\345\245\275\344\271\213\345\220\216\357\274\214\345\260\261\345\217\257\344\273\245\347\202\271\345\207\273\347\224\237\346\210\220\350\247\204\345\210\222\346\235\245\347\224\237\346\210\220\344\270\200\344\273\275\345\205\263\344\272\216\350\277\231\344\270\252\344\270\273\346\204\217\347\232\204\350\247\204\345\210\222.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/7.\346\255\243\345\234\250\350\277\233\350\241\214\350\247\204\345\210\222\347\224\237\346\210\220\347\232\204\347\225\214\351\235\242.png" "b/src/content/docs/img/quick-start/create-proposal-session/7.\346\255\243\345\234\250\350\277\233\350\241\214\350\247\204\345\210\222\347\224\237\346\210\220\347\232\204\347\225\214\351\235\242.png" new file mode 100644 index 0000000..746c1f9 Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/7.\346\255\243\345\234\250\350\277\233\350\241\214\350\247\204\345\210\222\347\224\237\346\210\220\347\232\204\347\225\214\351\235\242.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/8.\347\224\237\346\210\220\350\277\207\347\250\213\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\350\277\231\344\270\252tab\344\270\255\346\237\245\347\234\213.png" "b/src/content/docs/img/quick-start/create-proposal-session/8.\347\224\237\346\210\220\350\277\207\347\250\213\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\350\277\231\344\270\252tab\344\270\255\346\237\245\347\234\213.png" new file mode 100644 index 0000000..e18a1eb Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/8.\347\224\237\346\210\220\350\277\207\347\250\213\345\217\257\344\273\245\345\234\250\345\257\271\350\257\235\350\277\231\344\270\252tab\344\270\255\346\237\245\347\234\213.png" differ diff --git "a/src/content/docs/img/quick-start/create-proposal-session/9.\350\247\204\345\210\222\347\224\237\346\210\220\345\256\214\346\210\220\344\271\213\345\220\216\357\274\214\344\274\232\350\277\233\345\205\245\345\256\241\351\230\205\347\212\266\346\200\201\357\274\214\346\216\245\344\270\213\346\235\245\345\260\261\351\234\200\350\246\201\344\272\272\345\267\245\345\257\271\350\247\204\345\210\222\350\277\233\350\241\214\345\256\241\351\230\205.png" "b/src/content/docs/img/quick-start/create-proposal-session/9.\350\247\204\345\210\222\347\224\237\346\210\220\345\256\214\346\210\220\344\271\213\345\220\216\357\274\214\344\274\232\350\277\233\345\205\245\345\256\241\351\230\205\347\212\266\346\200\201\357\274\214\346\216\245\344\270\213\346\235\245\345\260\261\351\234\200\350\246\201\344\272\272\345\267\245\345\257\271\350\247\204\345\210\222\350\277\233\350\241\214\345\256\241\351\230\205.png" new file mode 100644 index 0000000..150878a Binary files /dev/null and "b/src/content/docs/img/quick-start/create-proposal-session/9.\350\247\204\345\210\222\347\224\237\346\210\220\345\256\214\346\210\220\344\271\213\345\220\216\357\274\214\344\274\232\350\277\233\345\205\245\345\256\241\351\230\205\347\212\266\346\200\201\357\274\214\346\216\245\344\270\213\346\235\245\345\260\261\351\234\200\350\246\201\344\272\272\345\267\245\345\257\271\350\247\204\345\210\222\350\277\233\350\241\214\345\256\241\351\230\205.png" differ diff --git a/src/content/docs/installation/desktop.mdx b/src/content/docs/installation/desktop.mdx new file mode 100644 index 0000000..f6f48c5 --- /dev/null +++ b/src/content/docs/installation/desktop.mdx @@ -0,0 +1,304 @@ +--- +title: Desktop 安装 +description: Hagicode Desktop 桌面应用程序安装指南 +sidebar_position: 30 +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; +import InstallButton from '../../../components/InstallButton'; + +本指南介绍如何安装和使用 Hagicode Desktop 桌面应用程序。Hagicode Desktop 是一款功能强大且易于使用的桌面应用程序,为您提供完整的 Hagicode 体验。 + +:::tip[推荐方式] +Hagicode Desktop 是最适合个人用户和开发者的安装方式,具有以下优势: +- 一键安装,无需配置复杂的环境 +- 自动管理依赖项和服务 +- 图形化界面,操作简单直观 +- 内置版本管理,轻松切换不同版本 +- 本地运行,数据完全掌控 +::: + +## 什么是 Hagicode Desktop + +Hagicode Desktop 是 Hagicode 的官方桌面应用程序,专为 Windows、macOS 和 Linux 系统设计。它集成了 Hagicode 的所有核心功能,并通过图形化安装向导,让安装过程变得简单快捷。 + +### 主要优势 + +- **一键安装**:通过安装向导,自动完成所有配置步骤 +- **自动依赖管理**:自动检测并安装所需的运行时环境(如 .NET 运行时) +- **服务管理**:内置 Hagicode Server 管理,轻松启动和停止服务 +- **版本切换**:支持多版本管理,可在不同版本之间自由切换 +- **本地运行**:所有数据存储在本地,保护您的隐私 +- **自动更新**:自动检测并下载最新版本 + +### 适用场景 + +Hagicode Desktop 适用于以下场景: +- 个人开发者希望在本地使用 Hagicode +- 需要离线使用 Hagicode 的用户 +- 希望简化安装过程的非技术用户 +- 需要频繁切换不同版本的开发者 + +## 下载 Desktop + +### 快速下载 + +选择适合您操作系统的版本,直接下载安装程序: + +{/* 使用 client:visible 指令确保组件在可见时进行客户端水合,避免 SSR 阶段的 React Hooks 错误 */} + + +### 其他获取方式 + +您还可以从以下渠道获取 Hagicode Desktop 安装程序: + +1. **官方发布页面**:访问 [Hagicode GitHub Releases](https://github.com/Hagicode-org/releases/releases) 下载最新版本 +2. **官方网站**:访问 [Hagicode 官网](https://hagicode.com/) 获取下载链接 + +### 选择正确的版本 + +根据您的操作系统选择对应的安装程序: + +- **Windows**:下载 `.exe` 安装程序 +- **macOS**:下载 `.dmg` 磁盘映像文件 +- **Linux**:下载 `.AppImage` 或 `.deb` 安装包 + +:::note[系统要求] +- **Windows**:Windows 10 或更高版本(64 位) +- **macOS**:macOS 10.15 或更高版本 +- **Linux**:主流 Linux 发行版(Ubuntu 20.04+、Fedora 33+ 等) +::: + +## 运行安装程序 + +下载完成后,运行安装程序。您将看到 Hagicode Desktop 安装程序的欢迎界面。 + +![Desktop 安装程序](../img/installation/install-desktop/hagicode-desktop-正在安装中.png) + +**安装程序界面说明**: +- 这是 Hagicode Desktop 的安装管理器 +- 它会引导您完成整个安装过程 +- 点击相应的按钮开始安装流程 + +## 安装向导步骤 + +Hagicode Desktop 提供了一个四步安装向导,引导您完成整个安装过程。以下是每个步骤的详细说明: + +### 第一步:启动安装向导 + +下载完成后,运行安装程序。安装向导将启动并显示欢迎界面。 + +![安装向导第一步](../img/installation/install-desktop/向导第一步,点击开始安装.png) + +**此步骤说明**: +- 点击"开始安装"按钮启动安装过程 +- 安装程序将自动检查系统环境和所需组件 + +### 第二步:下载最新版本 + +安装向导会自动从官方源下载最新版本的 Hagicode。 + +![安装向导第二步](../img/installation/install-desktop/向导第二步,自动下载最新版本安装.png) + +**此步骤说明**: +- 安装程序自动检测并下载最新稳定版本 +- 下载进度会实时显示 +- 下载完成后会自动进入下一步 + +:::note[网络要求] +确保您的网络连接正常,安装程序需要从互联网下载组件。如果下载失败,请检查网络设置或稍后重试。 +::: + +### 第三步:安装依赖项 + +Hagicode Desktop 需要一些运行时环境才能正常工作。安装向导会自动检测并安装这些依赖项。 + +#### 检查依赖项 + +首先,安装向导会检查系统是否已安装所需的依赖项。 + +![检查依赖项](../img/installation/install-desktop/向导第三步,检查版本的依赖项.png) + +#### 安装依赖项 + +如果检测到缺少依赖项,您将看到以下界面,可以一键安装所有缺失的组件。 + +![一键安装依赖项](../img/installation/install-desktop/向导第三步,检查完成之后可以一键安装依赖项.png) + +**主要依赖项包括**: + +Hagicode Desktop 当前版本需要以下软件组件才能完整运行: + +- **.NET 运行时**:Hagicode 基于 .NET 技术构建,需要 .NET 运行时支持 +- **Node.js**:用于运行某些前端开发和构建工具 +- **OpenSpec**:用于提案管理和规范验证 +- **Claude Code**:AI 辅助开发工具集成 + +:::note[依赖项安装参考] +如果在自动安装过程中遇到任何问题,您可以参考以下详细安装指南: + +- [Node.js 安装指南](/related-software-installation/nodejs/installation) +- [OpenSpec 安装指南](/related-software-installation/openspec/setup-openspec) +- [Claude Code 安装指南](/related-software-installation/claude-code/setup-claude-code-with-zai) + +这些指南提供了详细的安装步骤、故障排除和最佳实践。 +::: + +#### 安装过程 + +安装向导会自动安装所有缺失的依赖项。以下是安装 .NET 运行时的示例: + +![安装 .NET 运行时](../img/installation/install-desktop/向导第三步-正在安装dotnet-运行时的示例.png) + +#### 完成依赖项安装 + +当所有依赖项安装完成后,您将看到成功提示。 + +![依赖项安装完成](../img/installation/install-desktop/向导第三步,安装所有依赖项完成.png) + +:::tip[依赖项管理] +所有依赖项的安装都是自动进行的,您无需手动下载或配置。安装向导会确保安装正确的版本和组件。 +::: + +### 第四步:启动服务 + +依赖项安装完成后,安装向导将启动 Hagicode Server 服务。 + +![启动 Hagicode Server](../img/installation/install-desktop/向导第四步-正在启动-hagicode-server.png) + +**此步骤说明**: +- Hagicode Server 会在后台自动启动 +- 启动过程通常只需要几秒钟 +- 启动完成后,您可以开始使用 Hagicode + +#### 服务启动完成 + +当 Hagicode Server 成功启动后,您将看到以下界面,点击 "Hagicode" 按钮即可开始使用。 + +![服务启动完成](../img/installation/install-desktop/向导第四步-server-启动之后可以点击-hagicode-开始使用.png) + +安装向导完成后,您现在可以开始使用 Hagicode 了。 + +## 首次使用 + +### 创建项目 + +首次进入 Hagicode 时,您可以通过内置向导创建您的第一个项目。 + +![创建项目向导](../img/installation/install-desktop/进入hagicode-之后可以通过内部向导开始创建项目.png) + +**创建项目的步骤**: +1. 选择"创建新项目" +2. 配置项目名称和路径 +3. 选择编程语言和框架 +4. 配置 API 设置 +5. 完成项目创建 + +### 导入 Git 仓库 + +如果您已有现有的 Git 仓库,可以轻松导入到 Hagicode 中。 + +![导入 Git 仓库](../img/installation/install-desktop/通过输入一个文件夹-可以扫描这个文件夹地下所有的-git-仓库进行导入.png) + +**导入步骤**: +1. 点击"导入项目" +2. 输入包含 Git 仓库的文件夹路径 +3. Hagicode 会自动扫描该文件夹下的所有 Git 仓库 +4. 选择要导入的仓库并确认 + +## 版本管理 + +Hagicode Desktop 支持多版本管理,您可以在不同版本之间自由切换。 + +![版本管理](../img/installation/install-desktop/可以在版本管理页面对不同的版本进行切换.png) + +### 切换版本 + +1. 打开 Hagicode Desktop +2. 进入"版本管理"页面 +3. 选择要切换的版本 +4. 点击"切换版本"按钮 +5. 等待切换完成 + +:::note[版本切换注意事项] +- 切换版本会自动重启 Hagicode Server +- 确保在切换前保存所有工作 +- 不同版本的项目配置可能会有差异 +::: + +## 启动和停止服务 + +Hagicode Desktop 提供了简单的方式来管理 Hagicode Server 服务。 + +### 启动服务 + +在 Desktop 应用程序的首页,点击"启动服务"按钮即可启动 Hagicode Server。 + +![启动服务](../img/installation/install-desktop/在首页可以通过启动服务来启动hagicode-server.png) + +### 停止服务 + +要停止 Hagicode Server,点击首页的"停止服务"按钮。 + +:::tip[服务状态] +Desktop 应用程序会实时显示 Hagicode Server 的运行状态,包括: +- 服务状态(运行中/已停止) +- 服务端口号 +- 当前版本信息 +::: + +## 后续步骤 + +安装完成后,您可以继续以下步骤: + + + + + + + + + + + +## 故障排除 + +### 安装失败 + +如果安装过程中遇到问题: + +1. **检查网络连接**:确保能够访问互联网 +2. **检查磁盘空间**:确保有足够的磁盘空间 +3. **以管理员身份运行**:在 Windows 上,右键点击安装程序,选择"以管理员身份运行" +4. **查看日志文件**:安装程序会生成详细的日志文件,可以帮助诊断问题 + +### 依赖项安装失败 + +如果依赖项安装失败: + +1. **检查系统兼容性**:确保您的操作系统满足最低要求 +2. **手动安装依赖项**:可以手动下载并安装 .NET 运行时 +3. **检查防火墙设置**:确保防火墙没有阻止安装程序 + +### 服务启动失败 + +如果 Hagicode Server 无法启动: + +1. **检查端口占用**:确保端口 45000 未被其他程序占用 +2. **检查防火墙设置**:确保防火墙允许 Hagicode Server 访问网络 +3. **重启应用程序**:尝试重启 Hagicode Desktop +4. **查看日志**:在 Desktop 应用程序中查看详细的错误日志 + +### 需要更多帮助? + +如果您遇到此处未涵盖的问题: + +1. 查看 [GitHub Issues](https://github.com/HagiCode-org/site/issues) 寻找类似问题 +2. 访问我们的[社区论坛](https://github.com/HagiCode-org/site/discussions)寻求帮助 +3. 提交新的 Issue,详细描述您的问题 diff --git a/src/content/docs/installation/desktop.mdx.backup b/src/content/docs/installation/desktop.mdx.backup new file mode 100644 index 0000000..d5de91b --- /dev/null +++ b/src/content/docs/installation/desktop.mdx.backup @@ -0,0 +1,292 @@ +--- +title: Desktop 安装 +description: Hagicode Desktop 桌面应用程序安装指南 +sidebar_position: 30 +--- + +本指南介绍如何安装和使用 Hagicode Desktop 桌面应用程序。Hagicode Desktop 是一款功能强大且易于使用的桌面应用程序,为您提供完整的 Hagicode 体验。 + +:::tip[推荐方式] +Hagicode Desktop 是最适合个人用户和开发者的安装方式,具有以下优势: +- 一键安装,无需配置复杂的环境 +- 自动管理依赖项和服务 +- 图形化界面,操作简单直观 +- 内置版本管理,轻松切换不同版本 +- 本地运行,数据完全掌控 +::: + +## 什么是 Hagicode Desktop + +Hagicode Desktop 是 Hagicode 的官方桌面应用程序,专为 Windows、macOS 和 Linux 系统设计。它集成了 Hagicode 的所有核心功能,并通过图形化安装向导,让安装过程变得简单快捷。 + +### 主要优势 + +- **一键安装**:通过安装向导,自动完成所有配置步骤 +- **自动依赖管理**:自动检测并安装所需的运行时环境(如 .NET 运行时) +- **服务管理**:内置 Hagicode Server 管理,轻松启动和停止服务 +- **版本切换**:支持多版本管理,可在不同版本之间自由切换 +- **本地运行**:所有数据存储在本地,保护您的隐私 +- **自动更新**:自动检测并下载最新版本 + +### 适用场景 + +Hagicode Desktop 适用于以下场景: +- 个人开发者希望在本地使用 Hagicode +- 需要离线使用 Hagicode 的用户 +- 希望简化安装过程的非技术用户 +- 需要频繁切换不同版本的开发者 + +## 下载 Desktop + +### 快速下载 + +选择适合您操作系统的版本,直接下载安装程序: + +import InstallButton from '../../../components/InstallButton'; + +{/* 使用 client:visible 指令确保组件在可见时进行客户端水合,避免 SSR 阶段的 React Hooks 错误 */} + + +### 其他获取方式 + +您还可以从以下渠道获取 Hagicode Desktop 安装程序: + +1. **官方发布页面**:访问 [Hagicode GitHub Releases](https://github.com/Hagicode-org/releases/releases) 下载最新版本 +2. **官方网站**:访问 [Hagicode 官网](https://hagicode.com/) 获取下载链接 + +### 选择正确的版本 + +根据您的操作系统选择对应的安装程序: + +- **Windows**:下载 `.exe` 安装程序 +- **macOS**:下载 `.dmg` 磁盘映像文件 +- **Linux**:下载 `.AppImage` 或 `.deb` 安装包 + +:::note[系统要求] +- **Windows**:Windows 10 或更高版本(64 位) +- **macOS**:macOS 10.15 或更高版本 +- **Linux**:主流 Linux 发行版(Ubuntu 20.04+、Fedora 33+ 等) +::: + +## 运行安装程序 + +下载完成后,运行安装程序。您将看到 Hagicode Desktop 安装程序的欢迎界面。 + +![Desktop 安装程序](/img/install-desktop/hagicode-desktop-正在安装中.png) + +**安装程序界面说明**: +- 这是 Hagicode Desktop 的安装管理器 +- 它会引导您完成整个安装过程 +- 点击相应的按钮开始安装流程 + +## 安装向导步骤 + +Hagicode Desktop 提供了一个四步安装向导,引导您完成整个安装过程。以下是每个步骤的详细说明: + +### 第一步:启动安装向导 + +下载完成后,运行安装程序。安装向导将启动并显示欢迎界面。 + +![安装向导第一步](/img/install-desktop/向导第一步,点击开始安装.png) + +**此步骤说明**: +- 点击"开始安装"按钮启动安装过程 +- 安装程序将自动检查系统环境和所需组件 + +### 第二步:下载最新版本 + +安装向导会自动从官方源下载最新版本的 Hagicode。 + +![安装向导第二步](/img/install-desktop/向导第二步,自动下载最新版本安装.png) + +**此步骤说明**: +- 安装程序自动检测并下载最新稳定版本 +- 下载进度会实时显示 +- 下载完成后会自动进入下一步 + +:::note[网络要求] +确保您的网络连接正常,安装程序需要从互联网下载组件。如果下载失败,请检查网络设置或稍后重试。 +::: + +### 第三步:安装依赖项 + +Hagicode Desktop 需要一些运行时环境才能正常工作。安装向导会自动检测并安装这些依赖项。 + +#### 检查依赖项 + +首先,安装向导会检查系统是否已安装所需的依赖项。 + +![检查依赖项](/img/install-desktop/向导第三步,检查版本的依赖项.png) + +#### 安装依赖项 + +如果检测到缺少依赖项,您将看到以下界面,可以一键安装所有缺失的组件。 + +![一键安装依赖项](/img/install-desktop/向导第三步,检查完成之后可以一键安装依赖项.png) + +**主要依赖项包括**: + +Hagicode Desktop 当前版本需要以下软件组件才能完整运行: + +- **.NET 运行时**:Hagicode 基于 .NET 技术构建,需要 .NET 运行时支持 +- **Node.js**:用于运行某些前端开发和构建工具 +- **OpenSpec**:用于提案管理和规范验证 +- **Claude Code**:AI 辅助开发工具集成 + +:::note[依赖项安装参考] +如果在自动安装过程中遇到任何问题,您可以参考以下详细安装指南: + +- [Node.js 安装指南](/related-software-installation/nodejs/installation) +- [OpenSpec 安装指南](/related-software-installation/openspec/setup-openspec) +- [Claude Code 安装指南](/related-software-installation/claude-code/setup-claude-code-with-zai) + +这些指南提供了详细的安装步骤、故障排除和最佳实践。 +::: + +#### 安装过程 + +安装向导会自动安装所有缺失的依赖项。以下是安装 .NET 运行时的示例: + +![安装 .NET 运行时](/img/install-desktop/向导第三步-正在安装dotnet-运行时的示例.png) + +#### 完成依赖项安装 + +当所有依赖项安装完成后,您将看到成功提示。 + +![依赖项安装完成](/img/install-desktop/向导第三步,安装所有依赖项完成.png) + +:::tip[依赖项管理] +所有依赖项的安装都是自动进行的,您无需手动下载或配置。安装向导会确保安装正确的版本和组件。 +::: + +### 第四步:启动服务 + +依赖项安装完成后,安装向导将启动 Hagicode Server 服务。 + +![启动 Hagicode Server](/img/install-desktop/向导第四步-正在启动-hagicode-server.png) + +**此步骤说明**: +- Hagicode Server 会在后台自动启动 +- 启动过程通常只需要几秒钟 +- 启动完成后,您可以开始使用 Hagicode + +#### 服务启动完成 + +当 Hagicode Server 成功启动后,您将看到以下界面,点击 "Hagicode" 按钮即可开始使用。 + +![服务启动完成](/img/install-desktop/向导第四步-server-启动之后可以点击-hagicode-开始使用.png) + +安装向导完成后,您现在可以开始使用 Hagicode 了。 + +## 首次使用 + +### 创建项目 + +首次进入 Hagicode 时,您可以通过内置向导创建您的第一个项目。 + +![创建项目向导](/img/install-desktop/进入hagicode-之后可以通过内部向导开始创建项目.png) + +**创建项目的步骤**: +1. 选择"创建新项目" +2. 配置项目名称和路径 +3. 选择编程语言和框架 +4. 配置 API 设置 +5. 完成项目创建 + +### 导入 Git 仓库 + +如果您已有现有的 Git 仓库,可以轻松导入到 Hagicode 中。 + +![导入 Git 仓库](/img/install-desktop/通过输入一个文件夹-可以扫描这个文件夹地下所有的-git-仓库进行导入.png) + +**导入步骤**: +1. 点击"导入项目" +2. 输入包含 Git 仓库的文件夹路径 +3. Hagicode 会自动扫描该文件夹下的所有 Git 仓库 +4. 选择要导入的仓库并确认 + +## 版本管理 + +Hagicode Desktop 支持多版本管理,您可以在不同版本之间自由切换。 + +![版本管理](/img/install-desktop/可以在版本管理页面对不同的版本进行切换.png) + +### 切换版本 + +1. 打开 Hagicode Desktop +2. 进入"版本管理"页面 +3. 选择要切换的版本 +4. 点击"切换版本"按钮 +5. 等待切换完成 + +:::note[版本切换注意事项] +- 切换版本会自动重启 Hagicode Server +- 确保在切换前保存所有工作 +- 不同版本的项目配置可能会有差异 +::: + +## 启动和停止服务 + +Hagicode Desktop 提供了简单的方式来管理 Hagicode Server 服务。 + +### 启动服务 + +在 Desktop 应用程序的首页,点击"启动服务"按钮即可启动 Hagicode Server。 + +![启动服务](/img/install-desktop/在首页可以通过启动服务来启动hagicode-server.png) + +### 停止服务 + +要停止 Hagicode Server,点击首页的"停止服务"按钮。 + +:::tip[服务状态] +Desktop 应用程序会实时显示 Hagicode Server 的运行状态,包括: +- 服务状态(运行中/已停止) +- 服务端口号 +- 当前版本信息 +::: + +## 后续步骤 + +安装完成后,您可以: + +1. **创建您的第一个项目**:按照[快速开始指南](/quick-start/create-first-project)创建项目 +2. **了解 Hagicode 功能**:浏览[功能文档](/docs/)了解更多功能 +3. **配置 API 设置**:配置您的 API 提供商和 Token +4. **加入技术交流群**:扫描下方二维码加入 Hagicode 技术交流群,与其他开发者交流经验、获取帮助和分享项目成果 + +## 故障排除 + +### 安装失败 + +如果安装过程中遇到问题: + +1. **检查网络连接**:确保能够访问互联网 +2. **检查磁盘空间**:确保有足够的磁盘空间 +3. **以管理员身份运行**:在 Windows 上,右键点击安装程序,选择"以管理员身份运行" +4. **查看日志文件**:安装程序会生成详细的日志文件,可以帮助诊断问题 + +### 依赖项安装失败 + +如果依赖项安装失败: + +1. **检查系统兼容性**:确保您的操作系统满足最低要求 +2. **手动安装依赖项**:可以手动下载并安装 .NET 运行时 +3. **检查防火墙设置**:确保防火墙没有阻止安装程序 + +### 服务启动失败 + +如果 Hagicode Server 无法启动: + +1. **检查端口占用**:确保端口 45000 未被其他程序占用 +2. **检查防火墙设置**:确保防火墙允许 Hagicode Server 访问网络 +3. **重启应用程序**:尝试重启 Hagicode Desktop +4. **查看日志**:在 Desktop 应用程序中查看详细的错误日志 + +### 需要更多帮助? + +如果您遇到此处未涵盖的问题: + +1. 查看 [GitHub Issues](https://github.com/HagiCode-org/site/issues) 寻找类似问题 +2. 访问我们的[社区论坛](https://github.com/HagiCode-org/site/discussions)寻求帮助 +3. 提交新的 Issue,详细描述您的问题 diff --git a/src/content/docs/installation/docker-compose.mdx b/src/content/docs/installation/docker-compose.mdx new file mode 100644 index 0000000..cd4fa9d --- /dev/null +++ b/src/content/docs/installation/docker-compose.mdx @@ -0,0 +1,239 @@ +--- +title: Docker Compose 部署 +description: 使用 Docker Compose 一键部署完整的 Hagicode 系统 +sidebar_position: 10 +--- + +本指南介绍如何使用 Docker Compose 一键部署完整的 Hagicode 系统。这是**推荐的部署方式**,适合大多数用户,特别是开发、测试和生产环境。 + +## 视频教程 + +为了帮助您更好地理解 Docker Compose 部署过程,我们提供了详细的视频教程: + +[在 B站观看视频教程](https://www.bilibili.com/video/BV19967B6EHr/) + +**视频内容简介**: +- Docker Compose 部署的完整流程演示 +- 配置文件生成和修改说明 +- 服务启动和验证步骤 +- 常见问题和解决方案 + +视频时长:约 15 分钟 + +:::note[Docker Compose Builder] +Docker Compose Builder 现在作为独立工具提供,地址:[https://builder.hagicode.com/](https://builder.hagicode.com/)。它提供相同的功能,并定期更新和改进用户体验。 +::: + +:::tip[使用配置生成器] +**推荐使用 [Docker Compose Builder (独立站点)](https://builder.hagicode.com/)**! + +通过简单的表单填写,即可快速生成符合您需求的 `docker-compose.yml` 配置文件。生成器支持: +- 自定义端口、容器名称等基础配置 +- 选择内置数据库或外部数据库 +- 自动配置 Windows/Linux 平台差异 +- 智能处理文件权限问题 +- **镜像源选择**:支持 Docker Hub(默认)和 Azure Container Registry (ACR) 镜像源 + +[🚀 立即使用生成器 →](https://builder.hagicode.com/) +::: + +:::tip[推荐方式] +Docker Compose 部署是首选的安装方式,具有以下优势: +- 环境隔离,避免依赖冲突 +- 一键启动所有服务(PostgreSQL + Hagicode) +- 易于管理和维护 +- 适合快速体验和测试 +::: + +## 前置要求 + +在开始之前,请确保您的系统已安装 Docker 和 Docker Compose。 + +### 安装 Docker + +#### Windows +下载并安装 [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) + +安装完成后,确保 Docker Desktop 正在运行。 + +#### macOS +下载并安装 [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) + +安装完成后,确保 Docker Desktop 正在运行。 + +#### Linux +使用您的包管理器安装 Docker: + +```bash title="在 Ubuntu/Debian 上安装 Docker" +sudo apt-get update +sudo apt-get install docker.io docker-compose-plugin +``` + +安装完成后,启动 Docker 服务: + +```bash +sudo systemctl start docker +sudo systemctl enable docker +``` + +### 验证安装 + +安装完成后,运行以下命令验证 Docker 和 Docker Compose 是否正确安装: + +```bash +docker --version +docker compose version +``` + +## 快速开始 + +### 1. 生成 Docker Compose 配置文件 + +:::tip[使用配置生成器] +**推荐使用 [Docker Compose Builder (独立站点)](https://builder.hagicode.com/)** 来生成您的配置文件。 + +生成器支持: +- 多种 API 提供商选择(智谱 AI、Anthropic 官方、自定义 API) +- 自动配置 API URL 和 Token +- 自定义端口、容器名称等基础配置 +- 选择内置数据库或外部数据库 +- 自动配置 Windows/Linux 平台差异 +- 智能处理文件权限问题 + +[🚀 立即使用生成器 →](https://builder.hagicode.com/) +::: + +1. 打开 [Docker Compose Builder (独立站点)](https://builder.hagicode.com/) +2. 根据您的需求填写配置: + - 选择 API 提供商(智谱 AI、Anthropic 官方或自定义) + - 配置端口、数据库、工作目录等选项 + - **选择镜像源**:根据您的网络环境选择合适的镜像源 +3. 点击生成按钮,获取 `docker-compose.yml` 配置 +4. 将生成的配置保存为 `docker-compose.yml` 文件 +5. 如果需要,创建 `.env` 文件配置敏感信息 + +#### 镜像源选择 + +生成器支持三个镜像源选项: + +**Docker Hub** +- **镜像地址**:`newbe36524/hagicode:{tag}` +- **适用场景**:适合支持 Docker Hub 镜像加速的用户 +- **优点**:官方镜像源,更新及时,访问稳定 +- **注意事项**:部分地区可能需要配置镜像加速器 + +**Azure Container Registry (ACR)** +- **镜像地址**:`hagicode.azurecr.io/hagicode:{tag}` +- **适用场景**:适合本地网络无法访问 Docker Hub 的用户 +- **优点**:提供备选镜像源,解决网络访问问题 +- **注意事项**:镜像与 Docker Hub 保持同步,但可能存在短暂延迟 + +**阿里云容器镜像服务(ACR)** +- **镜像地址**:`registry.cn-hangzhou.aliyuncs.com/hagicode/hagicode:{tag}` +- **适用场景**:适合国内用户,网络访问稳定,下载速度快 +- **优点**:阿里云国内节点,访问速度快,稳定性高 +- **注意事项**:镜像与 Docker Hub 保持同步,通常延迟在 30 分钟内 + +:::tip[镜像源选择建议] +- **国内用户推荐阿里云 ACR**:如果您是国内用户,建议优先使用阿里云镜像源,访问速度快且稳定 +- **备选 Docker Hub**:如果您的网络环境可以访问 Docker Hub,也可以选择 Docker Hub 镜像源 +- **备选 Azure ACR**:仅在其他镜像源访问困难时选择 Azure ACR 镜像源 +- **镜像同步**:阿里云 ACR 镜像与 Docker Hub 保持同步,通常延迟在 30 分钟内 +- **版本一致性**:三个镜像源的镜像标签保持一致,不用担心版本问题 +::: + +:::note[获取 API Token] +您需要配置 Claude API Token 才能使用 Hagicode: + +**智谱 AI(推荐)**:[获取 API Token →](https://www.bigmodel.cn/glm-coding?ic=14BY54APZA) +- 国内访问稳定,响应更快 +- 性价比高,适合日常使用 + +**Anthropic 官方**:[获取 API Token →](https://console.anthropic.com/) +- 直接使用 Anthropic 的服务 +::: + +### 2. 启动服务 + +在 `docker-compose.yml` 所在目录执行以下命令: + +```bash +docker compose up -d +``` + +此命令将: +- 下载并启动 PostgreSQL 容器 +- 下载并启动 Hagicode 应用容器 +- 创建并配置网络 +- 初始化数据库连接 + +### 3. 验证服务状态 + +检查容器是否正在运行: + +```bash +docker compose ps +``` + +您应该看到两个容器都处于 "running" 状态。 + +查看服务日志: + +```bash +# 查看所有服务日志 +docker compose logs + +# 查看 Hagicode 服务日志 +docker compose logs hagicode + +# 实时跟踪日志 +docker compose logs -f hagicode +``` + +## 配置说明 + +如需修改配置(如更改端口、切换 API 提供商等),您可以: + +1. 重新使用 [Docker Compose Builder (独立站点)](https://builder.hagicode.com/) 生成新配置 +2. 手动编辑 `docker-compose.yml` 和 `.env` 文件 +3. 重启服务使配置生效: + +```bash +docker compose restart +``` + +## 访问应用 + +### Web 界面 + +服务启动成功后,通过浏览器访问: + +``` +http://localhost:45000 +``` + +### 数据库连接 + +如果您需要直接连接到 PostgreSQL 数据库,可以通过 `docker exec` 命令进入容器: + +```bash +# 进入 PostgreSQL 容器并连接到数据库 +docker exec -it hagicode-postgres psql -U postgres -d hagicode +``` + +**容器内连接信息**: +- **主机**: `localhost` 或 `127.0.0.1`(容器内) +- **端口**: `5432`(PostgreSQL 默认端口) +- **用户名**: `postgres` +- **密码**: `postgres` +- **数据库**: `hagicode` + +:::tip +PostgreSQL 未暴露到主机端口,这样更安全且避免端口冲突。如需从主机访问数据库,请使用 `docker exec` 命令。 +::: + +## 后续步骤 + +现在您已经成功部署了 Hagicode,请继续[创建第一个项目](/quick-start/create-first-project)以开始使用。 + +如果您更喜欢使用桌面应用方式部署,请参阅[Desktop 安装指南](/installation/desktop)。 diff --git a/src/content/docs/product-overview.mdx b/src/content/docs/product-overview.mdx new file mode 100644 index 0000000..2ea24f7 --- /dev/null +++ b/src/content/docs/product-overview.mdx @@ -0,0 +1,603 @@ +--- +title: Hagicode 产品概述 +description: 从产品定位、核心能力、技术架构和使用场景等多个维度,全面了解 Hagicode 这款 AI 驱动的代码开发辅助工具。 +--- + +本概述文档将帮助您从产品定位、核心能力、技术架构和使用场景等多个维度,全面了解 Hagicode 这款 AI 驱动的代码开发辅助工具。 + +## 为什么选择 Hagicode? + +在众多 AI 编程助手的选择中,你是否也曾遇到以下困惑? + +--- + +### 你是否在开发过程中发现 AI 自主混乱的操作,或者生成的代码不符合你的心意? + +**传统 AI 助手的困境**: +你说"优化数据库性能",AI 直接修改了 10 个文件,但改动的方向和你预期完全不同。你想说"先别动,让我看看计划",但 AI 已经开始执行了。 + +**Hagicode 的解决方案:提案驱动开发** + +Hagicode 的**提案会话模式**将抽象想法转化为结构化的实施计划: +- **明确的目标和范围界定** - AI 先问你具体要优化什么,确认范围再动手 +- **可执行的任务清单** - 生成详细的任务列表,你可以审查和调整 +- **清晰的验证标准** - 完成后如何验证,事先说清楚 +- **完整的设计决策记录** - 为什么这么做,有据可查 + +![提案驱动开发示意图](./img/product-overview/value-proposition-proposal-driven/illustration.png) + +> "从想法到代码的规范路径,让每一次变更都可追溯、可审查、可复用。" + +--- + +### 你是否担心 AI 分析代码时意外修改文件,或者不敢让 AI 接触复杂项目? + +**传统 AI 助手的困境**: +你想让 AI 帮忙理解一个陌生项目的架构,但担心 AI 乱改文件。你想安全探索代码,但 AI 助手总是"忍不住"要动手修改点什么。 + +**Hagicode 的解决方案:只读/编辑双模式** + +Hagicode 独创的**双模式设计**,让你在不同场景选择最合适的工作方式: +- **只读模式**: AI 深入分析代码库,解释架构逻辑,找出潜在问题,但**绝不修改任何文件**——适合安全探索和理解复杂项目 +- **编辑模式**: AI 动手实现功能、修复 bug、执行重构——适合快速开发和迭代优化 + +![只读/编辑双模式示意图](./img/product-overview/value-proposition-dual-mode/illustration.png) + +> "细粒度的权限控制,让你既能大胆探索,又能放心实践。" + +--- + +### 你是否觉得 AI 只是"代码生成器",缺乏对整个项目的深度理解? + +**传统 AI 助手的困境**: +AI 能帮你写函数、写组件,但对项目的整体架构、业务逻辑、设计模式一无所知。每次都要你详细解释上下文,效率低下。 + +**Hagicode 的解决方案:深度代码理解的编程搭档** + +Hagicode 不仅是"代码生成器",更是你的"编程搭档": +- **深度代码理解** - AI 分析整个代码库,理解项目架构、设计模式和业务逻辑 +- **智能对话交互** - 支持富文本消息、工具调用、任务管理,像和经验丰富的同事协作 +- **多会话并发** - 同时处理多个任务,在不同会话间自由切换 + +![AI 辅助编码示意图](./img/product-overview/value-proposition-ai-assisted-coding/illustration.png) + +> "超越代码生成的智能助手,真正理解你的代码。" + +--- + +### 你是否怀疑过:这个工具真的好用吗?连开发者自己都不用,凭什么让我用? + +**传统 AI 助手的困境**: +很多 AI 工具宣传得天花乱坠,但你发现开发者自己根本不用。如果一个工具连自己的开发者都无法有效使用,又如何帮助其他人? + +**Hagicode 的证明:自举特性** + +Hagicode 最独特的优势:**它用自己的技术栈构建了自己**。这不是营销口号,而是事实: +- Hagicode 的**文档系统**是用本工具创建和优化的 +- Hagicode 的**仓库管理**使用本工具进行提案管理 +- Hagicode 的**持续迭代**通过本工具的提案会话规划 + +![自举特性示意图](./img/product-overview/value-proposition-self-bootstrapping/illustration.png) + +你现在阅读的这份文档,就是使用 Hagicode 优化的成果。 + +> "用工具开发工具的最好证明——我们自己都在用。" + +--- + +### 谁最适合使用 Hagicode? + +如果你符合以下任一描述,Hagicode 就是为你打造的: + +- **新人工程师** - 快速理解陌生代码库,缩短从入职到独立开发的时间 +- **技术负责人** - 通过提案工作流管理复杂变更,确保代码质量和架构一致性 +- **开源维护者** - 高效处理 PR,自动化代码审查,管理项目规范和知识 +- **独立开发者** - 获得全栈开发支持,从设计到实现的一站式 AI 助手 + +## 一个真实的场景 + +想象你刚加入一个新团队,面前是一个拥有几十万行代码的仓库。按照传统方式,你需要花几天时间阅读文档、调试代码、到处询问同事,才能勉强理解项目结构。 + +现在想象另一种方式:你打开 Hagicode,创建一个"只读会话",问 AI:"这个项目的核心架构是什么?"几分钟内,你不仅获得了清晰的架构图,还了解了关键模块的设计思路和业务逻辑。当你准备动手实现第一个功能时,你切换到"编辑模式",AI 帮你完成编码,并解释每个修改的意图。 + +这不再是科幻想象——这就是 Hagicode 能带给你的体验。 + +## 自举证明 - 工具开发工具 + +Hagicode 最独特的优势在于:**它用自己的技术栈构建了自己**。这不是营销口号,而是事实——Hagicode 的文档系统、仓库管理和持续迭代都使用了本工具开发。 + +### 文档系统自举 + +你现在阅读的这份文档,就是使用 Hagicode 创建和优化的: + +![文档系统自举流程图](./img/product-overview/self-bootstrapping-documentation/illustration.png) + +- **提案驱动**: 文档优化通过 OpenSpec 提案流程实施,包含结构化计划和验收标准 +- **AI 辅助编写**: 内容草稿由 AI 根据需求生成,开发者审查和调整 +- **自动优化**: AI 分析文档结构,提出改进建议并执行优化 + +你可以查看 [openspec/changes/product-overview-optimization/](https://github.com/newbe36524/pcode-docs/tree/newdocs/openspec/changes/product-overview-optimization/) 提案,了解这份文档是如何被优化的。 + +### 仓库管理自举 + +Hagicode 的项目管理和 SDD(软件设计文档)功能也在管理着自己的开发: + +![仓库管理自举示意图](./img/product-overview/self-bootstrapping-repository/illustration.png) + +- **项目知识沉淀**: 每个功能的设计决策都记录在 OpenSpec 提案中 +- **变更追溯**: 从需求分析到代码实现,完整记录开发过程 +- **规范驱动**: 严格遵守自己定义的开发规范和最佳实践 + +当你使用 Hagicode 管理项目时,你使用的正是 Hagicode 自己在用的功能。 + +### 持续迭代自举 + +Hagicode 的功能迭代也在使用自己的工具: + +![持续迭代自举流程图](./img/product-overview/self-bootstrapping-iteration/illustration.png) + +- **新功能提案**: 新特性通过提案会话创建和规划 +- **代码审查**: AI 自动检查代码质量,提出改进建议 +- **文档同步**: 功能更新时,文档自动同步更新 + +这种"自举"特性证明了 Hagicode 的实用性和成熟度——如果一个工具连自己都无法有效开发,又如何帮助开发者呢? + +## 产品定位 + +### Hagicode 是什么? + +**Hagicode** 是一个深度集成到开发工作流中的 AI 编程助手,它不仅帮你写代码,更帮你管理想法、追踪进度、沉淀知识。 + +与传统 AI 编程助手不同,Hagicode 专注于**规范化管理和知识沉淀**,特别适合需要长期维护的团队项目。 + +### 与竞品的差异化 + +你可能已经了解 VS Code Copilot、Cursor AI、Kilo 或 Claude Code,它们都很优秀。但 Hagicode 有一些独特的优势: + +![竞品对比图](./img/product-overview/positioning-competitive-comparison/illustration.png) + +| 特性 | 传统 AI 助手 | Hagicode | +|------|-------------|----------| +| **开发模式** | 直接对话和代码修改 | 提案会话驱动,先规划后实施 | +| **权限控制** | AI 可直接修改文件 | 只读/编辑双模式,细粒度权限控制 | +| **知识管理** | 依赖 git 历史和注释 | OpenSpec 工作流自动沉淀设计决策 | +| **变更追溯** | 分散在提交历史和聊天记录 | 提案归档完整记录设计思路和实施过程 | +| **团队协作** | 个人效率工具 | 内置项目管理和团队知识共享功能 | +| **适用场景** | 快速编码辅助 | 复杂变更管理、团队知识沉淀 | + +### 适用场景 + +Hagicode 特别适合以下场景: + +- **复杂功能开发** - 需要多步骤实施的复杂变更,通过提案会话规范管理 +- **团队知识管理** - 需要沉淀设计决策和实施理由,避免知识流失 +- **代码库理解** - 新人快速理解陌生代码库,缩短上手时间 +- **规范驱动开发** - 需要遵循规范的团队,确保变更可追溯和可审查 + +## 真实使用故事 + +### 故事 1: 新人上手不再焦虑 + +**角色**: 刚加入团队的软件工程师小王 + +**挑战**: 面对一个陌生的电商系统代码库(50,000+ 行代码),需要在 5 个工作日内完成订单模块的新功能 + +![新人上手场景插图](./img/product-overview/story-newcomer-onboarding/illustration.png) + +**传统方式**: 小王花了前 3 天阅读文档、调试代码,在团队群里问了 50+ 个问题,才勉强理解现有架构。第 4 天开始编码,因为对代码库不熟悉,改出了 3 个 bug,又花了 2 天修复。 + +**使用 Hagicode 后**: +- **第 1 天**: 小王创建只读会话,问 AI:"订单模块的核心流程是什么?"AI 不仅解释了流程,还画出了时序图,指出 15 个关键文件和 5 个潜在风险点。理解时间从 3 天缩短到 4 小时。 +- **第 2 天**: 小王切换到编辑模式,和 AI 讨论实现方案,AI 帮他完成了 80% 的核心代码,并解释每个修改的意图。 +- **第 3 天**: 小王用 AI 审查代码,发现并修复了 4 个边界条件问题,提交代码并通过审查。 + +**结果**: 原来 5 天的工作,3 天完成(效率提升 40%),代码质量评分从 75 分提升到 90 分。 + +### 故事 2: 复杂变更不再混乱 + +**角色**: 技术负责人李经理 + +**挑战**: 团队提出"重构支付系统"的想法,涉及 20+ 个文件,担心改出新问题 + +![复杂变更场景插图](./img/product-overview/story-complex-change/illustration.png) + +**传统方式**: 李经理自己写 15 页设计文档,列出 30+ 个任务,分派给 3 名团队成员。实施过程中: +- 2 个边界情况被遗漏 +- 1 名成员误解设计意图 +- 代码审查时发现 8 个问题 +- 返工重做花费 3 天 + +**使用 Hagicode 后**: +- 李经理创建提案会话,描述:"重构支付系统,支持多种支付方式,提高可扩展性" +- AI 自动生成结构化提案(proposal.md),包含 1 个目标、3 个范围、28 个任务和 12 个验证标准 +- 团队成员审查提案,调整 5 处细节后,按任务清单逐步实施 +- 每个任务完成后,自动标记进度,遇到 3 个问题时 AI 提供解决方案 +- 完成后 12 个验证标准全部通过,提案归档到 `changes/archive/` + +**结果**: 变更过程规范有序,代码审查时间减少 60%,新成员可以在 30 分钟内通过归档提案理解设计思路。 + +### 故事 3: 团队知识不再流失 + +**角色**: 项目经理张总监 + +**挑战**: 核心开发者离职,带走了大量隐性知识,2 名新成员接手困难 + +![团队知识管理场景插图](./img/product-overview/story-team-knowledge/illustration.png) + +**传统方式**: 知识散落在 100+ 个代码注释、50+ 个个人笔记、无数条聊天记录中。新成员只能边做边猜: +- 平均每人每天问 20+ 个问题 +- 重复实现已有功能 3 次 +- 代码风格不统一 + +**使用 Hagicode 后**: +- 每个功能通过 OpenSpec 工作流实施,自动记录设计思路、实现过程和决策理由 +- 历史提案归档在 `openspec/changes/archive/`,包含 25 个已完成提案,可以按时间、功能分类查看 +- 新成员加入时,张总监让新成员阅读 5 个相关提案,快速理解"为什么这么做" +- SDD 文档自动维护,始终保持最新状态,包含 15 个核心模块的设计文档 + +**结果**: 知识不再流失,新成员上手时间从 3 周缩短到 5 天(效率提升 70%),团队问题数量减少 80%。 + +## 核心特性详解 + +Hagicode 的功能按三层架构组织,从核心能力到集成体验,为开发者提供完整的开发支持。 + +![核心特性三层架构图](./img/product-overview/core-features-architecture/illustration.png) + +### 核心特性层 - 开发工作流的基础 + +#### 会话管理 + +- **普通会话** - 与 AI 进行传统聊天式交互,支持代码分析、审查和修改 + - 只读模式: AI 可以读取、分析、描述代码,但无法进行修改——适合安全探索代码库 + - 编辑模式: AI 具备文件修改权限,可以实现功能、修复 bug、执行重构——适合快速开发 +- **提案会话** - 基于想法的结构化工作流,将抽象想法转化为具体执行计划 +- **会话详情** - 查看会话历史、消息记录和执行结果 +- **并发控制** - 管理多个同时进行的会话,避免资源冲突 + +#### 对话功能 + +- **消息渲染** - 支持 Markdown 代码块、语法高亮、表格和列表的富文本消息展示 +- **工具调用** - AI 可以调用各种工具执行文件操作、运行命令、搜索代码等 +- **待办任务** - AI 可以创建和管理任务清单,追踪实现进度 +- **视图模式** - 支持不同的消息视图模式,适应不同屏幕和阅读偏好 + +#### 提案会话 + +- **提案创建** - 将想法转化为结构化的提案文档,包含目标、范围、任务和验证标准 +- **任务管理** - 按计划逐步实施,每个变更都有迹可循 +- **进度追踪** - 实时查看任务完成状态,遇到问题及时调整 + +### 集成能力层 - 项目开发的扩展 + +#### OpenSpec 工作流 + +- **规范驱动开发** - 遵循提案→实施→归档的规范流程,确保变更的可追溯性和质量 +- **图表支持** - 使用 Mermaid 绘制架构图、流程图、状态图,可视化设计思路 +- **project.md 优化** - AI 自动分析和优化项目配置文件,添加领域上下文和提示词配置 +- **提案归档** - 完成后的提案自动归档,形成项目知识库 + +#### 图表和注释 + +- **Mermaid 图表** - 支持思维导图、流程图、序列图等多种图表类型 +- **注释管理** - 在代码中添加和管理注释,帮助 AI 更好地理解代码意图 +- **文档同步** - 图表和注释自动同步到文档,保持文档与代码一致 + +#### 项目管理 + +- **项目列表** - 查看和管理所有项目,快速切换工作空间 +- **项目详情** - 深入了解项目结构、SDD 状态和配置信息 +- **项目创建** - 简单几步添加新项目,自动识别 Git 仓库 +- **SDD 管理** - 初始化和管理软件设计文档,沉淀项目知识 + +### 用户体验层 - 个性化的开发环境 + +#### 配置和设置 + +- **会话配置** - 自定义会话行为,设置只读/编辑模式默认值 +- **模型选择** - 选择不同的 AI 模型,平衡性能和成本 +- **工具权限** - 配置 AI 可用的工具和操作权限 + +#### 主题自定义 + +- **浅色/深色主题** - 支持系统主题自动切换 +- **代码高亮** - 自定义代码块的语法高亮样式 +- **字体大小** - 调整界面文字大小,适应不同阅读习惯 + +#### 统计成就 + +- **使用统计** - 查看会话次数、消息数量、任务完成情况 +- **成就系统** - 解锁使用成就,记录开发里程碑 +- **导出数据** - 导出使用数据和会话记录 + +### 核心特性思维导图 + +```mermaid +mindmap + root((Hagicode
核心特性)) + 核心特性层 + 会话管理 + 普通会话 + 提案会话 + 会话详情 + 并发控制 + 对话功能 + 消息渲染 + 工具调用 + 待办任务 + 视图模式 + 提案会话 + 提案创建 + 任务管理 + 进度追踪 + 集成能力层 + OpenSpec工作流 + 规范驱动开发 + 图表支持 + project.md优化 + 提案归档 + 图表注释 + Mermaid图表 + 注释管理 + 文档同步 + 项目管理 + 项目列表 + 项目详情 + 项目创建 + SDD管理 + 用户体验层 + 配置设置 + 会话配置 + 模型选择 + 工具权限 + 主题自定义 + 浅色深色主题 + 代码高亮 + 字体大小 + 统计成就 + 使用统计 + 成就系统 + 导出数据 +``` + +## 使用示例 + +通过具体示例了解如何使用 Hagicode 的核心功能。 + +### 提案驱动开发示例 + +假设你需要"重构用户认证模块,支持多因素认证"。 + +**传统方式**: +1. 自己编写设计文档 +2. 列出任务清单 +3. 分派给团队 +4. 实施过程中容易遗漏边界情况 +5. 代码审查时发现问题,返工重做 + +**使用 Hagicode 提案会话**: + +1. **创建提案会话**: +``` +用户: 重构用户认证模块,支持多因素认证 + +AI: 我来帮你创建一个结构化提案。 + +[生成 proposal.md,包含:] +- 目标: 重构认证模块,支持短信、邮箱、TOTP 多因素认证 +- 范围: 认证服务、数据库模型、前端界面 +- 任务清单: + 1. 设计新的认证流程 + 2. 更新数据库模型 + 3. 实现多因素认证后端 + 4. 更新前端登录界面 + 5. 编写单元测试 + 6. 更新文档 +- 验证标准: + - 所有认证方式正常工作 + - 测试覆盖率 > 80% + - 文档完整更新 +``` + +2. **审查和调整提案**: +``` +用户: 看起来不错,但还需要添加备用码功能 + +AI: 好的,我更新提案,添加备用码生成和验证功能。 +``` + +3. **按计划实施**: +``` +用户: 开始实施第一个任务 + +AI: 正在实施任务 1: 设计新的认证流程... +[展示流程图,解释设计思路] +``` + +**优势**: 整个过程规范有序,可追溯,代码审查更轻松。 + +### 双模式会话示例 + +Hagicode 的只读/编辑模式让你在不同场景下选择最合适的工作方式。 + +**场景 1: 只读模式 - 安全探索代码库** + +你刚接手一个新项目,想了解订单处理流程: + +``` +用户: 订单模块的核心流程是什么?(只读模式) + +AI: 让我分析订单模块的代码... + +[分析结果:] +订单处理流程: +1. 用户下单 → OrderService.createOrder() +2. 库存检查 → InventoryService.checkStock() +3. 支付处理 → PaymentService.processPayment() +4. 订单确认 → OrderService.confirmOrder() + +关键文件: +- src/services/OrderService.ts +- src/services/InventoryService.ts +- src/services/PaymentService.ts + +潜在风险: +- 库存检查和支付处理之间可能存在竞态条件 +- 建议添加分布式锁 + +注意: 当前为只读模式,我未修改任何文件。 +``` + +**场景 2: 编辑模式 - 快速实现功能** + +你了解了代码库后,准备添加新功能: + +``` +用户: 添加订单取消功能(编辑模式) + +AI: 好的,我来实现订单取消功能。 + +[正在修改文件:] +- 更新 OrderService.ts,添加 cancelOrder() 方法 +- 更新数据库模型,添加订单状态字段 +- 更新 API 路由 + +[完成:] +订单取消功能已实现: +- 只有未支付的订单可以取消 +- 取消后自动释放库存 +- 发送取消通知给用户 + +是否需要我编写测试? +``` + +**优势**: 先只读理解,再编辑实现,安全又高效。 + +### AI 辅助编码示例 + +Hagicode 不仅生成代码,更是你的编程搭档。 + +**场景: 复杂算法实现** + +你需要实现一个高效的缓存淘汰策略: + +``` +用户: 实现 LRU 缓存淘汰算法 + +AI: 好的,我来实现 LRU(最近最少使用)缓存。 + +[实现思路:] +使用哈希表 + 双向链表: +- 哈希表: O(1) 查找 +- 双向链表: O(1) 插入和删除 + +[生成代码:] +class LRUCache { + constructor(capacity) { + this.capacity = capacity; + this.cache = new Map(); + } + + get(key) { + if (!this.cache.has(key)) return -1; + // 重新插入以更新顺序 + const value = this.cache.get(key); + this.cache.delete(key); + this.cache.set(key, value); + return value; + } + + put(key, value) { + if (this.cache.has(key)) { + this.cache.delete(key); + } else if (this.cache.size >= this.capacity) { + // 删除最久未使用的项 + const firstKey = this.cache.keys().next().value; + this.cache.delete(firstKey); + } + this.cache.set(key, value); + } +} + +[测试用例:] +const cache = new LRUCache(2); +cache.put(1, 'a'); +cache.put(2, 'b'); +cache.get(1); // 返回 'a' +cache.put(3, 'c'); // 淘汰 key 2 +cache.get(2); // 返回 -1(已淘汰) + +时间复杂度: +- get: O(1) +- put: O(1) + +空间复杂度: O(capacity) +``` + +**优势**: AI 不仅生成代码,还解释设计思路和复杂度分析。 + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +## 从这里开始 + +根据您的角色和需求,选择最适合的阅读路径。 + +### 新用户推荐路径 + + + + + + + + + + + +### 选择安装方式 + +根据您的需求选择最合适的安装方式: + + + + + + + + + +### 不同角色的快速入口 + + + + + + + + + + + +--- + +**需要帮助?** + +如果您在阅读本文档时有任何疑问,或发现需要改进的地方,欢迎: +- 在 GitHub 上提 Issue 报告问题或建议 +- 查看其他快速入门文档获取更多细节 +- 联系团队获取支持 diff --git a/src/content/docs/quick-start/conversation-session.md.backup b/src/content/docs/quick-start/conversation-session.md.backup new file mode 100644 index 0000000..18a427d --- /dev/null +++ b/src/content/docs/quick-start/conversation-session.md.backup @@ -0,0 +1,309 @@ +--- +title: 创建普通会话 +description: 了解如何在 Hagicode 中创建和使用普通会话与 AI 进行交互。 +sidebar_position: 30 +--- + +准备好和 AI 聊天了吗?本指南会向你展示如何在 Hagicode 中创建和使用普通会话。普通会话是你与 AI 进行代码分析、审查、规划和修改的主要方式——就像和一个经验丰富的同事对话一样自然。 + +## 先决条件 + +在创建普通会话之前,请确保你已经: + +- 创建了项目(参见[创建您的第一个项目](/quick-start/create-first-project)) + +## Hagicode 中的会话类型 + +Hagicode 支持两种会话类型,每种都针对不同的工作流程而设计: + +### 普通会话(本指南) + +普通会话是与 AI 的传统聊天式交互。它们适用于: + +- 询问有关代码库的问题 +- 获取代码解释和摘要 +- 规划和设计实现 +- 代码审查和反馈 +- 在编辑模式下进行代码修改 + +### 主意会话 + +主意会话(在下一个指南中介绍)提供了一个结构化的工作流程,用于将想法转化为执行的变更。它们包括规划、分解和执行阶段。 + +## 创建普通会话 + +按照以下步骤创建一个新的普通会话: + +### 步骤 1:点击"添加聊天"按钮 + +在 Hagicode 界面左侧的会话列表顶部,点击 **+ Add Chat**(添加聊天)按钮。这将直接创建一个新的普通会话。 + +![点击新建会话按钮创建普通会话](/img/create-normal-session/01-create-normal-session.png) + +### 步骤 2:开始聊天 + +创建普通会话后,在 Chat tab 下面的输入框中输入消息,就可以开始与 AI 进行 vibeCoding 了。 + +![点击普通会话可以在 Chat tab 下面的输入框进行 vibeCoding](/img/create-normal-session/02-chat-input.png) + +## 了解模式 + +Hagicode 普通会话以两种不同的模式运行,具有不同的功能和安全含义。 + +### 只读模式(默认) + +当您创建新的普通会话时,它以**只读模式**启动。这是探索和理解代码库的最安全模式。 + +:::tip[只读模式是默认模式] +新创建的普通会话默认使用只读模式,这意味着 AI 可以读取和分析您的代码,但无法进行任何修改。 +::: + +#### 只读模式演示 + +让我们通过一个实际示例来了解只读模式的工作方式。假设您想了解项目结构: + +1. **发送只读消息**:在聊天输入框中输入"了解一下这个项目" +2. **AI 分析项目**:AI 会读取项目文件并分析结构 +3. **查看分析结果**:AI 返回项目结构的详细说明 + +![发送内容之后可以在会话区看到当前 AI 的回答](/img/create-normal-session/03-ai-response.png) + +在只读模式下,AI 会分析您的项目并返回结构化信息: + +![最后可以看到 AI 的执行结果](/img/create-normal-session/04-execution-result.png) + +**AI 在只读模式下可以做的事情:** + +- 读取和分析项目中的文件 +- 回答有关代码结构和逻辑的问题 +- 提供解释和摘要 +- 审查代码并提出改进建议 +- 规划实现方法 + +**AI 在只读模式下无法做的事情:** + +- 修改任何文件 +- 创建新文件 +- 删除现有文件 +- 运行更改项目的命令 + +### 编辑模式 + +**编辑模式**授予 AI 修改项目中文件的权限。当您希望 AI 进行更改时,必须手动启用此模式。 + +:::caution[安全提示] +编辑模式允许 AI 修改您的文件。仅当您信任 AI 的建议并希望对代码库应用更改时才启用此模式。 +::: + +#### 如何切换到编辑模式 + +普通会话默认是只读模式,您可以随时切换到编辑模式: + +1. 在对话窗口中找到**模式切换按钮**(通常在输入框附近) +2. 点击按钮从"只读"模式切换到"编辑"模式 +3. 模式指示器将更新以显示编辑模式已激活 + +![普通会话默认是只读的可以点击编辑按钮进行模式切换](/img/create-normal-session/05-mode-switch.png) + +#### 编辑模式演示 + +让我们通过一个实际示例来了解编辑模式的工作方式。假设您希望 AI 更新 README 文件: + +1. **切换到编辑模式**:点击编辑按钮启用编辑权限 +2. **发送编辑请求**:输入"更新 README 文件"或具体的修改要求 +3. **AI 执行修改**:AI 会读取文件、应用更改并保存 +4. **查看文件变化**:AI 返回修改结果,您可以查看具体变更 + +![发送带有编辑权限消息的展示效果](/img/create-normal-session/06-edit-permission.png) + +在编辑模式下,AI 会直接修改您的文件。您可以看到具体的变更内容: + +![刚才我们进行编辑之后的 README 变化](/img/create-normal-session/07-readme-changes.png) + +**何时使用编辑模式:** + +- 您希望 AI 实现某个功能 +- 您需要应用错误修复 +- 您希望执行重构 +- 您需要创建新文件 + +### 模式切换流程 + +以下是只读模式和编辑模式的对比: + +| 特性 | 只读模式 | 编辑模式 | +|------|---------|---------| +| **图标** | 🔒 只读 | ✏️ 编辑 | +| **默认状态** | ✅ 是 | ❌ 否 | +| **读取文件** | ✅ 支持 | ✅ 支持 | +| **分析代码** | ✅ 支持 | ✅ 支持 | +| **修改文件** | ❌ 不支持 | ✅ 支持 | +| **创建文件** | ❌ 不支持 | ✅ 支持 | +| **删除文件** | ❌ 不支持 | ✅ 支持 | +| **安全性** | 🔒 安全 | ⚠️ 需谨慎 | +| **使用场景** | 理解代码、审查、规划 | 实现功能、修复 bug | + +```mermaid +flowchart TD + A[用户启动会话] --> B[默认: 只读模式] + B --> B1[AI 可以读取] + B --> B2[AI 无法修改] + B --> C{用户希望 AI 进行更改?} + C -->|是| D[切换到编辑模式] + D --> E[编辑模式] + E --> E1[AI 可以读取] + E --> E2[AI 可以修改文件] + C -->|否| F[保持只读模式] +``` + +#### 只读模式工作流程 + +```mermaid +sequenceDiagram + participant User as 👤 用户 + participant Hagicode as 🖥️ Hagicode 界面 + participant AI as 🤖 AI 助手 + participant FS as 📁 文件系统 + + Note over User,FS: 只读模式工作流程 + User->>Hagicode: 1. 创建普通会话 + User->>Hagicode: 2. 发送消息"了解一下这个项目" + Hagicode->>AI: 3. 请求分析(只读权限) + AI->>FS: 4. 读取项目文件 + FS->>AI: 5. 返回文件内容 + AI->>AI: 6. 分析项目结构 + AI->>Hagicode: 7. 返回分析结果 + Hagicode->>User: 8. 显示 AI 回答 + + Note over User,FS: 🔒 AI 无法修改任何文件 +``` + +#### 编辑模式工作流程 + +```mermaid +sequenceDiagram + participant User as 👤 用户 + participant Hagicode as 🖥️ Hagicode 界面 + participant AI as 🤖 AI 助手 + participant FS as 📁 文件系统 + + Note over User,FS: 编辑模式工作流程 + User->>Hagicode: 1. 点击"编辑"按钮切换模式 + Hagicode->>User: 2. 模式切换为"编辑" + User->>Hagicode: 3. 发送消息"更新 README 文件" + Hagicode->>AI: 4. 请求修改(编辑权限) + AI->>FS: 5. 读取 README.md + FS->>AI: 6. 返回文件内容 + AI->>AI: 7. 生成更新内容 + AI->>FS: 8. 写入 README.md + FS->>AI: 9. 确认修改成功 + AI->>Hagicode: 10. 返回修改结果 + Hagicode->>User: 11. 显示文件变更 + + Note over User,FS: ✏️ AI 可以修改文件 +``` + +## 典型使用场景 + +### 分析和理解 + +在只读模式下使用普通会话来理解您的代码库。例如,您可以询问 AI "了解一下这个项目",就像前面的[只读模式演示](#只读模式演示)中展示的那样: + +- **项目摘要**:"给我这个项目架构的概述" +- **代码解释**:"解释身份验证系统是如何工作的" +- **架构问题**:"这个代码库中使用了哪些设计模式?" + +示例: +``` +用户:你能解释一下用户服务如何处理注册吗? + +AI:用户服务通过多步骤流程处理注册... +[注册流程的详细解释] +``` + +### 审查和反馈 + +在只读模式下获取有关代码的 AI 反馈: + +- **代码审查**:"审查此函数是否存在潜在问题" +- **最佳实践**:"此代码是否遵循最佳实践?" +- **发现错误**:"此实现中是否有任何错误?" + +示例: +``` +用户:审查 UserService.cs 文件是否存在潜在问题 + +AI:我已经审查了 UserService.cs,发现了几个可以改进的地方... +[列出具体问题和建议] +``` + +### 规划和设计 + +使用会话在实施之前规划您的工作: + +- **任务分解**:"分解新功能的实现" +- **实施规划**:"添加缓存的最佳方法是什么?" +- **设计讨论**:"这里应该使用工厂模式还是建造者模式?" + +示例: +``` +用户:我需要添加文件上传功能。你能帮我规划一下吗? + +AI:这是实现文件上传的建议方法... +[分步实施计划] +``` + +### 代码更改(编辑模式) + +当您准备好进行更改时,切换到编辑模式。参考前面的[编辑模式演示](#编辑模式演示)了解如何进行文件修改: + +- **重构**:"重构此类以使用依赖注入" +- **错误修复**:"修复此方法中的空引用异常" +- **功能实现**:"实现用户配置文件更新端点" + +示例: +``` +用户:[切换到编辑模式] 请向 CreateUser 方法添加输入验证 + +AI:我将向 CreateUser 方法添加验证... +[将更改应用于文件] +``` + +## 会话管理 + +### 删除会话 + +当您不再需要某个会话时,可以删除它以保持会话列表的整洁: + +1. 在会话列表中找到要删除的会话 +2. 点击会话右上角的**删除**按钮(通常是一个垃圾桶图标) +3. 确认删除操作 + +![点击右上角的删除会话可以删除这个普通会话](/img/create-normal-session/08-delete-session.png) + +:::tip[删除会话的影响] +删除会话仅会删除该会话的聊天历史,不会影响您的项目文件或代码。 +::: + +## 后续步骤 + +现在您了解了普通会话,请继续探索: + +- **[创建第一个项目](/quick-start/create-first-project)**:设置您的第一个项目 +- **[提案会话](/quick-start/proposal-session)**:了解提案工作流 + +## 有效对话的技巧 + +1. **具体明确**:清晰的问题会带来更好的答案 + - *好*:"身份验证中间件如何验证令牌?" + - *模糊*:"身份验证是如何工作的?" + +2. **提供上下文**:引用特定的文件或组件 + - *好*:"在 UserService.cs 第 45 行,为什么用户被检查了两次?" + - *模糊*:"为什么有重复检查?" + +3. **从只读模式开始**:在进行更改之前先探索和理解 + +4. **有意使用编辑模式**:仅当您准备好应用更改时才切换 + +5. **迭代**:使用对话历史来完善您理解和 approach diff --git a/src/content/docs/quick-start/conversation-session.mdx b/src/content/docs/quick-start/conversation-session.mdx new file mode 100644 index 0000000..54d233e --- /dev/null +++ b/src/content/docs/quick-start/conversation-session.mdx @@ -0,0 +1,321 @@ +--- +title: 创建普通会话 +description: 了解如何在 Hagicode 中创建和使用普通会话与 AI 进行交互。 +sidebar_position: 30 +--- + + +准备好和 AI 聊天了吗?本指南会向你展示如何在 Hagicode 中创建和使用普通会话。普通会话是你与 AI 进行代码分析、审查、规划和修改的主要方式——就像和一个经验丰富的同事对话一样自然。 + +## 先决条件 + +在创建普通会话之前,请确保你已经: + +- 创建了项目(参见[创建您的第一个项目](/quick-start/create-first-project)) + +## Hagicode 中的会话类型 + +Hagicode 支持两种会话类型,每种都针对不同的工作流程而设计: + +### 普通会话(本指南) + +普通会话是与 AI 的传统聊天式交互。它们适用于: + +- 询问有关代码库的问题 +- 获取代码解释和摘要 +- 规划和设计实现 +- 代码审查和反馈 +- 在编辑模式下进行代码修改 + +### 主意会话 + +主意会话(在下一个指南中介绍)提供了一个结构化的工作流程,用于将想法转化为执行的变更。它们包括规划、分解和执行阶段。 + +## 创建普通会话 + +按照以下步骤创建一个新的普通会话: + +### 步骤 1:点击"添加聊天"按钮 + +在 Hagicode 界面左侧的会话列表顶部,点击 **+ Add Chat**(添加聊天)按钮。这将直接创建一个新的普通会话。 + +![点击新建会话按钮创建普通会话](../img/quick-start/create-normal-session/01-create-normal-session.png) + +### 步骤 2:开始聊天 + +创建普通会话后,在 Chat tab 下面的输入框中输入消息,就可以开始与 AI 进行 vibeCoding 了。 + +![点击普通会话可以在 Chat tab 下面的输入框进行 vibeCoding](../img/quick-start/create-normal-session/02-chat-input.png) + +## 了解模式 + +Hagicode 普通会话以两种不同的模式运行,具有不同的功能和安全含义。 + +### 只读模式(默认) + +当您创建新的普通会话时,它以**只读模式**启动。这是探索和理解代码库的最安全模式。 + +:::tip[只读模式是默认模式] +新创建的普通会话默认使用只读模式,这意味着 AI 可以读取和分析您的代码,但无法进行任何修改。 +::: + +#### 只读模式演示 + +让我们通过一个实际示例来了解只读模式的工作方式。假设您想了解项目结构: + +1. **发送只读消息**:在聊天输入框中输入"了解一下这个项目" +2. **AI 分析项目**:AI 会读取项目文件并分析结构 +3. **查看分析结果**:AI 返回项目结构的详细说明 + +![发送内容之后可以在会话区看到当前 AI 的回答](../img/quick-start/create-normal-session/03-ai-response.png) + +在只读模式下,AI 会分析您的项目并返回结构化信息: + +![最后可以看到 AI 的执行结果](../img/quick-start/create-normal-session/04-execution-result.png) + +**AI 在只读模式下可以做的事情:** + +- 读取和分析项目中的文件 +- 回答有关代码结构和逻辑的问题 +- 提供解释和摘要 +- 审查代码并提出改进建议 +- 规划实现方法 + +**AI 在只读模式下无法做的事情:** + +- 修改任何文件 +- 创建新文件 +- 删除现有文件 +- 运行更改项目的命令 + +### 编辑模式 + +**编辑模式**授予 AI 修改项目中文件的权限。当您希望 AI 进行更改时,必须手动启用此模式。 + +:::caution[安全提示] +编辑模式允许 AI 修改您的文件。仅当您信任 AI 的建议并希望对代码库应用更改时才启用此模式。 +::: + +#### 如何切换到编辑模式 + +普通会话默认是只读模式,您可以随时切换到编辑模式: + +1. 在对话窗口中找到**模式切换按钮**(通常在输入框附近) +2. 点击按钮从"只读"模式切换到"编辑"模式 +3. 模式指示器将更新以显示编辑模式已激活 + +![普通会话默认是只读的可以点击编辑按钮进行模式切换](../img/quick-start/create-normal-session/05-mode-switch.png) + +#### 编辑模式演示 + +让我们通过一个实际示例来了解编辑模式的工作方式。假设您希望 AI 更新 README 文件: + +1. **切换到编辑模式**:点击编辑按钮启用编辑权限 +2. **发送编辑请求**:输入"更新 README 文件"或具体的修改要求 +3. **AI 执行修改**:AI 会读取文件、应用更改并保存 +4. **查看文件变化**:AI 返回修改结果,您可以查看具体变更 + +![发送带有编辑权限消息的展示效果](../img/quick-start/create-normal-session/06-edit-permission.png) + +在编辑模式下,AI 会直接修改您的文件。您可以看到具体的变更内容: + +![刚才我们进行编辑之后的 README 变化](../img/quick-start/create-normal-session/07-readme-changes.png) + +**何时使用编辑模式:** + +- 您希望 AI 实现某个功能 +- 您需要应用错误修复 +- 您希望执行重构 +- 您需要创建新文件 + +### 模式切换流程 + +以下是只读模式和编辑模式的对比: + +| 特性 | 只读模式 | 编辑模式 | +|------|---------|---------| +| **图标** | 🔒 只读 | ✏️ 编辑 | +| **默认状态** | ✅ 是 | ❌ 否 | +| **读取文件** | ✅ 支持 | ✅ 支持 | +| **分析代码** | ✅ 支持 | ✅ 支持 | +| **修改文件** | ❌ 不支持 | ✅ 支持 | +| **创建文件** | ❌ 不支持 | ✅ 支持 | +| **删除文件** | ❌ 不支持 | ✅ 支持 | +| **安全性** | 🔒 安全 | ⚠️ 需谨慎 | +| **使用场景** | 理解代码、审查、规划 | 实现功能、修复 bug | + +```mermaid +flowchart TD + A[用户启动会话] --> B[默认: 只读模式] + B --> B1[AI 可以读取] + B --> B2[AI 无法修改] + B --> C{用户希望 AI 进行更改?} + C -->|是| D[切换到编辑模式] + D --> E[编辑模式] + E --> E1[AI 可以读取] + E --> E2[AI 可以修改文件] + C -->|否| F[保持只读模式] +``` + +#### 只读模式工作流程 + +```mermaid +sequenceDiagram + participant User as 👤 用户 + participant Hagicode as 🖥️ Hagicode 界面 + participant AI as 🤖 AI 助手 + participant FS as 📁 文件系统 + + Note over User,FS: 只读模式工作流程 + User->>Hagicode: 1. 创建普通会话 + User->>Hagicode: 2. 发送消息"了解一下这个项目" + Hagicode->>AI: 3. 请求分析(只读权限) + AI->>FS: 4. 读取项目文件 + FS->>AI: 5. 返回文件内容 + AI->>AI: 6. 分析项目结构 + AI->>Hagicode: 7. 返回分析结果 + Hagicode->>User: 8. 显示 AI 回答 + + Note over User,FS: 🔒 AI 无法修改任何文件 +``` + +#### 编辑模式工作流程 + +```mermaid +sequenceDiagram + participant User as 👤 用户 + participant Hagicode as 🖥️ Hagicode 界面 + participant AI as 🤖 AI 助手 + participant FS as 📁 文件系统 + + Note over User,FS: 编辑模式工作流程 + User->>Hagicode: 1. 点击"编辑"按钮切换模式 + Hagicode->>User: 2. 模式切换为"编辑" + User->>Hagicode: 3. 发送消息"更新 README 文件" + Hagicode->>AI: 4. 请求修改(编辑权限) + AI->>FS: 5. 读取 README.md + FS->>AI: 6. 返回文件内容 + AI->>AI: 7. 生成更新内容 + AI->>FS: 8. 写入 README.md + FS->>AI: 9. 确认修改成功 + AI->>Hagicode: 10. 返回修改结果 + Hagicode->>User: 11. 显示文件变更 + + Note over User,FS: ✏️ AI 可以修改文件 +``` + +## 典型使用场景 + +### 分析和理解 + +在只读模式下使用普通会话来理解您的代码库。例如,您可以询问 AI "了解一下这个项目",就像前面的[只读模式演示](#只读模式演示)中展示的那样: + +- **项目摘要**:"给我这个项目架构的概述" +- **代码解释**:"解释身份验证系统是如何工作的" +- **架构问题**:"这个代码库中使用了哪些设计模式?" + +示例: +``` +用户:你能解释一下用户服务如何处理注册吗? + +AI:用户服务通过多步骤流程处理注册... +[注册流程的详细解释] +``` + +### 审查和反馈 + +在只读模式下获取有关代码的 AI 反馈: + +- **代码审查**:"审查此函数是否存在潜在问题" +- **最佳实践**:"此代码是否遵循最佳实践?" +- **发现错误**:"此实现中是否有任何错误?" + +示例: +``` +用户:审查 UserService.cs 文件是否存在潜在问题 + +AI:我已经审查了 UserService.cs,发现了几个可以改进的地方... +[列出具体问题和建议] +``` + +### 规划和设计 + +使用会话在实施之前规划您的工作: + +- **任务分解**:"分解新功能的实现" +- **实施规划**:"添加缓存的最佳方法是什么?" +- **设计讨论**:"这里应该使用工厂模式还是建造者模式?" + +示例: +``` +用户:我需要添加文件上传功能。你能帮我规划一下吗? + +AI:这是实现文件上传的建议方法... +[分步实施计划] +``` + +### 代码更改(编辑模式) + +当您准备好进行更改时,切换到编辑模式。参考前面的[编辑模式演示](#编辑模式演示)了解如何进行文件修改: + +- **重构**:"重构此类以使用依赖注入" +- **错误修复**:"修复此方法中的空引用异常" +- **功能实现**:"实现用户配置文件更新端点" + +示例: +``` +用户:[切换到编辑模式] 请向 CreateUser 方法添加输入验证 + +AI:我将向 CreateUser 方法添加验证... +[将更改应用于文件] +``` + +## 会话管理 + +### 删除会话 + +当您不再需要某个会话时,可以删除它以保持会话列表的整洁: + +1. 在会话列表中找到要删除的会话 +2. 点击会话右上角的**删除**按钮(通常是一个垃圾桶图标) +3. 确认删除操作 + +![点击右上角的删除会话可以删除这个普通会话](../img/quick-start/create-normal-session/08-delete-session.png) + +:::tip[删除会话的影响] +删除会话仅会删除该会话的聊天历史,不会影响您的项目文件或代码。 +::: + +## 后续步骤 + +现在您了解了普通会话,请继续探索: + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + + + + + + + + + +## 有效对话的技巧 + +1. **具体明确**:清晰的问题会带来更好的答案 + - *好*:"身份验证中间件如何验证令牌?" + - *模糊*:"身份验证是如何工作的?" + +2. **提供上下文**:引用特定的文件或组件 + - *好*:"在 UserService.cs 第 45 行,为什么用户被检查了两次?" + - *模糊*:"为什么有重复检查?" + +3. **从只读模式开始**:在进行更改之前先探索和理解 + +4. **有意使用编辑模式**:仅当您准备好应用更改时才切换 + +5. **迭代**:使用对话历史来完善您理解和 approach diff --git a/src/content/docs/quick-start/create-first-project.md.backup b/src/content/docs/quick-start/create-first-project.md.backup new file mode 100644 index 0000000..16e7411 --- /dev/null +++ b/src/content/docs/quick-start/create-first-project.md.backup @@ -0,0 +1,177 @@ +--- +title: 创建您的第一个项目 +description: 学习如何在 Hagicode 中创建和配置您的第一个项目,从仓库准备到 OpenSpec 初始化。 +sidebar_position: 20 +--- + +欢迎来到 Hagicode!安装完成后,让我们创建你的第一个项目。本指南会带你一步步完成设置,从准备代码仓库到初始化 OpenSpec,就像朋友手把手教你一样。 + +## 先决条件 + +在创建第一个项目之前,请确保你具备: + +- 一个想要使用 Hagicode 管理的代码仓库 +- 已安装并配置 Git +- 对命令行操作的基本了解 + +别担心,这些都很简单! + +## 步骤 1:准备您的代码仓库 + +在将项目添加到 Hagicode 之前,您需要准备一个想要用 Hagicode 管理的代码仓库。 + +### 克隆您的代码仓库 + +如果您想要管理的代码已经在远程仓库(GitHub、GitLab 等)中,请将其克隆到本地: + +```bash +# 克隆您的代码仓库到本地 +git clone https://github.com/your-username/your-repo.git +cd your-repo +``` + +克隆后,记下仓库的本地路径(例如:`C:\Users\YourName\Projects\your-repo` 或 `/home/yourname/projects/your-repo`),在下一步中您将需要这个路径。 + +:::tip +Hagicode 适合管理任何您想要通过 AI 辅助开发和优化的代码项目,包括: +- 正在开发的功能项目 +- 需要重构或优化的现有代码 +- 团队协作的项目 +- 个人开源项目 +::: + +### 如果您的代码只在本地 + +如果您想要管理的代码还在本地,尚未推送到远程仓库: + +```bash +cd /path/to/your/project +git init +git add . +git commit -m "Initial commit" +``` + +建议在 GitHub/GitLab 上创建远程仓库并推送: + +```bash +git remote add origin https://github.com/your-username/your-repo.git +git push -u origin main +``` + +## 步骤 2:在 Hagicode 界面中添加项目 + +现在让我们将项目添加到 Hagicode 界面。 + +### 访问项目页面 + +1. 在浏览器中导航到 `http://127.0.0.1:34567` +2. 点击导航侧边栏中的 **Projects**(项目) +3. 点击 **Add Project**(添加项目)按钮 + +![点击新建项目按钮](/img/create-project/step1-click-new-project-button.png) + +### 配置项目设置 + +填写项目信息: + +![填写项目的一般信息](/img/create-project/step2-fill-project-information.png) + +:::note +仓库路径必须指向本地计算机上有效的 Git 仓库。 +::: + +:::note[Docker Compose 部署注意事项] +如果您使用的是 **Docker Compose 部署方式**,在填写仓库路径时需要注意: + +- **使用容器内路径**:填写的是容器内的路径,而不是主机的路径 +- **路径映射关系**:根据 `docker-compose.yml` 中的路径映射配置 + - 主机路径:`/path/to/your/repos`(您在 docker-compose.yml 中配置的) + - 容器路径:`/app/workdir`(固定路径) + +**示例**: +如果您的 `docker-compose.yml` 配置为: +```yaml +volumes: + - /home/user/myproject:/app/workdir +``` + +那么在填写仓库路径时应该使用容器内路径: +``` +/app/workdir +``` + +**重要提示**: +- 确保您的代码仓库已经映射到容器的 `/app/workdir` 路径 +- 如果使用软件包部署方式,则直接填写主机上的实际路径即可 +::: + +### 创建项目 + +填写完必填信息后: + +1. 点击 **创建项目**按钮添加项目 +2. Hagicode 将验证仓库路径 +3. 您的项目将出现在项目列表中 + +![新建项目之后,在项目列表当中就可以看到这个项目](/img/create-project/step3-project-list-view.png) + +## 步骤 3:初始化 SDD + +SDD(软件设计文档)是 Hagicode 中用于管理项目设计和变更的重要组件。在项目中初始化 SDD 会创建管理变更所需的必要结构。 + +### 运行 SDD 初始化 + +在项目概览中,找到 SDD 部分: + +1. 点击项目的 SDD tab + +![点击项目的 SDD tab,可以对 SDD 进行初始化](/img/create-project/step4-click-sdd-tab.png) + +2. 点击 **初始化 SDD** 按钮 + +![初始化完 SDD 之后显示的状态](/img/create-project/step5-sdd-initialized-status.png) + +## 步骤 4:优化 project.md + +Hagicode 会自动为您优化 `project.md` 文件,添加详细的项目信息和提示词配置。 + +### 运行优化 + +1. 在项目详情页面,点击右上角的 **优化** 按钮 + +![点击优化按钮,可以优化 Project.md](/img/create-project/step6-click-optimize-button.png) + +2. Hagicode 将自动分析您的代码仓库并生成优化的 project.md 内容 + +:::note +优化过程可能需要较长时间,具体取决于您的项目规模和复杂度。点击优化按钮后,您可以暂时离开,Hagicode 会在后台完成优化工作。 +::: + +## 步骤 5:提交到版本控制 + +完成 SDD 初始化和 project.md 优化后,需要将这些重要的配置文件提交到您的版本控制系统。 + +### 提交所有更改 + +将所有生成的文件和优化后的配置提交到您的仓库: + +```bash +cd /path/to/your/project +git add . +git commit -m "初始化 SDD 并优化 project.md" +``` + +:::tip +将这些文件保留在版本控制中非常重要,因为: +- **SDD 相关文件**包含了项目的提案、规范和变更管理结构,确保团队协作和变更追踪 +- **project.md** 文件包含了项目的重要元数据和 AI 交互的提示词配置,是 Hagicode 正常工作的关键 + +将这些文件纳入版本控制,可以确保整个团队使用一致的配置,并完整记录项目的所有设计和决策过程。 +::: + +## 后续步骤 + +恭喜!您已经在 Hagicode 中创建了第一个项目。以下是一些推荐的后续步骤: + +- **[对话会话](/quick-start/conversation-session)** - 了解如何使用 AI 驱动的编码会话 +- **[提案会话](/quick-start/proposal-session)** - 深入了解管理提案 diff --git a/src/content/docs/quick-start/create-first-project.mdx b/src/content/docs/quick-start/create-first-project.mdx new file mode 100644 index 0000000..399ad92 --- /dev/null +++ b/src/content/docs/quick-start/create-first-project.mdx @@ -0,0 +1,177 @@ +--- +title: 创建您的第一个项目 +description: 学习如何在 Hagicode 中创建和配置您的第一个项目,从仓库准备到 OpenSpec 初始化。 +sidebar_position: 20 +--- + +欢迎来到 Hagicode!安装完成后,让我们创建你的第一个项目。本指南会带你一步步完成设置,从准备代码仓库到初始化 OpenSpec,就像朋友手把手教你一样。 + +## 先决条件 + +在创建第一个项目之前,请确保你具备: + +- 一个想要使用 Hagicode 管理的代码仓库 +- 已安装并配置 Git +- 对命令行操作的基本了解 + +别担心,这些都很简单! + +## 步骤 1:准备您的代码仓库 + +在将项目添加到 Hagicode 之前,您需要准备一个想要用 Hagicode 管理的代码仓库。 + +### 克隆您的代码仓库 + +如果您想要管理的代码已经在远程仓库(GitHub、GitLab 等)中,请将其克隆到本地: + +```bash +# 克隆您的代码仓库到本地 +git clone https://github.com/your-username/your-repo.git +cd your-repo +``` + +克隆后,记下仓库的本地路径(例如:`C:\Users\YourName\Projects\your-repo` 或 `/home/yourname/projects/your-repo`),在下一步中您将需要这个路径。 + +:::tip +Hagicode 适合管理任何您想要通过 AI 辅助开发和优化的代码项目,包括: +- 正在开发的功能项目 +- 需要重构或优化的现有代码 +- 团队协作的项目 +- 个人开源项目 +::: + +### 如果您的代码只在本地 + +如果您想要管理的代码还在本地,尚未推送到远程仓库: + +```bash +cd /path/to/your/project +git init +git add . +git commit -m "Initial commit" +``` + +建议在 GitHub/GitLab 上创建远程仓库并推送: + +```bash +git remote add origin https://github.com/your-username/your-repo.git +git push -u origin main +``` + +## 步骤 2:在 Hagicode 界面中添加项目 + +现在让我们将项目添加到 Hagicode 界面。 + +### 访问项目页面 + +1. 在浏览器中导航到 `http://127.0.0.1:34567` +2. 点击导航侧边栏中的 **Projects**(项目) +3. 点击 **Add Project**(添加项目)按钮 + +![点击新建项目按钮](../img/quick-start/create-project/step1-click-new-project-button.png) + +### 配置项目设置 + +填写项目信息: + +![填写项目的一般信息](../img/quick-start/create-project/step2-fill-project-information.png) + +:::note +仓库路径必须指向本地计算机上有效的 Git 仓库。 +::: + +:::note[Docker Compose 部署注意事项] +如果您使用的是 **Docker Compose 部署方式**,在填写仓库路径时需要注意: + +- **使用容器内路径**:填写的是容器内的路径,而不是主机的路径 +- **路径映射关系**:根据 `docker-compose.yml` 中的路径映射配置 + - 主机路径:`/path/to/your/repos`(您在 docker-compose.yml 中配置的) + - 容器路径:`/app/workdir`(固定路径) + +**示例**: +如果您的 `docker-compose.yml` 配置为: +```yaml +volumes: + - /home/user/myproject:/app/workdir +``` + +那么在填写仓库路径时应该使用容器内路径: +``` +/app/workdir +``` + +**重要提示**: +- 确保您的代码仓库已经映射到容器的 `/app/workdir` 路径 +- 如果使用软件包部署方式,则直接填写主机上的实际路径即可 +::: + +### 创建项目 + +填写完必填信息后: + +1. 点击 **创建项目**按钮添加项目 +2. Hagicode 将验证仓库路径 +3. 您的项目将出现在项目列表中 + +![新建项目之后,在项目列表当中就可以看到这个项目](../img/quick-start/create-project/step3-project-list-view.png) + +## 步骤 3:初始化 SDD + +SDD(软件设计文档)是 Hagicode 中用于管理项目设计和变更的重要组件。在项目中初始化 SDD 会创建管理变更所需的必要结构。 + +### 运行 SDD 初始化 + +在项目概览中,找到 SDD 部分: + +1. 点击项目的 SDD tab + +![点击项目的 SDD tab,可以对 SDD 进行初始化](../img/quick-start/create-project/step4-click-sdd-tab.png) + +2. 点击 **初始化 SDD** 按钮 + +![初始化完 SDD 之后显示的状态](../img/quick-start/create-project/step5-sdd-initialized-status.png) + +## 步骤 4:优化 project.md + +Hagicode 会自动为您优化 `project.md` 文件,添加详细的项目信息和提示词配置。 + +### 运行优化 + +1. 在项目详情页面,点击右上角的 **优化** 按钮 + +![点击优化按钮,可以优化 Project.md](../img/quick-start/create-project/step6-click-optimize-button.png) + +2. Hagicode 将自动分析您的代码仓库并生成优化的 project.md 内容 + +:::note +优化过程可能需要较长时间,具体取决于您的项目规模和复杂度。点击优化按钮后,您可以暂时离开,Hagicode 会在后台完成优化工作。 +::: + +## 步骤 5:提交到版本控制 + +完成 SDD 初始化和 project.md 优化后,需要将这些重要的配置文件提交到您的版本控制系统。 + +### 提交所有更改 + +将所有生成的文件和优化后的配置提交到您的仓库: + +```bash +cd /path/to/your/project +git add . +git commit -m "初始化 SDD 并优化 project.md" +``` + +:::tip +将这些文件保留在版本控制中非常重要,因为: +- **SDD 相关文件**包含了项目的提案、规范和变更管理结构,确保团队协作和变更追踪 +- **project.md** 文件包含了项目的重要元数据和 AI 交互的提示词配置,是 Hagicode 正常工作的关键 + +将这些文件纳入版本控制,可以确保整个团队使用一致的配置,并完整记录项目的所有设计和决策过程。 +::: + +## 后续步骤 + +恭喜!您已经在 Hagicode 中创建了第一个项目。以下是一些推荐的后续步骤: + +- **[对话会话](/quick-start/conversation-session)** - 了解如何使用 AI 驱动的编码会话 +- **[提案会话](/quick-start/proposal-session)** - 深入了解管理提案 diff --git a/src/content/docs/quick-start/proposal-session.md.backup b/src/content/docs/quick-start/proposal-session.md.backup new file mode 100644 index 0000000..77af431 --- /dev/null +++ b/src/content/docs/quick-start/proposal-session.md.backup @@ -0,0 +1,417 @@ +--- +title: 使用提案会话将主意转化为代码 +description: 了解如何使用提案会话(主意会话)通过 OpenSpec 的结构化工作流程将抽象想法转化为可执行代码。 +sidebar_position: 40 +--- + +有一个很棒的想法,但不知道如何实现?提案会话来帮你!本指南将向你展示如何使用提案会话(也称为主意会话),通过 OpenSpec 的结构化工作流程,把抽象的想法变成可执行的代码。 + +## 先决条件 + +在使用提案会话之前,请确保你已经: + +- 创建了项目并初始化了 OpenSpec(参见[创建您的第一个项目](/quick-start/create-first-project)) +- 基本了解普通会话(参见[创建普通会话](/quick-start/conversation-session)) + +## 什么是提案会话? + +提案会话是一个结构化的工作流程,指导您完成将抽象想法转化为执行代码的过程。 + +### 提案会话 vs 普通会话 + +在选择使用哪种会话类型时,理解它们之间的差异至关重要: + +| 特性 | 普通会话 | 提案会话 | +|------|---------|---------| +| **工作方式** | 自由对话,即问即答 | 结构化的 9 阶段生命周期 | +| **适用场景** | 快速咨询、代码解释、简单修改 | 复杂功能开发、架构设计、多文件变更 | +| **规划程度** | 最小规划,直接执行 | 完整的提案、任务、设计文档 | +| **审查环节** | 无正式审查流程 | 三层批注系统(行内、文件、全局) | +| **迭代优化** | 依赖您主动提出改进意见 | AI 自动优化描述,支持多轮批注调整 | +| **可追溯性** | 仅保留对话历史 | 生成完整的 OpenSpec 文档(提案、任务、规范) | +| **历史利用** | 无法有效利用历史经验 | 利用"记忆碎片"系统,持续学习改进 | +| **代码质量** | 依赖单次对话质量 | 经过规划、审查、迭代,质量更高 | +| **团队协作** | 难以分享和协作 | 规划文档可共享,便于团队审查 | + +### 为什么提案会话如此重要? + +**1. 结构化思维,避免遗漏** + +提案会话通过 9 个阶段强制您思考: +- ✅ 我到底想要实现什么?(阶段 0-1:明确需求) +- ✅ 如何实现?(阶段 3:生成详细规划) +- ✅ 规划合理吗?(阶段 4:审查和批注) +- ✅ 结果满意吗?(阶段 6:验证和调整) + +**2. 多轮优化,持续改进** + +不同于普通会话的"一次性输出",提案会话支持: +- 🔄 AI 自动优化您的模糊描述 +- 🔄 通过三层批注系统精确调整规划 +- 🔄 执行后仍可在编辑模式中继续优化 +- 🔄 多次迭代直到完全满意 + +**3. 记忆碎片,越用越聪明** + +每次提案归档后,OpenSpec 会保存: +- 📦 提案文档(您想实现什么) +- 📦 任务清单(如何实现的步骤) +- 📦 设计文档(为什么这样设计) +- 📦 规范文件(技术规范和约束) + +**下次提案时,AI 会:** +- 🧠 参考历史架构决策,保持一致性 +- 🧠 复用已有的代码模式和规范 +- 🧠 避免重复实现已有功能 +- 🧠 理解项目的技术债务和设计权衡 + +**4. 团队协作,知识传承** + +生成的 OpenSpec 文档可以: +- 👥 作为 Pull Request 的参考说明 +- 👥 帮助新成员了解架构决策 +- 👥 记录"为什么这样实现"的思考过程 +- 👥 形成项目的技术知识库 + +### 何时使用提案会话? + +**✅ 推荐使用提案会话的场景:** +- 需要创建新的功能模块 +- 涉及多个文件的系统性变更 +- 需要架构设计和技术选型 +- 希望保留详细的设计文档 +- 团队项目,需要可追溯的变更记录 +- 复杂业务逻辑的实现 + +**❌ 推荐使用普通会话的场景:** +- 简单的代码问题咨询 +- 单文件的 Bug 修复 +- 快速的代码解释或学习 +- 临时的代码片段生成 + +### 提案会话的 9 阶段生命周期 + +提案会话遵循定义的 9 阶段生命周期: + +- **阶段 0**:初始化 - 定义您的想法 +- **阶段 1**:优化中 - AI 完善您的描述 +- **阶段 2**:草稿 - 审查和手动编辑 +- **阶段 3**:生成中 - AI 创建详细规划 +- **阶段 4**:审查 - 批注和批准变更 +- **阶段 5**:执行中 - AI 实施变更 +- **阶段 6**:执行完成 - 在 IDE 中验证 +- **阶段 7**:归档中 - 最终确定提案 +- **阶段 8**:已归档 - 生命周期完成 + +![主意的9个阶段展示](/img/create-proposal-session/3.主意的9个阶段展示.png) + +## 阶段 0:初始化 + +第一步是创建一个新想法并提供初始描述。 + +### 创建新想法 + +1. 在会话列表面板中,点击 **+ New Idea**(新想法)按钮 + +![点击新建主意按钮](/img/create-proposal-session/1.点击新建主意按钮.png) + +2. 输入提案的标题 +3. 描述您想要完成的内容 + +![填写主意的基本信息](/img/create-proposal-session/2.填写主意的基本信息.png) + +### 良好初始描述的技巧 + +- **保持简单**:主诉不需要详细规划,用简单的语言描述问题即可 +- **口语化表达**:就像和开发者对话一样,直接说出你的需求 +- **聚焦问题**:说明当前遇到的问题或想要改进的地方 +- **无需担心细节**:AI 会在后续阶段结合项目实际情况自动优化描述 + +**示例**(如截图所示): +``` +现在使用列表形式,而不是,不容易查看,请改用 tab +``` + +这样的简单描述就足够了!AI 会自动将其优化为完整的技术提案。 + +## 阶段 1:优化中(AI 自动) + +提交想法后,AI 会自动处理和完善它。 + +### 优化期间发生的事情 + +AI 分析您的描述并: + +![新建主意之后会自动进行描述优化,把用户主诉结合项目的实际情况进行描述的优化](/img/create-proposal-session/4.新建主意之后会自动进行描述优化,把用户主诉结合项目的实际情况进行描述的优化.png) + +- **澄清模糊的需求** +- **建议适当的技术** +- **识别潜在的边缘情况** +- **生成提案名称** + +### 无需用户操作 + +此阶段完全自动化。您将看到加载指示器,同时 AI 正在工作。 + +![描述优化之后的效果,对比主诉和描述](/img/create-proposal-session/5.描述优化之后的效果,对比主诉和描述.png) + +- 生成的提案名称 +- 包含附加细节的完善描述 +- 识别的范围和边界 + +## 阶段 2:草稿(用户手动) + +现在您有机会在开始规划之前审查提案。 + +您可以点击描述内容进行编辑,或直接点击"生成规划"继续下一步。 + +![描述优化之后,主意名称也生成好之后,就可以点击生成规划来生成一份关于这个主意的规划](/img/create-proposal-session/6.描述优化之后,主意名称也生成好之后,就可以点击生成规划来生成一份关于这个主意的规划.png) + +## 阶段 3:生成中(AI 自动) + +批准草稿后,AI 会自动生成详细的实施规划。 + +### 生成规划过程 + +点击 **生成规划** 按钮后,系统会显示自动生成的状态: + +![正在进行规划生成的界面](/img/create-proposal-session/7.正在进行规划生成的界面.png) + +您可以在对话标签页中实时查看生成进展: + +![生成过程可以在对话这个tab中查看](/img/create-proposal-session/8.生成过程可以在对话这个tab中查看.png) + +### 生成的文档类型 + +AI 创建多个文档: + +| 文档 | 类型 | 说明 | +|------|------|------| +| **提案** | 主要 | 描述要实现的功能和目标 | +| **任务** | 主要 | 具体的实施任务清单 | +| **设计** | 可选 | 架构设计文档(如需要) | +| **规范** | 参考 | OpenSpec 相关规范文件,作为记忆碎片保存 | + +**评注重点**:您通常只需要对 **提案**、**任务** 和 **设计** 这三个部分进行评注即可。规范文件(specs)部分通常不需要关心。 + +## 阶段 4:审查(用户手动) + +这是最关键的阶段,您在此审查、批注和批准实施规划。 + +当前阶段的展示: + +![规划生成完成之后,会进入审阅状态,接下来就需要人工对规划进行审阅](/img/create-proposal-session/9.规划生成完成之后,会进入审阅状态,接下来就需要人工对规划进行审阅.png) + +您可以点击标签页查看生成的文件,并进行批注: + +![tab上会显示规划相关的文件](/img/create-proposal-session/10.tab上会显示规划相关的文件.png) + +### 三层批注系统 + +Hagicode 提供三个级别的批注来提供反馈。 + +### 1. 行内批注 + +突出显示特定文本并添加评论: + +![点击一个具体的文件,可以进行行内评注](/img/create-proposal-session/11.点击一个具体的文件,可以进行行内评注.png) + +### 2. 文件批注 + +在文档级别添加反馈: + +![也可以在文件的底部添加文件级别的评注](/img/create-proposal-session/12.也可以在文件的底部添加文件级别的评注.png) + +添加批注后,您可以点击右上角按钮或直接点击"审阅"标签页,查看并提交所有批注: + +![文件评注之后,可以点击右上角或者点击审查tab来查看当前评注的内容](/img/create-proposal-session/13.文件评注之后,可以点击右上角或者点击审查tab来查看当前评注的内容.png) + +### 3. 全局批注 + +为提案提供整体反馈: + +![在审查tab还可以添加全局性的和文件无关的评注](/img/create-proposal-session/14.在审查tab还可以添加全局性的和文件无关的评注.png) + +**注意**:全局批注需要点击"保存"按钮才会生效。 + +![全局评注需要点击保存才会生效](/img/create-proposal-session/15.全局评注需要点击保存才会生效.png) + +### 提交批注 + +批注确认完毕后,您可以点击提交全部批注按钮,AI 会根据您的批注修改规划: + +![全部评注确认完毕之后,可以点击提交全部批注按钮,从而让ai根据你的批注修改](/img/create-proposal-session/16.全部评注确认完毕之后,可以点击提交全部批注按钮,从而让ai根据你的批注修改.png) + +您可以在对话标签页中查看 AI 处理批注的过程: + +![批注提交之后,可以在对话tab看到ai修改的过程](/img/create-proposal-session/17.批注提交之后,可以在对话tab看到ai修改的过程.png) + +### 批注循环 + +批注是一个迭代循环的过程。您可以不断地添加批注、提交、等待 AI 处理,然后审查更新后的规划,直到满意为止: + +```mermaid +flowchart TD + A[批注
您] --> B[提交反馈] + B --> C[AI 调整] + C --> D[审查更新后的规划] + D --> E{满意吗?} + E -->|否| A + E -->|是| F{立即执行?} + F -->|是| G[立即执行] + F -->|否| A +``` + +### 批准执行 + +对规划满意后: +1. 确保所有关键反馈都已处理 +2. 点击 **批准并执行** +3. 提案进入执行阶段 + +![规划人工确认无误之后,可以在信息tab点击立即执行](/img/create-proposal-session/18.规划人工确认无误之后,可以在信息tab点击立即执行.png) + +## 阶段 5:执行中(AI 自动) + +AI 现在自动实施批准的规划。 + +### 执行状态 + +执行中的面板展示效果: + +![规划正在执行的阶段展示](/img/create-proposal-session/19.规划正在执行的阶段展示.png) + +### 执行期间发生的事情 + +AI: +- 按照规范创建新文件 +- 修改现有文件以进行变更 +- 逐步遵循实施规划 +- 显示每个操作的进度 + +### 执行完成 + +执行完成后,您将看到: +- 创建/修改的文件摘要 +- 遇到的任何警告或问题 +- 查看变更的链接 + +## 阶段 6:执行完成 + +AI 已完成实施。现在是时候验证变更了。 + +![规划执行完成之后的阶段展示](/img/create-proposal-session/20.规划执行完成之后的阶段展示.png) + +### 在 IDE 中审查 + +在您首选的 IDE 中打开项目进行审查。 + +![规划执行完毕之后代码的变更效果展示](/img/create-proposal-session/21.规划执行完毕之后代码的变更效果展示.png) + +### 编辑模式对话 + +阶段 6 启用特殊的编辑模式对话,用于执行后的调整。 + +如果您对执行后的结果不满意,可以在对话中以编辑模式向 AI 说明需要调整的内容。AI 会继续完成编辑,直到调整结果符合您的要求为止。您可以反复进行多轮调整,直到完全满意: + +![对执行结果不满意,可以在对话中继续要求ai按照你的要求修改](/img/create-proposal-session/22.对执行结果不满意,可以在对话中继续要求ai按照你的要求修改.png) + +### 验证清单 + +继续之前: +- [ ] 在 IDE 中审查所有文件变更 +- [ ] 在本地测试新功能 +- [ ] 运行任何现有测试 +- [ ] 通过编辑模式请求任何最终调整 +- [ ] 确保符合代码质量标准 + +## 阶段 7:归档中(AI 自动) + +对实施满意后,AI 会归档提案。 + +### 点击"归档规划" + +点击 **归档规划** 按钮完成: + +![如果全部结果已经达到满意效果了,那么可以点击归档规划来完结流程](/img/create-proposal-session/23.如果全部结果已经达到满意效果了,那么可以点击归档规划来完结流程.png) + +![归档正在进行中](/img/create-proposal-session/24.归档正在进行中.png) + +### 归档期间发生的事情 + +AI: +- 将提案标记为完成 +- 创建变更摘要 +- 生成提交消息建议 +- 将提案移动到归档 + +:::note[无代码提交] +归档不会自动将代码提交到您的存储库。您应该审查变更并使用 git 手动提交。 +::: + +![归档完成阶段的展示](/img/create-proposal-session/25.归档完成阶段的展示.png) + +## 阶段 8:已归档 + +提案生命周期已完成。提案现在在归档中。 + +![归档完成之后代码变更的展示](/img/create-proposal-session/26.归档完成之后代码变更的展示.png) + +### 提交您的变更 + +记得提交实施的变更以及归档的规划文件: + +:::重要提示 +**提交归档的规划文件** + +除了代码变更,您还应该将归档的规划文件提交到 Git 仓库。这些文件包括: +- 提案(proposal.md) +- 任务(tasks.md) +- 设计(design.md,如有) +- 规范文件(specs/) + +**为什么需要提交规划文件?** + +OpenSpec 会利用已归档的提案和规范文件作为"记忆碎片",在后续的提案和实现过程中参考这些历史记录。这样: +1. ✅ AI 可以了解项目的架构决策和历史变更 +2. ✅ 保持代码风格和模式的一致性 +3. ✅ 避免重复实现已有的功能 +4. ✅ 每次提案的效果会越来越好 + +即使不提交到中心仓库,至少也要确保在本地保留这些文件,以便 OpenSpec 能够持续学习和改进。 +::: + +```bash +cd /path/to/your/project +# 添加代码变更和规划文件 +git add . +git commit -m "添加 JWT 身份验证系统 + +- 实现带有 JWT 令牌生成的 AuthService +- 添加用于路由保护的 JWT 中间件 +- 创建身份验证端点(注册、登录、注销) +- 集成 bcrypt 进行密码哈希 +- 归档提案规划:openspec/changes/add-jwt-auth/" +``` + +## 状态参考 + +| 阶段 | 名称 | 类型 | 描述 | +|------|------|------|------| +| 0 | 初始化 | 用户 | 创建带有标题和描述的新想法 | +| 1 | 优化中 | AI | AI 完善描述并生成名称 | +| 2 | 草稿 | 用户 | 审查并手动编辑提案 | +| 3 | 生成中 | AI | AI 创建详细的实施规划 | +| 4 | 审查 | 用户 | 批注规划并批准执行 | +| 5 | 执行中 | AI | AI 实施批准的变更 | +| 6 | 执行完成 | 用户 | 验证变更并进行调整 | +| 7 | 归档中 | AI | AI 完成并归档提案 | +| 8 | 已归档 | - | 提案生命周期完成 | + +## 参考资源 + +了解更多关于 OpenSpec 的信息: + +- **OpenSpec 规范**:了解 OpenSpec 的工作原理和最佳实践 +- **OpenSpec 文档结构**:学习如何组织和管理提案、任务和规范文件 +- **OpenSpec 记忆碎片系统**:深入了解如何利用历史提案改进未来的开发 diff --git a/src/content/docs/quick-start/proposal-session.mdx b/src/content/docs/quick-start/proposal-session.mdx new file mode 100644 index 0000000..d348c16 --- /dev/null +++ b/src/content/docs/quick-start/proposal-session.mdx @@ -0,0 +1,417 @@ +--- +title: 使用提案会话将主意转化为代码 +description: 了解如何使用提案会话(主意会话)通过 OpenSpec 的结构化工作流程将抽象想法转化为可执行代码。 +sidebar_position: 40 +--- + +有一个很棒的想法,但不知道如何实现?提案会话来帮你!本指南将向你展示如何使用提案会话(也称为主意会话),通过 OpenSpec 的结构化工作流程,把抽象的想法变成可执行的代码。 + +## 先决条件 + +在使用提案会话之前,请确保你已经: + +- 创建了项目并初始化了 OpenSpec(参见[创建您的第一个项目](/quick-start/create-first-project)) +- 基本了解普通会话(参见[创建普通会话](/quick-start/conversation-session)) + +## 什么是提案会话? + +提案会话是一个结构化的工作流程,指导您完成将抽象想法转化为执行代码的过程。 + +### 提案会话 vs 普通会话 + +在选择使用哪种会话类型时,理解它们之间的差异至关重要: + +| 特性 | 普通会话 | 提案会话 | +|------|---------|---------| +| **工作方式** | 自由对话,即问即答 | 结构化的 9 阶段生命周期 | +| **适用场景** | 快速咨询、代码解释、简单修改 | 复杂功能开发、架构设计、多文件变更 | +| **规划程度** | 最小规划,直接执行 | 完整的提案、任务、设计文档 | +| **审查环节** | 无正式审查流程 | 三层批注系统(行内、文件、全局) | +| **迭代优化** | 依赖您主动提出改进意见 | AI 自动优化描述,支持多轮批注调整 | +| **可追溯性** | 仅保留对话历史 | 生成完整的 OpenSpec 文档(提案、任务、规范) | +| **历史利用** | 无法有效利用历史经验 | 利用"记忆碎片"系统,持续学习改进 | +| **代码质量** | 依赖单次对话质量 | 经过规划、审查、迭代,质量更高 | +| **团队协作** | 难以分享和协作 | 规划文档可共享,便于团队审查 | + +### 为什么提案会话如此重要? + +**1. 结构化思维,避免遗漏** + +提案会话通过 9 个阶段强制您思考: +- ✅ 我到底想要实现什么?(阶段 0-1:明确需求) +- ✅ 如何实现?(阶段 3:生成详细规划) +- ✅ 规划合理吗?(阶段 4:审查和批注) +- ✅ 结果满意吗?(阶段 6:验证和调整) + +**2. 多轮优化,持续改进** + +不同于普通会话的"一次性输出",提案会话支持: +- 🔄 AI 自动优化您的模糊描述 +- 🔄 通过三层批注系统精确调整规划 +- 🔄 执行后仍可在编辑模式中继续优化 +- 🔄 多次迭代直到完全满意 + +**3. 记忆碎片,越用越聪明** + +每次提案归档后,OpenSpec 会保存: +- 📦 提案文档(您想实现什么) +- 📦 任务清单(如何实现的步骤) +- 📦 设计文档(为什么这样设计) +- 📦 规范文件(技术规范和约束) + +**下次提案时,AI 会:** +- 🧠 参考历史架构决策,保持一致性 +- 🧠 复用已有的代码模式和规范 +- 🧠 避免重复实现已有功能 +- 🧠 理解项目的技术债务和设计权衡 + +**4. 团队协作,知识传承** + +生成的 OpenSpec 文档可以: +- 👥 作为 Pull Request 的参考说明 +- 👥 帮助新成员了解架构决策 +- 👥 记录"为什么这样实现"的思考过程 +- 👥 形成项目的技术知识库 + +### 何时使用提案会话? + +**✅ 推荐使用提案会话的场景:** +- 需要创建新的功能模块 +- 涉及多个文件的系统性变更 +- 需要架构设计和技术选型 +- 希望保留详细的设计文档 +- 团队项目,需要可追溯的变更记录 +- 复杂业务逻辑的实现 + +**❌ 推荐使用普通会话的场景:** +- 简单的代码问题咨询 +- 单文件的 Bug 修复 +- 快速的代码解释或学习 +- 临时的代码片段生成 + +### 提案会话的 9 阶段生命周期 + +提案会话遵循定义的 9 阶段生命周期: + +- **阶段 0**:初始化 - 定义您的想法 +- **阶段 1**:优化中 - AI 完善您的描述 +- **阶段 2**:草稿 - 审查和手动编辑 +- **阶段 3**:生成中 - AI 创建详细规划 +- **阶段 4**:审查 - 批注和批准变更 +- **阶段 5**:执行中 - AI 实施变更 +- **阶段 6**:执行完成 - 在 IDE 中验证 +- **阶段 7**:归档中 - 最终确定提案 +- **阶段 8**:已归档 - 生命周期完成 + +![主意的9个阶段展示](../img/quick-start/create-proposal-session/3.主意的9个阶段展示.png) + +## 阶段 0:初始化 + +第一步是创建一个新想法并提供初始描述。 + +### 创建新想法 + +1. 在会话列表面板中,点击 **+ New Idea**(新想法)按钮 + +![点击新建主意按钮](../img/quick-start/create-proposal-session/1.点击新建主意按钮.png) + +2. 输入提案的标题 +3. 描述您想要完成的内容 + +![填写主意的基本信息](../img/quick-start/create-proposal-session/2.填写主意的基本信息.png) + +### 良好初始描述的技巧 + +- **保持简单**:主诉不需要详细规划,用简单的语言描述问题即可 +- **口语化表达**:就像和开发者对话一样,直接说出你的需求 +- **聚焦问题**:说明当前遇到的问题或想要改进的地方 +- **无需担心细节**:AI 会在后续阶段结合项目实际情况自动优化描述 + +**示例**(如截图所示): +``` +现在使用列表形式,而不是,不容易查看,请改用 tab +``` + +这样的简单描述就足够了!AI 会自动将其优化为完整的技术提案。 + +## 阶段 1:优化中(AI 自动) + +提交想法后,AI 会自动处理和完善它。 + +### 优化期间发生的事情 + +AI 分析您的描述并: + +![新建主意之后会自动进行描述优化,把用户主诉结合项目的实际情况进行描述的优化](../img/quick-start/create-proposal-session/4.新建主意之后会自动进行描述优化,把用户主诉结合项目的实际情况进行描述的优化.png) + +- **澄清模糊的需求** +- **建议适当的技术** +- **识别潜在的边缘情况** +- **生成提案名称** + +### 无需用户操作 + +此阶段完全自动化。您将看到加载指示器,同时 AI 正在工作。 + +![描述优化之后的效果,对比主诉和描述](../img/quick-start/create-proposal-session/5.描述优化之后的效果,对比主诉和描述.png) + +- 生成的提案名称 +- 包含附加细节的完善描述 +- 识别的范围和边界 + +## 阶段 2:草稿(用户手动) + +现在您有机会在开始规划之前审查提案。 + +您可以点击描述内容进行编辑,或直接点击"生成规划"继续下一步。 + +![描述优化之后,主意名称也生成好之后,就可以点击生成规划来生成一份关于这个主意的规划](../img/quick-start/create-proposal-session/6.描述优化之后,主意名称也生成好之后,就可以点击生成规划来生成一份关于这个主意的规划.png) + +## 阶段 3:生成中(AI 自动) + +批准草稿后,AI 会自动生成详细的实施规划。 + +### 生成规划过程 + +点击 **生成规划** 按钮后,系统会显示自动生成的状态: + +![正在进行规划生成的界面](../img/quick-start/create-proposal-session/7.正在进行规划生成的界面.png) + +您可以在对话标签页中实时查看生成进展: + +![生成过程可以在对话这个tab中查看](../img/quick-start/create-proposal-session/8.生成过程可以在对话这个tab中查看.png) + +### 生成的文档类型 + +AI 创建多个文档: + +| 文档 | 类型 | 说明 | +|------|------|------| +| **提案** | 主要 | 描述要实现的功能和目标 | +| **任务** | 主要 | 具体的实施任务清单 | +| **设计** | 可选 | 架构设计文档(如需要) | +| **规范** | 参考 | OpenSpec 相关规范文件,作为记忆碎片保存 | + +**评注重点**:您通常只需要对 **提案**、**任务** 和 **设计** 这三个部分进行评注即可。规范文件(specs)部分通常不需要关心。 + +## 阶段 4:审查(用户手动) + +这是最关键的阶段,您在此审查、批注和批准实施规划。 + +当前阶段的展示: + +![规划生成完成之后,会进入审阅状态,接下来就需要人工对规划进行审阅](../img/quick-start/create-proposal-session/9.规划生成完成之后,会进入审阅状态,接下来就需要人工对规划进行审阅.png) + +您可以点击标签页查看生成的文件,并进行批注: + +![tab上会显示规划相关的文件](../img/quick-start/create-proposal-session/10.tab上会显示规划相关的文件.png) + +### 三层批注系统 + +Hagicode 提供三个级别的批注来提供反馈。 + +### 1. 行内批注 + +突出显示特定文本并添加评论: + +![点击一个具体的文件,可以进行行内评注](../img/quick-start/create-proposal-session/11.点击一个具体的文件,可以进行行内评注.png) + +### 2. 文件批注 + +在文档级别添加反馈: + +![也可以在文件的底部添加文件级别的评注](../img/quick-start/create-proposal-session/12.也可以在文件的底部添加文件级别的评注.png) + +添加批注后,您可以点击右上角按钮或直接点击"审阅"标签页,查看并提交所有批注: + +![文件评注之后,可以点击右上角或者点击审查tab来查看当前评注的内容](../img/quick-start/create-proposal-session/13.文件评注之后,可以点击右上角或者点击审查tab来查看当前评注的内容.png) + +### 3. 全局批注 + +为提案提供整体反馈: + +![在审查tab还可以添加全局性的和文件无关的评注](../img/quick-start/create-proposal-session/14.在审查tab还可以添加全局性的和文件无关的评注.png) + +**注意**:全局批注需要点击"保存"按钮才会生效。 + +![全局评注需要点击保存才会生效](../img/quick-start/create-proposal-session/15.全局评注需要点击保存才会生效.png) + +### 提交批注 + +批注确认完毕后,您可以点击提交全部批注按钮,AI 会根据您的批注修改规划: + +![全部评注确认完毕之后,可以点击提交全部批注按钮,从而让ai根据你的批注修改](../img/quick-start/create-proposal-session/16.全部评注确认完毕之后,可以点击提交全部批注按钮,从而让ai根据你的批注修改.png) + +您可以在对话标签页中查看 AI 处理批注的过程: + +![批注提交之后,可以在对话tab看到ai修改的过程](../img/quick-start/create-proposal-session/17.批注提交之后,可以在对话tab看到ai修改的过程.png) + +### 批注循环 + +批注是一个迭代循环的过程。您可以不断地添加批注、提交、等待 AI 处理,然后审查更新后的规划,直到满意为止: + +```mermaid +flowchart TD + A[批注
您] --> B[提交反馈] + B --> C[AI 调整] + C --> D[审查更新后的规划] + D --> E{满意吗?} + E -->|否| A + E -->|是| F{立即执行?} + F -->|是| G[立即执行] + F -->|否| A +``` + +### 批准执行 + +对规划满意后: +1. 确保所有关键反馈都已处理 +2. 点击 **批准并执行** +3. 提案进入执行阶段 + +![规划人工确认无误之后,可以在信息tab点击立即执行](../img/quick-start/create-proposal-session/18.规划人工确认无误之后,可以在信息tab点击立即执行.png) + +## 阶段 5:执行中(AI 自动) + +AI 现在自动实施批准的规划。 + +### 执行状态 + +执行中的面板展示效果: + +![规划正在执行的阶段展示](../img/quick-start/create-proposal-session/19.规划正在执行的阶段展示.png) + +### 执行期间发生的事情 + +AI: +- 按照规范创建新文件 +- 修改现有文件以进行变更 +- 逐步遵循实施规划 +- 显示每个操作的进度 + +### 执行完成 + +执行完成后,您将看到: +- 创建/修改的文件摘要 +- 遇到的任何警告或问题 +- 查看变更的链接 + +## 阶段 6:执行完成 + +AI 已完成实施。现在是时候验证变更了。 + +![规划执行完成之后的阶段展示](../img/quick-start/create-proposal-session/20.规划执行完成之后的阶段展示.png) + +### 在 IDE 中审查 + +在您首选的 IDE 中打开项目进行审查。 + +![规划执行完毕之后代码的变更效果展示](../img/quick-start/create-proposal-session/21.规划执行完毕之后代码的变更效果展示.png) + +### 编辑模式对话 + +阶段 6 启用特殊的编辑模式对话,用于执行后的调整。 + +如果您对执行后的结果不满意,可以在对话中以编辑模式向 AI 说明需要调整的内容。AI 会继续完成编辑,直到调整结果符合您的要求为止。您可以反复进行多轮调整,直到完全满意: + +![对执行结果不满意,可以在对话中继续要求ai按照你的要求修改](../img/quick-start/create-proposal-session/22.对执行结果不满意,可以在对话中继续要求ai按照你的要求修改.png) + +### 验证清单 + +继续之前: +- [ ] 在 IDE 中审查所有文件变更 +- [ ] 在本地测试新功能 +- [ ] 运行任何现有测试 +- [ ] 通过编辑模式请求任何最终调整 +- [ ] 确保符合代码质量标准 + +## 阶段 7:归档中(AI 自动) + +对实施满意后,AI 会归档提案。 + +### 点击"归档规划" + +点击 **归档规划** 按钮完成: + +![如果全部结果已经达到满意效果了,那么可以点击归档规划来完结流程](../img/quick-start/create-proposal-session/23.如果全部结果已经达到满意效果了,那么可以点击归档规划来完结流程.png) + +![归档正在进行中](../img/quick-start/create-proposal-session/24.归档正在进行中.png) + +### 归档期间发生的事情 + +AI: +- 将提案标记为完成 +- 创建变更摘要 +- 生成提交消息建议 +- 将提案移动到归档 + +:::note[无代码提交] +归档不会自动将代码提交到您的存储库。您应该审查变更并使用 git 手动提交。 +::: + +![归档完成阶段的展示](../img/quick-start/create-proposal-session/25.归档完成阶段的展示.png) + +## 阶段 8:已归档 + +提案生命周期已完成。提案现在在归档中。 + +![归档完成之后代码变更的展示](../img/quick-start/create-proposal-session/26.归档完成之后代码变更的展示.png) + +### 提交您的变更 + +记得提交实施的变更以及归档的规划文件: + +:::重要提示 +**提交归档的规划文件** + +除了代码变更,您还应该将归档的规划文件提交到 Git 仓库。这些文件包括: +- 提案(proposal.md) +- 任务(tasks.md) +- 设计(design.md,如有) +- 规范文件(specs/) + +**为什么需要提交规划文件?** + +OpenSpec 会利用已归档的提案和规范文件作为"记忆碎片",在后续的提案和实现过程中参考这些历史记录。这样: +1. ✅ AI 可以了解项目的架构决策和历史变更 +2. ✅ 保持代码风格和模式的一致性 +3. ✅ 避免重复实现已有的功能 +4. ✅ 每次提案的效果会越来越好 + +即使不提交到中心仓库,至少也要确保在本地保留这些文件,以便 OpenSpec 能够持续学习和改进。 +::: + +```bash +cd /path/to/your/project +# 添加代码变更和规划文件 +git add . +git commit -m "添加 JWT 身份验证系统 + +- 实现带有 JWT 令牌生成的 AuthService +- 添加用于路由保护的 JWT 中间件 +- 创建身份验证端点(注册、登录、注销) +- 集成 bcrypt 进行密码哈希 +- 归档提案规划:openspec/changes/add-jwt-auth/" +``` + +## 状态参考 + +| 阶段 | 名称 | 类型 | 描述 | +|------|------|------|------| +| 0 | 初始化 | 用户 | 创建带有标题和描述的新想法 | +| 1 | 优化中 | AI | AI 完善描述并生成名称 | +| 2 | 草稿 | 用户 | 审查并手动编辑提案 | +| 3 | 生成中 | AI | AI 创建详细的实施规划 | +| 4 | 审查 | 用户 | 批注规划并批准执行 | +| 5 | 执行中 | AI | AI 实施批准的变更 | +| 6 | 执行完成 | 用户 | 验证变更并进行调整 | +| 7 | 归档中 | AI | AI 完成并归档提案 | +| 8 | 已归档 | - | 提案生命周期完成 | + +## 参考资源 + +了解更多关于 OpenSpec 的信息: + +- **OpenSpec 规范**:了解 OpenSpec 的工作原理和最佳实践 +- **OpenSpec 文档结构**:学习如何组织和管理提案、任务和规范文件 +- **OpenSpec 记忆碎片系统**:深入了解如何利用历史提案改进未来的开发 diff --git a/src/content/docs/related-software-installation/claude-code/setup-claude-code-with-zai.mdx b/src/content/docs/related-software-installation/claude-code/setup-claude-code-with-zai.mdx new file mode 100644 index 0000000..67c86cd --- /dev/null +++ b/src/content/docs/related-software-installation/claude-code/setup-claude-code-with-zai.mdx @@ -0,0 +1,81 @@ +--- +title: 安装 Claude Code +description: 本指南将帮助您安装 Claude Code 并配置智谱 AI (ZAI) 模型。 +sidebar_position: 10 +--- + +Claude Code 是一个强大的 AI 辅助编程工具,能够显著提升开发效率和代码质量。本指南将指导您安装 Claude Code 并配置智谱 AI (ZAI) 模型。 + +## 安装 Claude Code + +### 为什么不推荐官方安装方式 + +Claude Code 官方提供了两种安装方式: +- **Native 安装**:需要从 GitHub Releases 下载二进制文件 +- **官方脚本安装**:需要执行官方提供的安装脚本 + +由于网络原因,上述方式在国内网络环境下可能无法正常使用。因此,我们推荐使用 **NPM 安装方式**,这种方式更稳定且在国内网络环境下表现更好。 + +### 使用 NPM 安装 + +通过 NPM 可以非常方便地安装 Claude Code。请确保您已经安装了 Node.js 环境。 + +```bash +npm install -g @anthropic-ai/claude-code +``` + +安装完毕之后,可以通过以下命令验证安装是否成功: + +```bash +claude --version +``` + +## 购买 ZAI 订阅 + +使用 ZAI 您需要先购买订阅并获得 API Key。对于代码编写来说,建议购买 Coding Plan 作为日常使用,这样会更加节约成本。 + +可以通过以下链接购买获得 **10% 优惠**:[https://www.bigmodel.cn/glm-coding?ic=14BY54APZA](https://www.bigmodel.cn/glm-coding?ic=14BY54APZA) + +:::tip +初次体验可以购买 lite 版本,价格更低。 +::: + +购买成功之后可以通过以下地址创建 API Key:[https://bigmodel.cn/usercenter/proj-mgmt/apikeys](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) + +## 在 Claude Code 中配置 ZAI + +官方提供了文档来说明如何在 Claude Code 中配置 ZAI 模型:[https://docs.bigmodel.cn/cn/coding-plan/tool/claude](https://docs.bigmodel.cn/cn/coding-plan/tool/claude) + +ZAI 现在提供了一个简单的命令行工具 `coding-helper` 来帮助您配置 Claude Code。 + +```bash +# 进入命令行界面,执行如下运行 Coding Tool Helper +npx @z_ai/coding-helper +``` + +运行之后会进入一个交互式的命令行界面,按照提示输入您的 API Key 并选择 Claude Code 即可完成配置。 + +## 初次体验 + +完成配置之后,您就可以在 Claude Code 中使用 ZAI 模型了。在命令行中输入: + +```bash +claude +``` + +即可进入 Claude Code 的交互界面。在交互界面中,可以进行围绕当前文件夹的上下文进行代码生成和修改。 + +:::note +如果第一次呼出的时候要求填写一个 API Key,您可以随便输入一个字符串,因为这不是我们需要的 Key,真正的 Key 已经通过 `coding-helper` 工具配置好了。 +::: + +## IDE 插件 + +Claude Code 也提供了 VSCode 和 JetBrains 系列 IDE 的插件,可以让您在熟悉的开发环境中使用 Claude Code 和 ZAI 模型。 + +- **VSCode 插件市场链接**:[https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code) +- **JetBrains 插件市场链接**:[https://plugins.jetbrains.com/plugin/27310-claude-code-beta-](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-) + +:::tip +使用 IDE 插件比起命令行工具来说,体验会更好一些,因为它可以识别到您鼠标选中的代码片段,以及您当前打开的文件,从而提供更精准的代码生成和修改建议。 +::: diff --git a/src/content/docs/related-software-installation/dotnet/install-dotnet-sdk.mdx b/src/content/docs/related-software-installation/dotnet/install-dotnet-sdk.mdx new file mode 100644 index 0000000..3e681b3 --- /dev/null +++ b/src/content/docs/related-software-installation/dotnet/install-dotnet-sdk.mdx @@ -0,0 +1,329 @@ +--- +title: 安装 .NET SDK +description: 本指南帮助您在 Windows、macOS 和 Linux 系统上安装 .NET SDK 运行依赖。 +sidebar_position: 20 +--- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +## 简要说明 + +.NET SDK 是 Hagicode 运行所需的依赖,安装后即可使用。 + +:::tip[版本要求] +Hagicode 需要 **.NET SDK >= 10.0** 作为运行依赖。 +::: + +## 安装 .NET SDK + + + + +### 方法一:官方安装包(推荐) + +1. 访问 [.NET 官方网站](https://dotnet.microsoft.com/download) +2. 选择 **.NET 10** 版本 +3. 下载 **SDK**(不是 Runtime)的 Windows 安装程序(`.exe` 或 `.msi` 文件) +4. 双击运行安装程序 +5. 按照安装向导的提示完成安装: + - 接受许可协议 + - 选择安装路径(默认即可) + - 点击 "安装" 开始安装 +6. 安装完成后,点击 "关闭" + +### 方法二:使用 winget + +打开 PowerShell 或命令提示符,运行以下命令: + +```powershell +winget install Microsoft.DotNet.SDK.10 +``` + +:::tip +如果 winget 找不到 .NET 10 SDK,可以先更新 winget 源: +```powershell +winget source update +``` +::: + +### 方法三:使用 Chocolatey + +如果您已经安装了 [Chocolatey](https://chocolatey.org/): + +```powershell +choco install dotnet-10-sdk +``` + + + + +### 方法一:官方安装包(推荐) + +1. 访问 [.NET 官方网站](https://dotnet.microsoft.com/download) +2. 选择 **.NET 10** 版本 +3. 下载 **SDK** 的 macOS 安装程序(`.pkg` 文件) +4. 双击运行安装程序 +5. 按照安装向导的提示完成安装: + - 点击 "继续" + - 接受许可协议 + - 选择安装磁盘 + - 点击 "安装" 并输入管理员密码 +6. 安装完成后,点击 "关闭" + +### 方法二:使用 Homebrew + +如果您已经安装了 [Homebrew](https://brew.sh/),可以通过终端安装 .NET SDK: + +```bash +# 添加 Microsoft tap +brew tap microsoft/dotnet + +# 安装 .NET 10 SDK +brew install dotnet-sdk-10 +``` + +:::tip +Homebrew 会自动将 .NET SDK 添加到您的 PATH 中。如果命令不可用,请重新启动终端或运行: +```bash +eval "$(/opt/homebrew/bin/brew shellenv)" +``` +::: + +### 方法三:使用 .NET 安装脚本 + +```bash +# 下载并运行安装脚本 +curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 10.0 + +# 将 .NET 添加到 PATH(添加到 ~/.zshrc 或 ~/.bashrc) +export DOTNET_ROOT=$HOME/.dotnet +export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools +``` + + + + +### 使用 Microsoft 包仓库(推荐) + +这是获取最新 .NET SDK 版本的最佳方式: + +```bash +# 添加 Microsoft 包仓库 +wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb +rm packages-microsoft-prod.deb + +# 更新包列表 +sudo apt-get update + +# 安装 .NET 10 SDK +sudo apt-get install -y dotnet-sdk-10.0 +``` + +### 使用 apt 包管理器 + +Ubuntu 24.04+ 的默认仓库可能包含 .NET 10 SDK: + +```bash +sudo apt-get update +sudo apt-get install -y dotnet-sdk-10.0 +``` + +:::note +如果默认仓库中没有 .NET 10 SDK,请使用 Microsoft 包仓库方法。 +::: + +### 使用 Snap + +Ubuntu 也支持通过 Snap 安装: + +```bash +sudo snap install dotnet-sdk --classic --channel=10 +``` + + + + +### 使用 Microsoft 包仓库(推荐) + +```bash +# 添加 Microsoft 包仓库 +sudo rpm -Uvh https://packages.microsoft.com/config/centos/$(rpm -E %{rhel})/packages-microsoft-prod.rpm + +# 更新包列表 +sudo yum update + +# 安装 .NET 10 SDK +sudo yum install -y dotnet-sdk-10.0 +``` + +### 使用 yum 包管理器 + +```bash +sudo yum install -y dotnet-sdk-10.0 +``` + +:::note +如果系统仓库中没有 .NET 10 SDK,请使用 Microsoft 包仓库方法。 +::: + + + + +### 使用 dnf 包管理器 + +```bash +# 添加 Microsoft 包仓库 +sudo rpm -Uvh https://packages.microsoft.com/config/fedora/$(rpm -E %fedora)/packages-microsoft-prod.rpm + +# 更新包列表 +sudo dnf update + +# 安装 .NET 10 SDK +sudo dnf install -y dotnet-sdk-10.0 +``` + +:::tip +Fedora 的软件仓库通常包含较新的 .NET 版本,可以直接使用 dnf 安装。 +::: + + + + +### 使用 pacman 包管理器 + +```bash +# 安装 .NET 10 SDK +sudo pacman -S dotnet-sdk-10.0 +``` + +:::tip +Arch Linux 滚动更新,通常包含最新版本的 .NET SDK。 +::: + + + + +## 验证安装 + +安装完成后,请验证 .NET SDK 是否正确安装: + +```bash +# 检查 .NET SDK 版本 +dotnet --version + +# 查看详细的 SDK 信息 +dotnet --info +``` + +:::note +确保 .NET SDK 版本 >= 10.0.0(推荐使用最新的 .NET 10 版本)。如果版本过低,请按照上述方法重新安装。 +::: + +## 常见问题 + +### Windows + +如果在安装后 `dotnet` 命令不可用: + +1. 重新启动命令提示符或 PowerShell +2. 如果仍然不可用,手动将 .NET 添加到 PATH: + - 搜索 "环境变量" 并打开 "编辑系统环境变量" + - 点击 "环境变量" + - 在 "系统变量" 中找到 "Path",点击 "编辑" + - 添加 .NET SDK 的安装路径(默认:`C:\Program Files\dotnet\`) + - 点击 "确定" 保存更改 + +### macOS + +如果安装后命令不可用: + +1. 重新启动终端 +2. 如果使用 Homebrew 安装,运行: + ```bash + eval "$(/opt/homebrew/bin/brew shellenv)" + ``` +3. 手动添加到 PATH(在 `~/.zshrc` 或 `~/.bash_profile` 中): + ```bash + export DOTNET_ROOT=$HOME/.dotnet + export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools + ``` + +### Linux + +如果在运行 `dotnet` 时遇到权限错误: + +```bash +# 确保安装路径可执行 +sudo chmod +x $HOME/.dotnet/dotnet + +# 如果使用系统包管理器安装,重新安装 +sudo apt-get install --reinstall dotnet-sdk-10.0 +``` + +## 中国大陆用户加速 + +如果下载速度慢,可使用以下镜像源加速: + +- **Azure 中国镜像**: https://dotnetcli.azureedge.net/dotnet/ +- **官方 CDN**: https://dotnetcli.blob.core.windows.net/ + +访问以上地址,选择您需要的版本进行下载。 + +## 附录:卸载 .NET SDK + +如果需要卸载 .NET SDK: + + + + +1. 打开 "控制面板" > "程序和功能" +2. 找到 "Microsoft .NET SDK - 10.0.0" +3. 右键点击并选择 "卸载" + +或使用命令行: + +```powershell +# 使用 winget 卸载 +winget uninstall Microsoft.DotNet.SDK.10 + +# 使用 Chocolatey 卸载 +choco uninstall dotnet-10-sdk +``` + + + + +```bash +# 如果使用 Homebrew 安装 +brew uninstall dotnet-sdk-10 + +# 如果使用安装包安装 +sudo rm -rf /usr/local/share/dotnet +sudo rm -rf /usr/local/bin/dotnet +``` + + + + +```bash +# Ubuntu/Debian +sudo apt-get remove dotnet-sdk-10.0 +sudo apt-get autoremove + +# CentOS/RHEL +sudo yum remove dotnet-sdk-10.0 + +# Fedora +sudo dnf remove dotnet-sdk-10.0 + +# 如果使用安装脚本安装 +rm -rf ~/.dotnet +``` + + + + +## 了解更多 + +- [.NET 官方文档](https://learn.microsoft.com/zh-cn/dotnet/core/install/) +- [.NET GitHub Issues](https://github.com/dotnet/sdk/issues) diff --git a/src/content/docs/related-software-installation/nodejs/installation.mdx b/src/content/docs/related-software-installation/nodejs/installation.mdx new file mode 100644 index 0000000..3dfff31 --- /dev/null +++ b/src/content/docs/related-software-installation/nodejs/installation.mdx @@ -0,0 +1,528 @@ +--- +title: 安装 Node.js +description: 本指南将帮助您在 Windows、macOS 和 Linux 系统上安装 Node.js 运行时环境。 +sidebar_position: 10 +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +本指南将详细说明如何在 Windows、macOS 和 Linux 操作系统上安装 Node.js 运行时环境。Node.js 是 PCode 运行所需的核心依赖。 + +:::tip[版本要求] +PCode 推荐使用 **Node.js 24+**(最低支持 Node.js >= 18.0)。建议安装最新的 LTS 版本以获得最佳性能和安全性。在安装完成后,请验证您的版本满足此要求。 +::: + +## 安装 Node.js + + + + +### 方法一:官方安装包(推荐) + +1. 访问 [Node.js 官方网站](https://nodejs.org/) +2. 下载 **LTS(长期支持)**版本的 Windows 安装程序(`.msi` 文件) +3. 双击运行安装程序 +4. 按照安装向导的提示完成安装: + - 接受许可协议 + - 选择安装路径(默认即可) + - 确保勾选 "Automatically install the necessary tools"(自动安装必要的工具) + - 点击 "Install" 开始安装 +5. 安装完成后,点击 "Finish" + +### 方法二:使用 winget + +打开 PowerShell 或命令提示符,运行以下命令: + +```powershell +winget install OpenJS.NodeJS.LTS +``` + +安装完成后,重新打开终端以使更改生效。 + + + + +### 方法一:官方安装包(推荐) + +1. 访问 [Node.js 官方网站](https://nodejs.org/) +2. 下载 **LTS(长期支持)**版本的 macOS 安装程序(`.pkg` 文件) +3. 双击运行安装程序 +4. 按照安装向导的提示完成安装: + - 点击 "继续" + - 接受许可协议 + - 选择安装磁盘 + - 点击 "安装" 并输入管理员密码 +5. 安装完成后,点击 "关闭" + +### 方法二:使用 Homebrew + +如果您已经安装了 [Homebrew](https://brew.sh/),可以通过终端安装 Node.js: + +```bash +brew install node +``` + +:::tip +Homebrew 会自动将 Node.js 添加到您的 PATH 中。如果命令不可用,请重新启动终端或运行: +```bash +eval "$(/opt/homebrew/bin/brew shellenv)" +``` +::: + + + + +### 使用 NodeSource 仓库(推荐) + +这是获取最新 Node.js 版本的最佳方式: + +```bash +# 使用 curl 下载安装脚本 +curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - +sudo apt-get install -y nodejs +``` + +### 使用 apt 包管理器 + +如果您不需要最新版本,可以使用 Ubuntu 自带的软件仓库: + +```bash +sudo apt-get update +sudo apt-get install -y nodejs npm +``` + +:::note +默认仓库中的 Node.js 版本可能较旧。安装后请检查版本,确保满足 Node.js >= 18.0 的要求(推荐使用 Node.js 24+)。 +::: + + + + +### 使用 NodeSource 仓库(推荐) + +```bash +# 使用 curl 下载安装脚本 +curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - +sudo yum install -y nodejs +``` + +### 使用 yum 包管理器 + +```bash +sudo yum install -y nodejs npm +``` + + + + +### 使用 dnf 包管理器 + +```bash +sudo dnf install -y nodejs npm +``` + +:::tip +Fedora 的软件仓库通常包含较新的 Node.js 版本,可以直接使用 dnf 安装。 +::: + + + + +## 使用版本管理工具 + +如果您需要在多个 Node.js 版本之间切换,可以使用版本管理工具。 + +### nvm (Node Version Manager) + + + + +#### Linux/macOS + +```bash +# 使用 curl 安装 +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash + +# 或使用 wget 安装 +wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash +``` + +安装完成后,重新加载您的 shell 配置: + +```bash +source ~/.bashrc +# 或对于 Zsh 用户 +source ~/.zshrc +``` + +#### Windows + +在 Windows 上,推荐使用 [nvm-windows](https://github.com/coreybutler/nvm-windows): + +1. 从 [nvm-windows releases](https://github.com/coreybutler/nvm-windows/releases) 下载最新的 `nvm-setup.exe` +2. 运行安装程序 +3. 重新打开命令提示符或 PowerShell + + + + +安装 nvm 后,您可以使用它来安装和管理 Node.js 版本: + +```bash +# 安装最新的 LTS 版本(推荐) +nvm install --lts + +# 安装 Node.js 24(推荐版本) +nvm install 24 + +# 安装特定的 Node.js 版本 +nvm install 18.20.0 + +# 列出已安装的版本 +nvm list + +# 切换到指定的 Node.js 版本 +nvm use 24 + +# 设置默认版本 +nvm alias default 24 + +# Windows nvm-windows 语法略有不同 +nvm install 24 +nvm use 24 +``` + + + + +### fnm (Fast Node Manager) + +fnm 是一个更快、更简单的 Node.js 版本管理工具,使用 Rust 构建。 + + + + +#### Linux/macOS + +```bash +# 使用 curl 安装 +curl -fsSL https://fnm.vercel.app/install | bash + +# 安装完成后,重新加载 shell 配置 +source ~/.bashrc +# 或对于 Zsh 用户 +source ~/.zshrc +``` + +#### Windows + +使用 [scoop](https://scoop.sh/) 或 [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/): + +```powershell +# 使用 scoop +scoop install fnm + +# 或使用 winget +winget install Schniz.fnm +``` + + + + +```bash +# 安装最新的 LTS 版本(推荐) +fnm install --lts + +# 安装 Node.js 24(推荐版本) +fnm install 24 + +# 安装特定的 Node.js 版本 +fnm install 18.20.0 + +# 列出已安装的版本 +fnm list + +# 切换到指定的 Node.js 版本 +fnm use 24 + +# 设置默认版本 +fnm default 24 +``` + + + + +## 中国大陆用户加速 + +如果您在中国大陆地区,下载 Node.js 和 npm 包可能会遇到速度慢的问题。以下是一些加速方案。 + +### 使用国内镜像源 + +#### npm 淘宝镜像(推荐) + +```bash +# 临时使用淘宝镜像 +npm install --registry=https://registry.npmmirror.com + +# 永久设置淘宝镜像 +npm config set registry https://registry.npmmirror.com + +# 验证镜像是否设置成功 +npm config get registry +``` + +#### 使用 nrm 管理镜像源 + +nrm (npm registry manager) 可以帮助您快速切换 npm 镜像源: + +```bash +# 安装 nrm +npm install -g nrm + +# 列出可用的镜像源 +nrm ls + +# 切换到淘宝镜像 +nrm use taobao + +# 测试镜像源速度 +nrm test +``` + +### 下载 Node.js 安装包加速 + + + + +淘宝提供了 Node.js 安装包的镜像下载: + +- **下载地址**: https://npmmirror.com/mirrors/node/ + +访问以上地址,选择您需要的版本进行下载。 + + + + +如果从 GitHub 下载 nvm 或其他工具速度慢,可以使用 FastGit 镜像: + +```bash +# 使用 FastGit 加速 nvm 安装 +curl -o- https://fastgit.org/nvm-sh/nvm/raw/master/install.sh | bash +``` + +:::note +FastGit 服务可能会变动,请以官方信息为准。 +::: + + + + +### Homebrew 国内镜像 + +如果您在中国大陆使用 Homebrew,可以配置国内镜像加速: + +```bash +# 安装 Homebrew 时使用国内镜像 +/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" + +# 或使用中科大的镜像 +export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles +``` + +### 中国大陆特有包管理器 + +#### cnpm + +cnpm 是淘宝团队提供的 npm 客户端,默认使用淘宝镜像: + +```bash +# 安装 cnpm +npm install -g cnpm --registry=https://registry.npmmirror.com + +# 使用 cnpm 安装包 +cnpm install +``` + +:::tip +cnpm 与 npm 命令基本兼容,可以直接替换使用。 +::: + +### 验证镜像加速效果 + +设置镜像后,可以通过以下命令验证: + +```bash +# 测试下载速度 +time npm install express --registry=https://registry.npmmirror.com + +# 对比官方源速度 +time npm install express --registry=https://registry.npmjs.org +``` + +## 验证安装 + +安装完成后,请验证 Node.js 和 npm 是否正确安装: + +```bash +# 检查 Node.js 版本 +node --version + +# 检查 npm 版本 +npm --version +``` + +:::note +确保 Node.js 版本 >= 18.0(推荐使用 Node.js 24+)。如果版本过低,请按照上述方法重新安装或使用版本管理工具安装正确的版本。 +::: + +### 验证命令输出示例 + +成功的验证输出应该类似: + +``` +$ node --version +v24.3.0 + +$ npm --version +10.2.3 +``` + +## 故障排除 + +### Windows 问题 + + + + +如果在安装后 `node` 或 `npm` 命令不可用: + +1. 重新启动命令提示符或 PowerShell +2. 如果仍然不可用,手动将 Node.js 添加到 PATH: + - 搜索 "环境变量" 并打开 "编辑系统环境变量" + - 点击 "环境变量" + - 在 "系统变量" 中找到 "Path",点击 "编辑" + - 添加 Node.js 的安装路径(默认:`C:\Program Files\nodejs\`) + - 点击 "确定" 保存更改 + + + + +如果在使用 nvm 时遇到执行策略错误: + +```powershell +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +``` + + + + +### macOS 问题 + + + + +如果在安装全局 npm 包时遇到权限错误: + +```bash +# 修复 npm 权限 +sudo chown -R $(whoami) ~/.npm +sudo chown -R $(whoami) /usr/local/lib/node_modules +``` + + + + +如果安装后命令不可用,请重新启动终端或手动添加到 PATH(通常在 `/usr/local/bin`)。 + + + + +### Linux 问题 + + + + +如果在安装全局 npm 包时遇到权限错误,建议使用 Node.js 版本管理工具(如 nvm 或 fnm)而不是系统包管理器。 + + + + +如果通过系统包管理器安装的 Node.js 版本过旧: + +1. 使用 NodeSource 仓库(推荐,见上文) +2. 或使用版本管理工具(nvm/fnm) + + + + +### 检查环境 + +如果验证失败,检查以下内容: + + + + +```powershell +# 检查 Node.js 是否在 PATH 中 +where node + +# 检查安装路径 +Get-Command node +``` + + + + +```bash +# 检查 Node.js 是否在 PATH 中 +which node + +# 检查安装路径 +ls -l $(which node) +``` + + + + +```bash +# 检查 Node.js 是否在 PATH 中 +which node + +# 检查安装路径 +ls -l $(which node) + +# 检查版本详细信息 +node -v +``` + + + + +## 下一步 + +Node.js 安装完成后,您可以继续以下步骤: + + + + + + + + + + + +## 需要更多帮助? + +如果您遇到此处未涵盖的问题: + +1. 访问 [Node.js 官方文档](https://nodejs.org/en/docs/) +2. 查看 [GitHub Issues](https://github.com/pcode/pcode-docs/issues) 寻找类似问题 +3. 访问我们的[社区论坛](https://github.com/pcode/pcode-docs/discussions)寻求帮助 diff --git a/src/content/docs/related-software-installation/openspec/setup-openspec.mdx b/src/content/docs/related-software-installation/openspec/setup-openspec.mdx new file mode 100644 index 0000000..bc1791c --- /dev/null +++ b/src/content/docs/related-software-installation/openspec/setup-openspec.mdx @@ -0,0 +1,384 @@ +--- +title: 安装 OpenSpec +description: 本指南将帮助您安装 OpenSpec 规范驱动开发工具。 +sidebar_position: 10 +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +# 安装 OpenSpec + +OpenSpec 是一个规范驱动开发工具,用于管理提案、规范和变更。它帮助团队通过结构化的方式管理工作流程,确保所有变更都经过审查和验证。本指南将指导您完成 OpenSpec 的安装过程。 + +## 什么是 OpenSpec? + +OpenSpec 是一个命令行工具,专门用于管理软件开发过程中的提案(Proposals)和规范(Specifications)。它提供了一套完整的工作流程,包括: + +- **提案管理**:创建、审查和跟踪功能提案 +- **规范验证**:确保代码变更符合预定义的规范 +- **变更追踪**:记录所有经过审查的变更历史 +- **团队协作**:支持多人协作开发 + +### 在 PCode 项目中的应用 + +在 PCode 项目中,OpenSpec 用于: + +1. **管理功能开发**:所有新功能都需要通过 OpenSpec 提案流程 +2. **代码审查**:确保变更符合项目规范 +3. **文档同步**:保持文档与代码实现的一致性 +4. **版本控制集成**:与版本控制工作流无缝集成 + +## 先决条件 + +在安装 OpenSpec 之前,请确保您的系统已满足以下要求: + +### Node.js 和 npm + +OpenSpec 通过 npm 分发,需要 Node.js 环境。OpenSpec 要求 **Node.js 18.0 或更高版本**。 + +验证 Node.js 安装: + +```bash +node --version +``` + +验证 npm 安装: + +```bash +npm --version +``` + +如果未安装或版本过低,请参考[安装指南](/installation)中的相关软件安装说明。 + +## 安装 OpenSpec + +:::tip[版本要求] +本项目要求使用 **OpenSpec >=1.0.0 <2.0.0** 版本范围。支持所有 1.x 版本(最高支持 1.x),以确保与项目工作流兼容。 +::: + +OpenSpec 通过 npm 全局安装,使其在系统的任何位置都可用。 + +### 使用 npm 全局安装 + + + + 在 PowerShell 或命令提示符中运行: + +```powershell +npm install -g @fission-ai/openspec@1 +``` + +:::note[Windows 权限问题] +如果在安装过程中遇到权限错误,请以管理员身份运行 PowerShell 或命令提示符。 +::: + + + 在终端中运行: + +```bash +npm install -g @fission-ai/openspec@1 +``` + +:::note[macOS 权限问题] +如果遇到 `EACCES` 权限错误,可以尝试: +```bash +sudo npm install -g @fission-ai/openspec@1 +``` +或使用 [nvm](https://github.com/nvm-sh/nvm) 管理 Node.js 版本,避免权限问题。 +::: + + + 在终端中运行: + +```bash +npm install -g @fission-ai/openspec@1 +``` + +:::note[Linux 权限问题] +如果遇到 `EACCES` 权限错误,可以: +1. 使用 `sudo`:`sudo npm install -g @fission-ai/openspec@1` +2. 配置 npm 使用用户目录: +```bash +mkdir -p ~/.npm-global +npm config set prefix '~/.npm-global' +echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc +source ~/.bashrc +``` +::: + + + +### 验证安装 + +安装完成后,验证 OpenSpec 是否正确安装且版本符合要求: + +```bash +openspec --version +``` + +如果安装成功,您将看到版本号输出,例如: + +``` +openspec/1.1.1 linux-x64 node-v18.17.0 +``` + +:::note[版本范围] +请确保安装的 OpenSpec 版本在 >=1.0.0 <2.0.0 范围内。项目已验证 1.1.1 版本兼容性。建议使用最新兼容版本以获取新功能。 +::: + +## 常见问题和故障排除 + +### 权限错误 + +#### 问题:`EACCES` 权限被拒绝 + +在安装或运行 OpenSpec 时遇到权限错误。 + +**解决方案**: + + + + 以管理员身份运行 PowerShell 或命令提示符: + 1. 右键点击 PowerShell 或命令提示符 + 2. 选择"以管理员身份运行" + 3. 重新运行安装命令 + + + 使用 `sudo` 安装: + +```bash +sudo npm install -g @fission-ai/openspec@1 +``` + +或使用 [nvm](https://github.com/nvm-sh/nvm) 管理 Node.js,避免全局安装权限问题。 + + + 方案 1:使用 sudo +```bash +sudo npm install -g @fission-ai/openspec@1 +``` + +方案 2:配置 npm 使用用户目录 +```bash +mkdir -p ~/.npm-global +npm config set prefix '~/.npm-global' +echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc +source ~/.bashrc +npm install -g @fission-ai/openspec@1 +``` + + + +### 网络问题 + +#### 问题:npm 安装失败或速度很慢 + +由于网络原因,无法从 npm registry 下载 OpenSpec。 + +**解决方案**: + +1. **使用国内 npm 镜像**: + +```bash +# 使用淘宝镜像 +npm config set registry https://registry.npmmirror.com + +# 然后重新安装 +npm install -g @fission-ai/openspec@1 +``` + +2. **恢复官方源**(如果需要): + +```bash +npm config set registry https://registry.npmjs.org +``` + +3. **使用 cnpm**(可选): + +```bash +npm install -g cnpm --registry=https://registry.npmmirror.com +cnpm install -g @fission-ai/openspec@1 +``` + +:::tip +国内用户建议使用淘宝镜像,可以显著提升下载速度。 +::: + +### 版本兼容性问题 + +#### 问题:OpenSpec 命令运行异常或报错 + +安装的 OpenSpec 版本与当前环境不兼容。 + +**解决方案**: + +1. **检查 Node.js 版本**: + +```bash +node --version +``` + +确保版本为 18.0 或更高。如果版本过低,请升级 Node.js。 + +2. **检查 OpenSpec 版本**: + +```bash +openspec --version +``` + +3. **重新安装特定版本**: + +```bash +npm install -g @fission-ai/openspec@1 +``` + +4. **清理 npm 缓存**(如果问题持续): + +```bash +npm cache clean --force +npm install -g @fission-ai/openspec@1 +``` + +### 命令未找到 + +#### 问题:输入 `openspec` 命令提示"命令未找到" + +OpenSpec 已安装但系统无法找到该命令。 + +**解决方案**: + + + + 1. 确认 npm 全局安装路径: + +```powershell +npm config get prefix +``` + +2. 将路径添加到系统 PATH: + - 打开"系统属性" → "高级" → "环境变量" + - 在"系统变量"中找到 `Path` + - 添加 npm 全局路径(通常是 `C:\Users\<用户名>\AppData\Roaming\npm`) + - 重启命令行窗口 + + + 1. 确认 npm 全局安装路径: + +```bash +npm config get prefix +``` + +2. 将路径添加到 PATH(在 `~/.zshrc` 或 `~/.bash_profile` 中): + +```bash +export PATH="$(npm config get prefix)/bin:$PATH" +``` + +3. 重新加载配置: + +```bash +source ~/.zshrc +``` + + + 1. 确认 npm 全局安装路径: + +```bash +npm config get prefix +``` + +2. 将路径添加到 PATH(在 `~/.bashrc` 中): + +```bash +export PATH="$(npm config get prefix)/bin:$PATH" +``` + +3. 重新加载配置: + +```bash +source ~/.bashrc +``` + + + +## 升级 OpenSpec + +:::note[版本范围] +本项目要求使用 OpenSpec >=1.0.0 <2.0.0 版本范围。如有版本更新需求,请参考项目文档。 +::: + +如果需要重新安装特定版本: + +```bash +npm install -g @fission-ai/openspec@1 +``` + +## 卸载 OpenSpec + +如果需要卸载 OpenSpec: + + + + +```powershell +npm uninstall -g @fission-ai/openspec +``` + + + +```bash +npm uninstall -g @fission-ai/openspec +``` + +或使用 sudo: + +```bash +sudo npm uninstall -g @fission-ai/openspec +``` + + + +```bash +npm uninstall -g @fission-ai/openspec +``` + +或使用 sudo: + +```bash +sudo npm uninstall -g @fission-ai/openspec +``` + + + +## 下一步 + +OpenSpec 安装完成后,您可以继续以下步骤: + + + + + + + + + + + +:::tip +需要更详细的 OpenSpec 使用指南,请参考 [OpenSpec 官方文档](https://github.com/fission-ai/openspec)。 +::: + +## 需要更多帮助? + +如果您遇到此处未涵盖的问题: + +1. 查看 [OpenSpec GitHub Issues](https://github.com/fission-ai/openspec/issues) 寻找类似问题 +2. 访问 [OpenSpec 官方文档](https://github.com/fission-ai/openspec) 获取更多信息 +3. 参考 [PCode 文档站点](https://github.com/pcode/pcode-docs) 寻求帮助 diff --git a/src/content/docs/related-software-installation/postgresql/install-on-windows.md.backup b/src/content/docs/related-software-installation/postgresql/install-on-windows.md.backup new file mode 100644 index 0000000..f06d5e1 --- /dev/null +++ b/src/content/docs/related-software-installation/postgresql/install-on-windows.md.backup @@ -0,0 +1,158 @@ +--- +title: 在 Windows 上安装 PostgreSQL +description: 本指南将帮助您在 Windows 系统上安装和配置 PostgreSQL 数据库。 +sidebar_position: 10 +--- + +本指南将详细说明如何在 Windows 操作系统上安装 PostgreSQL 数据库。PostgreSQL 是 PCode 运行所需的数据库系统。 + +## 前置要求 + +在开始安装之前,请确保: + +- 您使用的是 Windows 10 或更高版本 +- 您具有管理员权限以安装软件 +- 您的硬盘至少有 500MB 的可用空间 + +## 下载 PostgreSQL 安装程序 + +1. 访问 [EnterpriseDB PostgreSQL 下载页面](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) +2. 选择您需要的 PostgreSQL 版本(推荐使用最新稳定版本) +3. 选择操作系统为 "Windows" +4. 下载适合您系统的安装程序: + - **x86-64** (推荐):适用于 64 位 Windows 系统 + - **x86-32**:适用于 32 位 Windows 系统 +5. 运行下载的 `.exe` 安装程序 + +:::tip +推荐下载 PostgreSQL 16 或更高版本以获得最佳性能和安全性。 +::: + +## 安装步骤 + +### 步骤 1: 打开安装界面 + +双击运行安装程序后,您将看到 PostgreSQL 的安装向导界面。 + +![打开安装界面](/img/install-postgres-windows/1.打开安装界面.png) + +点击"下一步"继续安装过程。 + +### 步骤 2: 设置安装的文件夹 + +选择 PostgreSQL 的安装目录。默认安装路径为 `C:\Program Files\PostgreSQL\16`。 + +![设置安装的文件夹](/img/install-postgres-windows/2.设置安装的文件夹.png) + +:::tip +建议使用默认路径,除非您有特殊需求需要安装到其他位置。 +::: + +点击"下一步"继续。 + +### 步骤 3: 设置安装的内容 + +选择要安装的组件。默认情况下,以下组件会被选中: + +- PostgreSQL Server - 数据库服务器 +- pgAdmin 4 - 图形化管理工具 +- Stack Builder - 包管理器 +- Command Line Tools - 命令行工具 + +![设置安装的内容](/img/install-postgres-windows/3.设置安装的内容.png) + +建议保持默认选择,点击"下一步"继续。 + +### 步骤 4: 设置数据库存放数据的文件夹 + +指定数据库数据存储目录。默认路径为 `C:\Program Files\PostgreSQL\16\data`。 + +![设置数据库存放数据的文件夹](/img/install-postgres-windows/4.设置之后数据库存放数据的文件夹.png) + +:::note +数据目录将包含所有数据库文件,请确保有足够的磁盘空间。 +::: + +点击"下一步"继续。 + +### 步骤 5: 设置数据库初始用户的密码 + +设置 PostgreSQL 超级用户(postgres)的密码。这是数据库管理员的密码,请妥善保管。 + +![设置数据库初始用户的密码](/img/install-postgres-windows/5.设置数据库初始用户的密码.png) + +:::warning 安全建议 +- 使用强密码(至少 8 位,包含大小写字母、数字和特殊字符) +- 不要忘记此密码,后续连接数据库时需要使用 +- 生产环境中请勿使用简单密码 +::: + +点击"下一步"继续。 + +### 步骤 6: 设置数据库的端口 + +设置 PostgreSQL 服务监听的端口。默认端口为 `5432`。 + +![设置数据库端口](/img/install-postgres-windows/6.设置数据库的端口.png) + +:::tip +- 保持默认端口 5432,除非该端口已被其他应用程序占用 +- 如果更改端口,请记住新端口号,连接时需要使用 +::: + +点击"下一步"继续。 + +### 步骤 7: 设置数据库的字符集和文化 + +设置数据库的区域设置(Locale)和字符集。 + +![设置数据库字符集](/img/install-postgres-windows/7.设置数据库的字符集和文化.png) + +:::tip +- **保持默认选择 [default]** 即可,无需修改 +- 默认选项会根据您的系统自动选择合适的区域设置 +- 这将确保最佳兼容性和性能 +::: + +点击"下一步"继续。 + +### 步骤 8: 查看安装的计划 + +安装程序将显示所有配置信息的摘要。请仔细检查以下信息: + +- 安装路径 +- 数据目录 +- 端口号 +- 区域设置 + +![查看安装计划](/img/install-postgres-windows/8.查看安装的计划.png) + +确认信息无误后,点击"下一步"开始安装。 + +### 步骤 9: 准备开始安装 + +安装程序已准备好开始复制文件和配置系统。 + +![准备开始安装](/img/install-postgres-windows/9.准备开始安装,点击下一步开始.png) + +点击"下一步"开始安装过程。 + +### 步骤 10: 实时展示安装进度 + +安装程序将显示安装进度条,这个过程可能需要几分钟时间。 + +![安装进度](/img/install-postgres-windows/10.实时展示安装进度.png) + +请耐心等待安装完成。 + +### 步骤 11: 安装已完成 + +安装完成后,您将看到成功提示界面。 + +![安装完成](/img/install-postgres-windows/11.安装已完成.png) + +取消勾选"Launch Stack Builder at exit?"(除非您需要额外的扩展),然后点击"完成"按钮退出安装向导。 + +## 下一步 + +PostgreSQL 安装完成后,[返回安装指南](/installation)继续配置。 diff --git a/src/content/docs/related-software-installation/postgresql/install-on-windows.mdx b/src/content/docs/related-software-installation/postgresql/install-on-windows.mdx new file mode 100644 index 0000000..9d2606c --- /dev/null +++ b/src/content/docs/related-software-installation/postgresql/install-on-windows.mdx @@ -0,0 +1,158 @@ +--- +title: 在 Windows 上安装 PostgreSQL +description: 本指南将帮助您在 Windows 系统上安装和配置 PostgreSQL 数据库。 +sidebar_position: 10 +--- + +本指南将详细说明如何在 Windows 操作系统上安装 PostgreSQL 数据库。PostgreSQL 是 PCode 运行所需的数据库系统。 + +## 前置要求 + +在开始安装之前,请确保: + +- 您使用的是 Windows 10 或更高版本 +- 您具有管理员权限以安装软件 +- 您的硬盘至少有 500MB 的可用空间 + +## 下载 PostgreSQL 安装程序 + +1. 访问 [EnterpriseDB PostgreSQL 下载页面](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) +2. 选择您需要的 PostgreSQL 版本(推荐使用最新稳定版本) +3. 选择操作系统为 "Windows" +4. 下载适合您系统的安装程序: + - **x86-64** (推荐):适用于 64 位 Windows 系统 + - **x86-32**:适用于 32 位 Windows 系统 +5. 运行下载的 `.exe` 安装程序 + +:::tip +推荐下载 PostgreSQL 16 或更高版本以获得最佳性能和安全性。 +::: + +## 安装步骤 + +### 步骤 1: 打开安装界面 + +双击运行安装程序后,您将看到 PostgreSQL 的安装向导界面。 + +![打开安装界面](../../img/installation/install-postgres-windows/1.打开安装界面.png) + +点击"下一步"继续安装过程。 + +### 步骤 2: 设置安装的文件夹 + +选择 PostgreSQL 的安装目录。默认安装路径为 `C:\Program Files\PostgreSQL\16`。 + +![设置安装的文件夹](../../img/installation/install-postgres-windows/2.设置安装的文件夹.png) + +:::tip +建议使用默认路径,除非您有特殊需求需要安装到其他位置。 +::: + +点击"下一步"继续。 + +### 步骤 3: 设置安装的内容 + +选择要安装的组件。默认情况下,以下组件会被选中: + +- PostgreSQL Server - 数据库服务器 +- pgAdmin 4 - 图形化管理工具 +- Stack Builder - 包管理器 +- Command Line Tools - 命令行工具 + +![设置安装的内容](../../img/installation/install-postgres-windows/3.设置安装的内容.png) + +建议保持默认选择,点击"下一步"继续。 + +### 步骤 4: 设置数据库存放数据的文件夹 + +指定数据库数据存储目录。默认路径为 `C:\Program Files\PostgreSQL\16\data`。 + +![设置数据库存放数据的文件夹](../../img/installation/install-postgres-windows/4.设置之后数据库存放数据的文件夹.png) + +:::note +数据目录将包含所有数据库文件,请确保有足够的磁盘空间。 +::: + +点击"下一步"继续。 + +### 步骤 5: 设置数据库初始用户的密码 + +设置 PostgreSQL 超级用户(postgres)的密码。这是数据库管理员的密码,请妥善保管。 + +![设置数据库初始用户的密码](../../img/installation/install-postgres-windows/5.设置数据库初始用户的密码.png) + +:::warning 安全建议 +- 使用强密码(至少 8 位,包含大小写字母、数字和特殊字符) +- 不要忘记此密码,后续连接数据库时需要使用 +- 生产环境中请勿使用简单密码 +::: + +点击"下一步"继续。 + +### 步骤 6: 设置数据库的端口 + +设置 PostgreSQL 服务监听的端口。默认端口为 `5432`。 + +![设置数据库端口](../../img/installation/install-postgres-windows/6.设置数据库的端口.png) + +:::tip +- 保持默认端口 5432,除非该端口已被其他应用程序占用 +- 如果更改端口,请记住新端口号,连接时需要使用 +::: + +点击"下一步"继续。 + +### 步骤 7: 设置数据库的字符集和文化 + +设置数据库的区域设置(Locale)和字符集。 + +![设置数据库字符集](../../img/installation/install-postgres-windows/7.设置数据库的字符集和文化.png) + +:::tip +- **保持默认选择 [default]** 即可,无需修改 +- 默认选项会根据您的系统自动选择合适的区域设置 +- 这将确保最佳兼容性和性能 +::: + +点击"下一步"继续。 + +### 步骤 8: 查看安装的计划 + +安装程序将显示所有配置信息的摘要。请仔细检查以下信息: + +- 安装路径 +- 数据目录 +- 端口号 +- 区域设置 + +![查看安装计划](../../img/installation/install-postgres-windows/8.查看安装的计划.png) + +确认信息无误后,点击"下一步"开始安装。 + +### 步骤 9: 准备开始安装 + +安装程序已准备好开始复制文件和配置系统。 + +![准备开始安装](../../img/installation/install-postgres-windows/9.准备开始安装,点击下一步开始.png) + +点击"下一步"开始安装过程。 + +### 步骤 10: 实时展示安装进度 + +安装程序将显示安装进度条,这个过程可能需要几分钟时间。 + +![安装进度](../../img/installation/install-postgres-windows/10.实时展示安装进度.png) + +请耐心等待安装完成。 + +### 步骤 11: 安装已完成 + +安装完成后,您将看到成功提示界面。 + +![安装完成](../../img/installation/install-postgres-windows/11.安装已完成.png) + +取消勾选"Launch Stack Builder at exit?"(除非您需要额外的扩展),然后点击"完成"按钮退出安装向导。 + +## 下一步 + +PostgreSQL 安装完成后,[返回安装指南](/installation)继续配置。 diff --git a/src/integrations/mermaid-injector.ts b/src/integrations/mermaid-injector.ts new file mode 100644 index 0000000..2f2a609 --- /dev/null +++ b/src/integrations/mermaid-injector.ts @@ -0,0 +1,16 @@ +/** + * Mermaid 注入器集成 + * 为包含 mermaid 图表的页面注入必要的渲染脚本 + */ +import type { AstroIntegration } from 'astro'; + +export default function mermaidInjector(): AstroIntegration { + return { + name: 'mermaid-injector', + hooks: { + 'astro:build:done': () => { + // 构建完成后的钩子 + }, + }, + }; +} diff --git a/src/pages/blog/rss.xml.ts b/src/pages/blog/rss.xml.ts new file mode 100644 index 0000000..b29a010 --- /dev/null +++ b/src/pages/blog/rss.xml.ts @@ -0,0 +1,36 @@ +import rss from '@astrojs/rss'; +import { getCollection } from 'astro:content'; + +// 获取 base 路径的函数(与 astro.config.mjs 中的逻辑一致) +function getBasePath(): string { + // 文档站点现在独立部署在 docs.hagicode.com + // 不再需要 /docs 前缀,开发和生产都使用根路径 + return '/'; +} + +export async function GET(context) { + const blog = await getCollection('docs'); + + // 过滤出博客文章(有 date 字段的) + const posts = blog + .filter(post => post.data.date) + .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf()) + .slice(0, 20); // 只显示最新的 20 篇 + + const basePath = getBasePath(); + const site = context.site?.toString() || 'https://hagicode.com'; + + return rss({ + title: 'Hagicode Docs | Blog', + description: 'Hagicode 项目文档', + site: site, + items: posts.map(post => ({ + title: post.data.title, + link: `${basePath}/${post.id}/`, // 使用 id 而不是 slug + pubDate: post.data.date, + description: post.data.excerpt || '', + // 不包含 content,只有标题、链接和描述 + })), + customData: `zh-cn`, + }); +} diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..3898741 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,40 @@ +--- +/** + * 首页 - 重定向到产品概述 + */ +const canonicalURL = new URL(Astro.url.origin); +canonicalURL.pathname = '/product-overview'; +--- + + + + + + + 正在跳转... + + + + + +

正在跳转到产品概述,如果没有自动跳转,请点击这里

+ + + diff --git a/src/styles/fonts.css b/src/styles/fonts.css new file mode 100644 index 0000000..89f79d4 --- /dev/null +++ b/src/styles/fonts.css @@ -0,0 +1,358 @@ +/** + * Hagicode 全局字体配置 + * 现代化跨平台字体栈,优先使用各平台最佳字体 + * + * 字体选择策略: + * 1. 优先使用系统内置的现代字体 (最快、最清晰) + * 2. 跨平台字体栈确保一致性 + * 3. 中英文分别优化,确保最佳显示效果 + */ + +/* ========================================================================== + CSS 字体变量定义 + ========================================================================== */ + +:root { + /* ============================================ + 中文字体栈 - 按平台优化 + ============================================ */ + + /* 无衬线中文字体 - 正文/UI */ + --font-cn-sans: + /* macOS 优先 */ + -apple-system, + BlinkMacSystemFont, + "PingFang SC", + "Hiragino Sans GB", + /* Windows 11+ */ + "Microsoft YaHei UI", + /* Windows 10 及以下 */ + "Microsoft YaHei", + /* Windows XP 老系统 */ + "Segoe UI", + /* Android */ + "Noto Sans SC", + "Roboto", + /* Linux */ + "WenQuanYi Micro Hei", + /* 通用回退 */ + sans-serif; + + /* 衬线中文字体 - 标题/特殊场景 */ + --font-cn-serif: + /* macOS */ + "Songti SC", + "Hiragino Mincho ProN", + /* Windows */ + "SimSun", + "NSimSun", + /* Android */ + "Noto Serif SC", + /* Linux */ + "WenQuanYi Zen Hei", + /* 通用回退 */ + "STSong", + serif; + + /* 等宽中文字体 - 代码/数据 */ + --font-cn-mono: + /* macOS */ + "PingFang SC", + "Hiragino Sans GB", + /* Windows */ + "Microsoft YaHei", + /* Android */ + "Noto Sans SC", + /* 通用回退 */ + sans-serif, + monospace; + + /* ============================================ + 英文字体栈 - 现代化设计 + ============================================ */ + + /* 无衬线英文字体 - 正文/UI */ + --font-en-sans: + /* macOS SF Pro (系统默认) */ + -apple-system, + BlinkMacSystemFont, + "SF Pro Text", + "SF Pro Display", + /* Windows Segoe UI */ + "Segoe UI Variable", + "Segoe UI", + /* Android Roboto */ + "Roboto", + /* Ubuntu Linux */ + "Ubuntu", + "Cantarell", + /* 通用回退 */ + system-ui, + sans-serif; + + /* 衬线英文字体 - 标题/文章 */ + --font-en-serif: + /* macOS New York */ + "New York", + "SF Pro Display", + /* Georgia */ + Georgia, + "Times New Roman", + /* 通用回退 */ + serif; + + /* 等宽英文字体 - 代码 */ + --font-en-mono: + /* macOS */ + "SF Mono", + "Menlo", + "Monaco", + /* Windows 11+ */ + "Cascadia Code", + "Cascadia Mono", + /* Windows 老版本 */ + "Consolas", + "Lucida Console", + /* Android */ + "Roboto Mono", + /* Linux / 开源字体 */ + "Fira Code", + "JetBrains Mono", + "Source Code Pro", + "DejaVu Sans Mono", + /* 通用回退 */ + monospace; + + /* ============================================ + 组合字体栈 - 中英文混排优化 + ============================================ */ + + /* 正文/UI 字体 - 中英文混排优先 */ + --font-body: + var(--font-cn-sans); + + /* 标题字体 - 更粗的显示效果 */ + --font-heading: + var(--font-cn-sans); + + /* 代码字体 - 等宽优先 */ + --font-code: + var(--font-en-mono), + var(--font-cn-mono); + + /* 引用/特殊文字 - 衬线字体 */ + --font-quote: + var(--font-cn-serif); + + /* ============================================ + 数字字体 - 表格数据/数字显示 + ============================================ */ + + /* 表格数字字体 - 等宽数字优化 */ + --font-tabular: + "SF Mono", + "Menlo", + "Cascadia Code", + "Consolas", + "Roboto Mono", + monospace; + + /* ============================================ + 特殊场景字体 + ============================================ */ + + /* 按钮文字 - 更粗更醒目 */ + --font-button: + /* macOS */ + -apple-system, + BlinkMacSystemFont, + "SF Pro Display", + "PingFang SC", + "Microsoft YaHei UI", + system-ui, + sans-serif; + + /* 标签/徽章文字 */ + --font-tag: + -apple-system, + BlinkMacSystemFont, + "SF Pro Text", + "PingFang SC", + "Segoe UI", + "Roboto", + sans-serif; + + /* 小字/说明文字 */ + --font-small: + -apple-system, + BlinkMacSystemFont, + "SF Pro Text", + "PingFang SC", + "Microsoft YaHei", + sans-serif; +} + +/* ========================================================================== + 平台特定优化 + ========================================================================== */ + +/* macOS 字体平滑 */ +@media screen and (-webkit-min-device-pixel-ratio: 1) { + :root { + --font-smoothing: antialiased; + --moz-osx-font-smoothing: grayscale; + } +} + +/* Windows 字体平滑 */ +@media screen and (min-resolution: 96dpi) { + :root { + --font-smoothing: antialiased; + } +} + +/* ========================================================================== + 字体渲染属性 + ========================================================================== */ + +* { + /* macOS 字体平滑 */ + -webkit-font-smoothing: var(--font-smoothing, antialiased); + -moz-osx-font-smoothing: var(--moz-osx-font-smoothing, grayscale); + + /* 字体变体设置 */ + font-variant-ligatures: common-ligatures; + font-feature-settings: "kern" 1, "liga" 1; +} + +/* 代码字体优化 - 启用连字 */ +code, +pre, +.code, +.font-code { + font-family: var(--font-code); + font-feature-settings: + "kern" 1, + "liga" 1, + "calt" 1, + "zero" 1; + font-variant-ligatures: common-ligatures contextual; +} + +/* 表格数字等宽优化 */ +table, +.font-tabular { + font-family: var(--font-tabular); + font-variant-numeric: tabular-nums; +} + +/* ========================================================================== + 字重映射 + ========================================================================== */ + +:root { + /* Thin - 100 */ + --font-weight-thin: 100; + + /* Extra Light - 200 */ + --font-weight-extralight: 200; + + /* Light - 300 */ + --font-weight-light: 300; + + /* Regular - 400 (默认) */ + --font-weight-regular: 400; + + /* Medium - 500 */ + --font-weight-medium: 500; + + /* Semi Bold - 600 */ + --font-weight-semibold: 600; + + /* Bold - 700 */ + --font-weight-bold: 700; + + /* Extra Bold - 800 */ + --font-weight-extrabold: 800; + + /* Black - 900 */ + --font-weight-black: 900; +} + +/* ========================================================================== + 行高与间距 + ========================================================================== */ + +:root { + /* 紧凑行高 - 大标题 */ + --line-height-tight: 1.1; + + /* 默认行高 - 正文 */ + --line-height-normal: 1.6; + + /* 宽松行高 - 长文章 */ + --line-height-relaxed: 1.8; + + /* 字母间距 */ + --letter-spacing-tight: -0.02em; + --letter-spacing-normal: 0; + --letter-spacing-wide: 0.05em; + --letter-spacing-wider: 0.1em; + --letter-spacing-widest: 0.2em; +} + +/* ========================================================================== + 工具类 - 字体系列 + ========================================================================== */ + +.font-sans { + font-family: var(--font-body); +} + +.font-serif { + font-family: var(--font-quote); +} + +.font-mono { + font-family: var(--font-code); +} + +.font-heading { + font-family: var(--font-heading); +} + +/* ========================================================================== + 工具类 - 字重 + ========================================================================== */ + +.font-thin { + font-weight: var(--font-weight-thin); +} + +.font-light { + font-weight: var(--font-weight-light); +} + +.font-regular { + font-weight: var(--font-weight-regular); +} + +.font-medium { + font-weight: var(--font-weight-medium); +} + +.font-semibold { + font-weight: var(--font-weight-semibold); +} + +.font-bold { + font-weight: var(--font-weight-bold); +} + +.font-extrabold { + font-weight: var(--font-weight-extrabold); +} + +.font-black { + font-weight: var(--font-weight-black); +} diff --git a/src/styles/install-button.css b/src/styles/install-button.css new file mode 100644 index 0000000..605c213 --- /dev/null +++ b/src/styles/install-button.css @@ -0,0 +1,378 @@ +/** + * InstallButton 组件样式 - 文档站点版本 + * 与营销站点保持一致的视觉效果 + */ + +/* ========================================================================== + 安装按钮容器 + ========================================================================== */ + +.install-button-wrapper { + display: inline-block; +} + +.split-button-container { + position: relative; + display: flex; + align-items: stretch; +} + +/* 紧凑模式 - Header 导航栏使用 */ +.install-button-wrapper--compact .split-button-container { + min-height: 40px; +} + +/* ========================================================================== + 主下载按钮 + ========================================================================== */ + +.btn-download-main { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 1rem; + /* 高饱和度渐变填充背景 */ + background: linear-gradient(135deg, #0080FF 0%, #00CCCC 50%, #22C55E 100%); + background-size: 200% 200%; + color: #ffffff !important; + text-decoration: none; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease-out; + border: none; + /* 波动渐变动画 */ + animation: install-button-gradient-wave 3s ease-in-out infinite; +} + +.install-button-wrapper--compact .btn-download-main { + border-radius: var(--radius-md) 0 0 var(--radius-md); + min-height: 40px; + font-size: 0.9375rem; +} + +.btn-download-main:hover { + background-position: 100% 50%; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(74, 144, 217, 0.2); +} + +/* 按钮波动渐变动画 */ +@keyframes install-button-gradient-wave { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +.download-icon { + width: 1rem; + height: 1rem; + flex-shrink: 0; +} + +.btn-text { + white-space: nowrap; +} + +/* ========================================================================== + 下拉切换按钮 + ========================================================================== */ + +.btn-dropdown-toggle { + display: flex; + align-items: center; + justify-content: center; + /* 高饱和度渐变填充背景 */ + background: linear-gradient(135deg, #0080FF 0%, #00CCCC 50%, #22C55E 100%); + background-size: 200% 200%; + border: none; + border-left: 1px solid rgba(255, 255, 255, 0.25); + color: #ffffff !important; + cursor: pointer; + transition: all 0.2s ease-out; + padding: 0; + /* 波动渐变动画 */ + animation: install-button-gradient-wave 3s ease-in-out infinite; +} + +.install-button-wrapper--compact .btn-dropdown-toggle { + width: 36px; + min-width: 36px; + border-radius: 0 var(--radius-md) var(--radius-md) 0; +} + +.btn-dropdown-toggle:hover { + background-position: 100% 50%; +} + +/* ========================================================================== + 下拉菜单 + ========================================================================== */ + +.dropdown-menu { + position: absolute; + top: calc(100% + 0.25rem); + left: 0; + width: 40vw; + max-width: 400px; + background: var(--sl-color-bg-inset); + background-color: #ffffff; + border: 1px solid var(--sl-color-gray-6); + border-color: rgba(0, 0, 0, 0.1); + border-radius: 0.5rem; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); + list-style: none; + margin: 0; + padding: 0.75rem; + opacity: 0; + visibility: hidden; + transform: translateY(-10px); + transition: all 0.2s ease-out; + z-index: 99999; +} + +.dropdown-menu-open { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +/* ========================================================================== + 平台分组标签 + ========================================================================== */ + +.dropdown-group-label { + position: relative; + display: flex; + align-items: center; + gap: 0.375rem; + padding: 0.5rem 0.75rem; + margin: 0.25rem -0.75rem; + font-size: 0.8125rem; + font-weight: 600; + color: var(--sl-color-gray-2); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.dropdown-group-label::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 4px; + border-radius: 0 2px 2px 0; +} + +/* Windows - 蓝色 */ +.platform--windows::before { + background: linear-gradient(180deg, #0080FF 0%, #0066CC 100%); +} + +/* macOS - 紫色 */ +.platform--macos::before { + background: linear-gradient(180deg, #9B59B6 0%, #8E44AD 100%); +} + +/* Linux - 橙色 */ +.platform--linux::before { + background: linear-gradient(180deg, #E67E22 0%, #D35400 100%); +} + +.platform-icon { + font-size: 1rem; + line-height: 1; +} + +.platform-name { + display: block; + padding-left: 0.125rem; +} + +.version-tag { + margin-left: auto; + font-size: 0.75rem; + font-weight: 500; + color: var(--sl-color-gray-2); + opacity: 0.7; +} + +/* ========================================================================== + 下拉菜单项 + ========================================================================== */ + +.dropdown-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + min-height: 40px; + padding: 0.75rem 0.875rem; + color: var(--sl-color-gray-1); + text-decoration: none; + border-radius: 0.375rem; + transition: all 0.15s ease-out; + font-size: 0.875rem; + cursor: pointer; +} + +.dropdown-item:hover { + background: var(--sl-color-gray-6); + color: var(--sl-color-white); +} + +.dropdown-item-label { + flex: 1; + display: flex; + align-items: center; + gap: 0.25rem; +} + +.arch-label { + font-size: 0.75rem; + color: var(--sl-color-gray-2); + font-weight: 400; +} + +.file-ext-badge { + display: inline-flex; + align-items: center; + padding: 0.125rem 0.375rem; + margin-left: 0.25rem; + font-size: 0.65rem; + font-weight: 600; + color: #0080FF; + background: rgba(0, 128, 255, 0.08); + border-radius: 0.25rem; + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + letter-spacing: 0.02em; +} + +.recommended-badge { + display: inline-flex; + align-items: center; + font-size: 0.7rem; + color: #FFA000; + font-weight: 500; + margin-left: 0.25rem; +} + +.dropdown-item-size { + font-size: 0.75rem; + color: var(--sl-color-gray-2); +} + +/* ========================================================================== + 分隔线 + ========================================================================== */ + +.dropdown-separator { + margin: 0.5rem 0; + border-top: 1px solid var(--sl-color-gray-6); +} + +/* ========================================================================== + Docker 选项特殊样式 + ========================================================================== */ + +.dropdown-item-docker { + color: #0080FF; + font-weight: 500; + gap: 0.75rem; +} + +.dropdown-item-docker:hover { + background: linear-gradient(135deg, rgba(0, 128, 255, 0.1) 0%, rgba(0, 204, 204, 0.1) 50%, rgba(34, 197, 94, 0.1) 100%); +} + +.docker-icon { + width: 1rem; + height: 1rem; + flex-shrink: 0; + color: currentColor; +} + +.external-icon { + width: 0.875rem; + height: 0.875rem; + flex-shrink: 0; + color: var(--sl-color-gray-2); + opacity: 0.6; +} + +.dropdown-item-docker:hover .external-icon { + opacity: 1; +} + +/* ========================================================================== + 暗色主题适配 + ========================================================================== */ + +[data-theme='dark'] .btn-download-main { + background: linear-gradient(135deg, #0080FF 0%, #00CCCC 50%, #22C55E 100%); + background-size: 200% 200%; + animation: install-button-gradient-wave 3s ease-in-out infinite; +} + +[data-theme='dark'] .btn-dropdown-toggle { + background: linear-gradient(135deg, #0080FF 0%, #00CCCC 50%, #22C55E 100%); + background-size: 200% 200%; + border-left-color: rgba(255, 255, 255, 0.15); + animation: install-button-gradient-wave 3s ease-in-out infinite; +} + +[data-theme='dark'] .btn-download-main:hover, +[data-theme='dark'] .btn-dropdown-toggle:hover { + background: linear-gradient(135deg, #1A90FF 0%, #10DDDD 50%, #32D55E 100%); +} + +[data-theme='dark'] .dropdown-menu { + background: #0a0f1e; + background-color: #0a0f1e; + border-color: rgba(255, 255, 255, 0.12); +} + +/* 暗色主题下的平台色栏 - 更柔和 */ +[data-theme='dark'] .platform--windows::before { + background: linear-gradient(180deg, #0066CC 0%, #004C99 100%); +} + +[data-theme='dark'] .platform--macos::before { + background: linear-gradient(180deg, #7B3996 0%, #6E349D 100%); +} + +[data-theme='dark'] .platform--linux::before { + background: linear-gradient(180deg, #C66E12 0%, #B34400 100%); +} + +/* ========================================================================== + 移动端响应式样式 + ========================================================================== */ + +@media (max-width: 480px) { + .dropdown-menu { + width: 90vw; + max-width: 90vw; + right: 0; + } +} + +/* ========================================================================== + 减少动画偏好 + ========================================================================== */ + +@media (prefers-reduced-motion: reduce) { + .btn-download-main, + .btn-dropdown-toggle, + .dropdown-item, + .dropdown-menu { + animation: none !important; + transition: none !important; + } +} diff --git a/src/styles/starlight-override.css b/src/styles/starlight-override.css new file mode 100644 index 0000000..41b8005 --- /dev/null +++ b/src/styles/starlight-override.css @@ -0,0 +1,166 @@ +/** + * Starlight 主题样式覆盖 + * 将 Starlight 变量映射到 Hagicode 品牌颜色 + * 与首页 homepage.css 保持一致 + */ + +/* ========================================================================== + 字体配置导入 + ========================================================================== */ +@import './fonts.css'; +@import './install-button.css'; + +/* ========================================================================== + 全局字体覆盖 + ========================================================================== */ +:root { + /* 覆盖 Starlight 默认字体 */ + --sl-font: var(--font-body); + --sl-font-heading: var(--font-heading); + --sl-font-code: var(--font-code); +} + +/* ========================================================================== + CSS Variables - 品牌颜色 + ========================================================================== */ +:root, +[data-theme='light'] { + --color-primary: #0080FF; + --color-secondary: #00CCCC; + --color-success: #22C55E; + --gradient-primary: linear-gradient(135deg, #0080FF 0%, #00AAAA 50%, #22C55E 100%); +} + +[data-theme='dark'] { + --color-primary: #00D4FF; + --color-secondary: #00FFFF; + --color-success: #4ADE80; + --gradient-primary: linear-gradient(135deg, #00D4FF 0%, #00FFFF 50%, #4ADE80 100%); +} + +/* ========================================================================== + 备案信息样式 + ========================================================================== */ +.icp-filing-section { + text-align: center; + padding: var(--sl-space-4) 0; + border-top: 1px solid var(--sl-color-gray-6); + margin-top: var(--sl-space-4); +} + +.icp-filing-section a { + color: var(--sl-color-gray-3); + font-size: var(--sl-text-sm); + text-decoration: none; + transition: color var(--sl-transition-fast) ease, + text-decoration var(--sl-transition-fast) ease; +} + +.icp-filing-section a:hover { + color: var(--sl-color-text-accent); + text-decoration: underline; +} + +.icp-filing-section a:focus { + outline: 2px solid var(--sl-color-text-accent); + outline-offset: 2px; + border-radius: var(--sl-radius-sm); +} + +/* 响应式优化 */ +@media (max-width: 767px) { + .icp-filing-section { + font-size: 0.8125rem; + padding: var(--sl-space-3) 0; + } +} + +/* ========================================================================== + 安装按钮组件样式 + ========================================================================== */ + +/* 安装按钮容器 */ +.install-button-wrapper { + display: inline-block; +} + +.split-button-container { + position: relative; + display: flex; + align-items: stretch; +} + +.install-button-wrapper--compact .split-button-container { + min-height: 40px; +} + +/* 主下载按钮 */ +.btn-download-main { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0 1rem; + /* 高饱和度渐变填充背景 */ + background: linear-gradient(135deg, #0080FF 0%, #00CCCC 50%, #22C55E 100%); + background-size: 200% 200%; + color: #ffffff; + text-decoration: none; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease-out; + border: none; + /* 波动渐变动画 */ + animation: install-button-gradient-wave 3s ease-in-out infinite; +} + +.install-button-wrapper--compact .btn-download-main { + border-radius: var(--sl-radius-sm); + min-height: 40px; + font-size: 0.875rem; + padding: 0 1rem; +} + +.btn-download-main:hover { + background-position: 100% 50%; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(74, 144, 217, 0.2); +} + +/* 按钮波动渐变动画 */ +@keyframes install-button-gradient-wave { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* ========================================================================== + 博客列表页面样式覆盖 + ========================================================================== */ + +/* 隐藏博客列表页面中的文章摘要内容 */ +/* 使用 :where() 来忽略 Astro 动态生成的类名 */ +article.preview:where(.astro-*) .sl-markdown-content { + display: none; +} + +/* 备选方案:直接选择所有 article.preview 元素中的摘要 */ +article.preview .sl-markdown-content { + display: none; +} + +/* 调整博客列表项间距,使布局更紧凑 */ +article.preview { + gap: 0.75rem; +} + +/* 调整标题下边距 */ +article.preview h2 { + margin-bottom: 0.75rem; +} + diff --git a/src/utils/path.ts b/src/utils/path.ts new file mode 100644 index 0000000..2bb0337 --- /dev/null +++ b/src/utils/path.ts @@ -0,0 +1,59 @@ +/** + * 路径工具函数 + * 处理站点的 base path,确保在子路径部署时链接正常工作 + */ + +/** + * 获取站点基础路径 + * 从 HTML data 属性或环境变量读取 + */ +export function getBasePath(): string { + // 优先从 HTML 元素的 data 属性读取(运行时) + if (typeof window !== 'undefined') { + const dataBase = document.documentElement.getAttribute('data-site-base'); + if (dataBase) { + return dataBase; + } + } + + // 回退到环境变量(构建时) + if (import.meta.env.VITE_SITE_BASE) { + return import.meta.env.VITE_SITE_BASE; + } + + return '/'; +} + +/** + * 规范化路径,确保包含 base path + * @param path - 原始路径(如 '/docs/...') + * @returns 完整路径(如 '/site/docs/...' 或 '/docs/...') + */ +export function withBasePath(path: string): string { + const base = getBasePath(); + + // 如果是外部链接,直接返回 + if (path.startsWith('http://') || path.startsWith('https://')) { + return path; + } + + // 如果路径已经包含 base,直接返回 + if (base !== '/' && path.startsWith(base)) { + return path; + } + + // 移除开头的斜杠以便拼接 + const normalizedPath = path.startsWith('/') ? path : `/${path}`; + const normalizedBase = base.endsWith('/') ? base.slice(0, -1) : base; + + return `${normalizedBase}${normalizedPath}`; +} + +/** + * 创建带 base path 的 URL + * 用于动态生成链接 + */ +export function createUrl(path: string, hash?: string): string { + const url = withBasePath(path); + return hash ? `${url}${hash.startsWith('#') ? hash : `#${hash}`}` : url; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c599a59 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "jsxImportSource": "react", + + "moduleResolution": "bundler", + "resolveJsonModule": true, + "allowJs": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + "@shared/*": ["./shared/src/*"] + }, + + "isolatedModules": true, + "noEmit": true + }, + "include": [ + ".astro/types.d.ts", + "**/*" + ], + "exclude": [ + "dist", + "node_modules" + ] +}