diff --git a/.cursor/rules/agents.mdc b/.cursor/rules/agents.mdc new file mode 100644 index 0000000..146d814 --- /dev/null +++ b/.cursor/rules/agents.mdc @@ -0,0 +1,10 @@ +--- +description: 项目 Agent 规则(由 AGENTS.md 转化,Cursor 始终应用) +alwaysApply: true +--- + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. + diff --git a/.cursor/rules/design-system.mdc b/.cursor/rules/design-system.mdc new file mode 100644 index 0000000..8aabcae --- /dev/null +++ b/.cursor/rules/design-system.mdc @@ -0,0 +1,27 @@ +--- +description: 写样式与 UI 时必须遵循 DESIGN.md 与项目样式架构 +globs: src/**/*.{css,tsx} +alwaysApply: false +--- + +# 设计系统(浅色高级编辑风) + +## 单一事实来源 + +`DESIGN.md` · `src/styles/tokens.css` · `typography.css` · `layout.css` · `components.css` · `locale-zh.css` · `globals.css` + +## 必须遵守 + +1. **全站浅色**:仅用 `band-light` / `band-muted` / `bg-canvas-page`,**禁止** `band-dark`、深色页背景。 +2. **字体**:标题 `type-display-*`(Noto Serif SC);正文/导航 Inter;代码 `code-panel`。 +3. **主 CTA**:`btn-primary`(墨灰 `#141414`,非大面积黑底区块)。 +4. **层次**:hairline 边框 + 白/米灰底交替,不用渐变与霓虹。 +5. **中文**:`locale-zh.css` 行高与字距;眉标 `type-eyebrow`,导语 `type-lead`。 + +## 禁止 + +深色 band、渐变装饰、荧光色、`zinc-*` 随意色 + +## 变更后 + +运行 `pnpm test` diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..117b508 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +node_modules +.next +out +.git +.gitignore +.cursor +test-results +playwright-report +blob-report +playwright/.cache +coverage +*.md +!README.md +.env* +!.env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4eda999 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +# 站点对外 URL(百度/搜狗提交 sitemap、canonical、OG 绝对地址均依赖此项) +NEXT_PUBLIC_SITE_URL=https://www.haiyushuke.com + +# 百度站长平台 → 站点管理 → 验证站点 → HTML 标签中的 content 值(可选) +# BAIDU_SITE_VERIFICATION=codeva-xxxxxxxx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9653b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + +# next.js +/.next/ +/out/ +/public/_pagefind/ + +# production +/build + +# misc +.DS_Store +scripts/docker/haiyushuke-website-latest.tar + +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +!.env.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..cb564bb --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,7 @@ + + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..077a73c --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,176 @@ +--- +version: 1.0 +name: Haiyu AI — Sci-Fi Intelligence +description: 海宇数科大模型官网视觉规范。深空底色 + 青紫霓虹渐变 + 微弱网格/辉光,传达「智能基础设施」而非传统企业站。 + +colors: + primary: "#0b5fff" + on-primary: "#f8fbff" + ink: "#0a1224" + body: "#5c6b8a" + hairline: "#d8e2f2" + canvas: "#f4f8ff" + canvas-elevated: "#ffffff" + canvas-dark: "#050816" + canvas-dark-mid: "#0c1228" + surface-dark-soft: "#151d3a" + surface-dark-glass: "rgb(12 20 48 / 0.55)" + on-dark: "#eef6ff" + on-dark-muted: "#9eb4d8" + accent-cyan: "#00e8ff" + accent-violet: "#8b5cf6" + accent-magenta: "#e879f9" + accent-electric: "#22d3ee" + accent-mint: "#a5f3fc" + glow-cyan: "rgb(0 232 255 / 0.45)" + glow-violet: "rgb(139 92 246 / 0.4)" + +typography: + display-xxl: + fontFamily: Inter, system-ui, sans-serif + fontSize: 64px + fontWeight: 500 + lineHeight: 1.15 + display-xl: + fontSize: 40px + fontWeight: 500 + lineHeight: 1.2 + display-lg: + fontSize: 28px + fontWeight: 500 + lineHeight: 1.3 + display-md: + fontSize: 22px + fontWeight: 500 + lineHeight: 1.35 + body-lg: + fontSize: 18px + fontWeight: 400 + lineHeight: 1.65 + body-md: + fontSize: 16px + fontWeight: 400 + lineHeight: 1.7 + caption: + fontSize: 14px + fontWeight: 400 + lineHeight: 1.55 + caption-strong: + fontSize: 14px + fontWeight: 500 + lineHeight: 1.55 + mono-caps-button: + fontFamily: JetBrains Mono, ui-monospace, monospace + fontSize: 14px + fontWeight: 500 + mono-caps-eyebrow: + fontSize: 11px + fontWeight: 500 + letterSpacing: 0.12em + mono-caption: + fontSize: 11px + fontWeight: 400 + +rounded: + xs: 3.25px + sm: 6px + md: 10px + full: 9999px + +spacing: + section: 88px + container-gutter-desktop: 32px + container-gutter-mobile: 16px + +components: + nav-bar: + backgroundColor: "{colors.canvas-dark}" + borderColor: "rgb(0 232 255 / 0.15)" + button-primary: + background: "linear-gradient(135deg, {colors.accent-cyan}, {colors.accent-violet})" + textColor: "{colors.on-primary}" + glow: "{colors.glow-cyan}" + button-ghost-on-dark: + backgroundColor: "{colors.surface-dark-glass}" + borderColor: "rgb(0 232 255 / 0.25)" + hero-band-dark: + background: "{colors.canvas-dark} + mesh grid + radial violet glow" + card-on-dark: + background: "{colors.surface-dark-glass}" + borderColor: "rgb(0 232 255 / 0.2)" + card-on-light: + background: "{colors.canvas-elevated}" + borderColor: "{colors.hairline}" + stats-card-tinted: + background: "linear-gradient(145deg, rgb(0 232 255 / 0.12), rgb(139 92 246 / 0.1))" +--- + +## Overview + +海宇数科官网面向**大模型服务与智能报告**的官方展示(非控制台)。视觉关键词:**深空、霓虹、网格、辉光、数据流**。 + +- **深色 band**(`canvas-dark`):Hero、智能体、企业方案、联系。叠加 `band-mesh` 径向光晕与细网格,像「控制台外的指挥舱」。 +- **浅色 band**(`canvas`):产品能力、模型表、资讯。冷白底 + 淡蓝 hairline,卡片微抬。 +- **品牌渐变**(固定三停):`accent-cyan` → `accent-violet` → `accent-magenta`。用于 Hero 装饰、主按钮、标题 `text-gradient`。**禁止**拆成单色图标或再加第四荧光色。 +- **主 CTA**:青紫渐变底 + 外发光(`shadow-glow-cyan`),不是纯黑块。 +- **中文排版**:`locale-zh.css` 放宽行高、取消西文负字距;眉标可用 `type-eyebrow` 或 `type-mono-caps-eyebrow`(短标签)。 + +## Colors + +| 令牌 | 用途 | +| -------------------------------------------------- | ---------------------------- | +| `primary` | 深色填充按钮、强调条(备用) | +| `accent-cyan` / `accent-violet` / `accent-magenta` | 渐变与科技眉标 | +| `canvas-dark` | 深空主背景 | +| `canvas` | 浅色 section | +| `hairline` | 浅色分割与卡片边 | +| `border-glow` | 深色玻璃卡边框(CSS 变量) | +| `on-dark` / `on-dark-muted` | 深色上的正文层级 | + +## Typography + +- 展示:Inter 500,标题可用 `text-gradient`(仅 h1/h2 主标题)。 +- Mono:JetBrains Mono,**仅**代码块、可选短眉标;不写长段落。 + +## Layout + +- `container-site` max 1280px。 +- `band-section` 仅垂直 `section` 间距;水平只由 container 控制。 +- `section-stack` 统一块间距。 + +## Components(实现见 `src/styles/components.css` + `effects.css`) + +- `btn-primary` — 渐变 + 辉光 +- `btn-ghost-on-dark` — 玻璃描边 +- `btn-secondary-glow` — 浅色 band 上的描边 CTA +- `card-on-dark` / `card-glass` — 深色玻璃 +- `card-on-light` — 白卡 + hairline +- `badge-glow` — 深色上的小标签 +- `gradient-brand` / `text-gradient` — 品牌渐变 + +## Do's + +- 深色区域加 `band-mesh` 或 `band-grid`(二选一或叠加,勿整页花屏)。 +- 统计/高亮块用 `stats-tile`(淡青紫渐变底)。 +- 模型表头用 `type-caption-strong` + `text-body`。 + +## Don'ts + +- 不用 `zinc-*` / 随意 hex。 +- 不用 `prefers-color-scheme` 自动主题。 +- 浅色卡片不要大面积彩色阴影;辉光留给按钮与 Hero 装饰。 +- 主标题不要全大写 mono。 + +## 样式文件架构 + +``` +src/app/globals.css # 入口:tailwind + tokens + typography + layout + components + effects + locale-zh +src/styles/tokens.css # @theme 色板、渐变、阴影 +src/styles/typography.css +src/styles/layout.css # container、band、section-stack +src/styles/components.css +src/styles/effects.css # mesh、grid、text-gradient、glow、stats-tile +src/styles/locale-zh.css # 中文排版与按钮字体 +``` + +变更令牌时同步 `tokens.css` 与 `effects.css`,运行 `pnpm test`。 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..50061ac --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +# 构建时可覆盖: --build-arg NODE_IMAGE=node:20-alpine +ARG NODE_IMAGE=node:20-alpine +FROM ${NODE_IMAGE} AS base +RUN apk add --no-cache libc6-compat \ + && corepack enable \ + && corepack prepare pnpm@10.11.0 --activate +ENV CI=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 +ARG NPM_REGISTRY=https://registry.npmmirror.com +ENV NPM_CONFIG_REGISTRY=${NPM_REGISTRY} + +FROM base AS deps +WORKDIR /app +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +ENV NEXT_TELEMETRY_DISABLED=1 +ARG NEXT_PUBLIC_SITE_URL=https://www.haiyushuke.com +ARG BAIDU_SITE_VERIFICATION= +ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL} +ENV BAIDU_SITE_VERIFICATION=${BAIDU_SITE_VERIFICATION} +RUN pnpm build + +FROM base AS runner +WORKDIR /app +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +RUN addgroup --system --gid 1001 nodejs \ + && adduser --system --uid 1001 nextjs +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +USER nextjs +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 +CMD ["node", "server.js"] diff --git a/content/_meta.js b/content/_meta.js new file mode 100644 index 0000000..4f19837 --- /dev/null +++ b/content/_meta.js @@ -0,0 +1,7 @@ +export default { + index: "文档中心", + "getting-started": "快速开始", + models: "AI 模型接入", + guides: "使用指南", + faq: "常见问题", +}; diff --git a/content/faq.mdx b/content/faq.mdx new file mode 100644 index 0000000..bd77501 --- /dev/null +++ b/content/faq.mdx @@ -0,0 +1,32 @@ +--- +title: 常见问题 +description: 接入与使用中的常见问题解答 +--- + +# 常见问题 + +## 返回 401 Unauthorized + +- 检查 `Authorization: Bearer` 后是否有多余空格 +- 确认 Key 未被禁用、未过期 +- 确认请求发往正确的 Base URL + +## 返回 429 Too Many Requests + +表示触发 **限流**。请降低并发、实现指数退避重试,或联系商务提升配额。 + +## 模型不存在 / model_not_found + +模型 ID 拼写错误或账号未开通该模型。请在 **模型广场** 复制准确 ID。 + +## 如何对账? + +控制台 **账单** 模块可按日查看调用量与费用;企业客户可申请导出明细与发票。 + +## 是否支持私有化部署? + +企业方案支持专有云与私有化,请通过官网 [联系我们](/#contact) 获取方案与 POC 安排。 + +## 文档有错误怎么办? + +文档随产品迭代更新;若发现过时信息,请通过控制台反馈或邮件联系技术支持。 diff --git a/content/getting-started.mdx b/content/getting-started.mdx new file mode 100644 index 0000000..8ae6dea --- /dev/null +++ b/content/getting-started.mdx @@ -0,0 +1,44 @@ +--- +title: 快速开始 +description: 五分钟完成 API Key 创建与首次调用 +--- + +# 快速开始 + +按以下步骤即可在海宇数科平台完成首次模型调用。 + +## 1. 注册并登录控制台 + +访问 [控制台](https://console.haiyushuke.com),使用企业邮箱或手机号完成注册。首次登录建议完成实名/企业认证(若你方环境要求)。 + +## 2. 创建 API Key + +1. 进入 **设置 → API Key** +2. 点击 **创建密钥**,填写名称(如 `prod-backend`) +3. 复制密钥并妥善保存(仅展示一次) + +## 3. 选择模型与端点 + +在 **模型广场** 或 **接入文档** 中确认: + +- 模型 ID(如 `gpt-4o-mini`、`deepseek-chat`) +- 兼容协议(一般为 OpenAI Chat Completions) + +## 4. 发起测试请求 + +```bash +curl https://api.haiyushuke.com/v1/chat/completions \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "gpt-4o-mini", + "messages": [{"role": "user", "content": "你好,请用一句话介绍海宇数科"}] + }' +``` + +成功时响应 JSON 中包含 `choices[0].message.content`。 + +## 下一步 + +- 按厂商阅读 [OpenAI 接入](/docs/models/openai)、[Claude 接入](/docs/models/claude) +- 了解 [流式调用](/docs/guides/streaming) 与 [API Key 管理](/docs/guides/api_keys) diff --git a/content/guides/_meta.js b/content/guides/_meta.js new file mode 100644 index 0000000..3016f80 --- /dev/null +++ b/content/guides/_meta.js @@ -0,0 +1,5 @@ +export default { + console: "???", + api_keys: "API Key", + streaming: "????", +}; diff --git a/content/guides/api_keys.mdx b/content/guides/api_keys.mdx new file mode 100644 index 0000000..adc833e --- /dev/null +++ b/content/guides/api_keys.mdx @@ -0,0 +1,26 @@ +--- +title: API Key 管理 +sidebarTitle: API Key +description: 创建、轮换与权限最佳实践 +--- + +# API Key 管理 + +## 创建 + +控制台 → **设置 → API Key** → **创建**。建议命名包含环境与用途,例如 `prod-report-agent`。 + +## 存储 + +- 使用环境变量:`HAIYUSHUKE_API_KEY` +- 密钥管理系统(KMS / Vault)中保存,勿提交至 Git + +## 轮换流程 + +1. 创建新 Key +2. 在应用配置中灰度切换 +3. 确认流量稳定后禁用旧 Key + +## 泄露应急 + +若 Key 已泄露:立即 **禁用** 该 Key → 新建 → 排查仓库与 CI 日志是否残留。 diff --git a/content/guides/console.mdx b/content/guides/console.mdx new file mode 100644 index 0000000..8f68ebf --- /dev/null +++ b/content/guides/console.mdx @@ -0,0 +1,30 @@ +--- +title: 控制台使用 +sidebarTitle: 控制台 +description: 控制台主要功能与导航说明 +--- + +# 控制台使用指南 + +控制台地址:[https://console.haiyushuke.com](https://console.haiyushuke.com) + +## 主要模块 + +1. **概览**:用量、余额与近期调用趋势 +2. **模型广场**:浏览可用模型、定价与能力说明 +3. **API Key**:创建、轮换、禁用密钥 +4. **调用日志**(若已开通):按时间筛选请求与错误 +5. **账单**:充值、发票与明细导出 + +## 推荐工作流 + +1. 创建 API Key +2. 在模型广场选择目标模型 +3. 使用 SDK 或 cURL 完成联调 +4. 在概览与调用日志中核对用量 + +## 权限与安全 + +- 为不同环境(开发 / 预发 / 生产)使用不同 Key +- 定期轮换 Key;泄露后立即 **禁用** 并新建 +- 生产环境勿将 Key 写入前端 bundle diff --git a/content/guides/streaming.mdx b/content/guides/streaming.mdx new file mode 100644 index 0000000..a6a8c8b --- /dev/null +++ b/content/guides/streaming.mdx @@ -0,0 +1,38 @@ +--- +title: 流式调用 +sidebarTitle: 流式调用 +description: SSE 流式输出接入说明 +--- + +# 流式调用 + +在请求体中设置 `"stream": true`,服务端以 SSE 形式返回增量内容。 + +## cURL + +```bash +curl https://api.haiyushuke.com/v1/chat/completions \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"model":"gpt-4o-mini","stream":true,"messages":[{"role":"user","content":"写一首四句诗"}]}' +``` + +## OpenAI SDK(Node) + +```ts +const stream = await client.chat.completions.create({ + model: "gpt-4o-mini", + stream: true, + messages: [{ role: "user", content: "你好" }], +}); + +for await (const chunk of stream) { + const text = chunk.choices[0]?.delta?.content; + if (text) process.stdout.write(text); +} +``` + +## 注意 + +- 客户端需正确处理连接中断与超时重试 +- 流式场景下计费通常按 **输出 token** 累计,以账单规则为准 diff --git a/content/index.mdx b/content/index.mdx new file mode 100644 index 0000000..405ed61 --- /dev/null +++ b/content/index.mdx @@ -0,0 +1,1126 @@ +--- +title: 文档中心 +description: 海宇数科大模型服务接入与使用文档 +--- + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 + +欢迎查阅海宇数科大模型服务的技术文档。本站面向开发者与集成方,涵盖账号与密钥、各模型接入方式、控制台使用说明以及常见问题。 + +## 文档结构 + +| 模块 | 说明 | +| --- | --- | +| [快速开始](/docs/getting-started) | 注册、创建 API Key、发起第一次请求 | +| [AI 模型接入](/docs/models/openai) | 按厂商查看 Base URL、鉴权与示例 | +| [使用指南](/docs/guides/console) | 控制台、密钥管理与流式调用 | +| [常见问题](/docs/faq) | 计费、限流、错误码与排查 | + +## 服务地址 + +- **控制台**:`https://console.haiyushuke.com` +- **OpenAI 兼容 API**(示例):`https://api.haiyushuke.com/v1` + +> 实际网关域名以控制台「接入信息」页展示为准;下文示例中的域名请替换为你的环境配置。 + +## 需要帮助? + +产品咨询与技术支持可通过官网 [联系我们](/#contact) 或控制台工单入口提交。 diff --git a/content/models/_meta.js b/content/models/_meta.js new file mode 100644 index 0000000..802d050 --- /dev/null +++ b/content/models/_meta.js @@ -0,0 +1,5 @@ +export default { + openai: "OpenAI", + claude: "Claude (Anthropic)", + deepseek: "DeepSeek", +}; diff --git a/content/models/claude.mdx b/content/models/claude.mdx new file mode 100644 index 0000000..b19655a --- /dev/null +++ b/content/models/claude.mdx @@ -0,0 +1,42 @@ +--- +title: Claude 接入 +sidebarTitle: Claude +description: Anthropic Claude 系列模型接入说明 +--- + +# Claude (Anthropic) 接入 + +Claude 模型可通过 **OpenAI 兼容接口** 或 **Anthropic Messages API** 接入(以控制台开通能力为准)。 + +## OpenAI 兼容方式(推荐迁移) + +```bash +curl https://api.haiyushuke.com/v1/chat/completions \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "claude-sonnet-4-20250514", + "messages": [{"role": "user", "content": "总结以下三点:安全、成本、延迟"}] + }' +``` + +将 `model` 替换为控制台提供的 Claude 模型 ID。 + +## 系统提示与多轮对话 + +与 OpenAI 相同,使用 `messages` 数组: + +```json +{ + "model": "claude-sonnet-4-20250514", + "messages": [ + { "role": "system", "content": "你是企业知识库助手,回答需简洁。" }, + { "role": "user", "content": "什么是 RAG?" } + ] +} +``` + +## 注意事项 + +- 部分 Claude 特性(如扩展思考、工具调用)需使用对应 API 形态,请参考控制台该模型的「能力标签」。 +- 长上下文模型请留意单次请求的 `max_tokens` 与账单中的输入 token 统计。 diff --git a/content/models/deepseek.mdx b/content/models/deepseek.mdx new file mode 100644 index 0000000..6210e49 --- /dev/null +++ b/content/models/deepseek.mdx @@ -0,0 +1,32 @@ +--- +title: DeepSeek 接入 +sidebarTitle: DeepSeek +description: DeepSeek 系列模型接入说明 +--- + +# DeepSeek 接入 + +DeepSeek 模型通过统一网关暴露,协议为 **OpenAI Chat Completions 兼容**。 + +## 示例 + +```bash +curl https://api.haiyushuke.com/v1/chat/completions \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "deepseek-chat", + "messages": [{"role": "user", "content": "用列表说明大模型网关的三项优势"}] + }' +``` + +## 模型选择建议 + +| 场景 | 建议 | +| --- | --- | +| 通用对话 / 代码 | `deepseek-chat` | +| 复杂推理(若已开通) | 控制台标注的 Reasoner 类模型 ID | + +## 与 OpenAI SDK 共用配置 + +仅需修改 `model` 字段,无需更换 SDK;`baseURL` 与 API Key 与 [OpenAI 接入](/docs/models/openai) 相同。 diff --git a/content/models/openai.mdx b/content/models/openai.mdx new file mode 100644 index 0000000..6b37acb --- /dev/null +++ b/content/models/openai.mdx @@ -0,0 +1,62 @@ +--- +title: OpenAI 接入 +sidebarTitle: OpenAI +description: 通过 OpenAI 兼容协议接入 GPT 系列模型 +--- + +# OpenAI 兼容接入 + +海宇数科对 OpenAI 官方 SDK 及 HTTP API 提供兼容层,便于现有应用零改造迁移。 + +## 端点 + +| 项目 | 值 | +| --- | --- | +| Base URL | `https://api.haiyushuke.com/v1` | +| Chat Completions | `POST /chat/completions` | +| 鉴权 | `Authorization: Bearer ` | + +## Node.js(官方 SDK) + +```ts +import OpenAI from "openai"; + +const client = new OpenAI({ + apiKey: process.env.HAIYUSHUKE_API_KEY, + baseURL: "https://api.haiyushuke.com/v1", +}); + +const completion = await client.chat.completions.create({ + model: "gpt-4o-mini", + messages: [{ role: "user", content: "Hello" }], +}); + +console.log(completion.choices[0]?.message?.content); +``` + +## Python + +```python +from openai import OpenAI + +client = OpenAI( + api_key="YOUR_API_KEY", + base_url="https://api.haiyushuke.com/v1", +) + +resp = client.chat.completions.create( + model="gpt-4o-mini", + messages=[{"role": "user", "content": "Hello"}], +) +print(resp.choices[0].message.content) +``` + +## 常用参数 + +- `temperature`:0–2,控制随机性 +- `max_tokens`:最大生成 token +- `stream: true`:开启流式,见 [流式调用](/docs/guides/streaming) + +## 模型 ID + +请在控制台 **模型广场** 查看当前可用 ID;名称可能随供应商更新,以控制台为准。 diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 0000000..a3239a1 --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,100 @@ +import { test, expect } from "@playwright/test"; + +test.describe("站点冒烟", () => { + test("首页可访问且无致命前端错误", async ({ page }) => { + const pageErrors: string[] = []; + page.on("pageerror", (err) => { + pageErrors.push(err.message); + }); + + const response = await page.goto("/", { waitUntil: "networkidle" }); + expect(response?.ok()).toBeTruthy(); + + await expect(page.locator("main")).toBeVisible(); + await expect(page).toHaveTitle(/海宇数科/); + await expect(page.getByRole("heading", { level: 1 })).toContainText( + /智能报告/, + ); + await expect(page.locator("#reports")).toBeVisible(); + await expect(page.getByText("KYB 企业核验")).toBeVisible(); + const exampleBtn = page + .locator("#reports") + .getByRole("button", { name: "查看智能体报告示例" }) + .first(); + await exampleBtn.scrollIntoViewIfNeeded(); + await exampleBtn.click(); + await expect(page.getByRole("dialog")).toBeVisible(); + await expect(page.getByRole("dialog")).toContainText("核验结论"); + await expect(page.locator("#models")).toBeVisible(); + + const squareLink = page.getByRole("link", { name: "模型广场" }).first(); + await squareLink.click(); + await expect(page).toHaveURL(/\/models$/); + await expect(page.getByRole("heading", { level: 1 })).toContainText( + "模型广场", + ); + await expect(page.getByText("minimax-m2.7-highspeed")).toBeVisible(); + await expect(page.getByText("glm-5.1")).toBeVisible(); + + await page.goto("/news", { waitUntil: "domcontentloaded" }); + await expect(page.getByRole("heading", { level: 1 })).toContainText( + "AI 新闻资讯", + ); + await page + .getByRole("link", { name: "智能报告模板库 2.0 发布" }) + .first() + .click(); + await expect(page).toHaveURL(/\/news\/report-templates-2/); + await expect(page.getByRole("heading", { level: 1 })).toContainText( + "智能报告模板库 2.0 发布", + ); + + expect( + pageErrors, + pageErrors.length ? pageErrors.join("\n") : undefined, + ).toEqual([]); + }); + + test("窄屏显示移动菜单并可展开导航", async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto("/", { waitUntil: "domcontentloaded" }); + await expect(page.getByRole("button", { name: "菜单" })).toBeVisible(); + await page.getByRole("button", { name: "菜单" }).click(); + await expect(page.getByRole("link", { name: "智能报告" }).first()).toBeVisible(); + await page.getByRole("link", { name: "模型能力" }).first().click(); + await expect(page).toHaveURL(/\/models\/?$/); + }); + + test("文档中心可访问并展示侧栏与示例正文", async ({ page }) => { + const response = await page.goto("/docs", { + waitUntil: "domcontentloaded", + }); + expect(response?.ok()).toBeTruthy(); + await expect(page).toHaveTitle(/文档中心/); + await expect( + page.getByRole("region", { name: "文档导航" }), + ).toBeVisible(); + await expect( + page.getByRole("navigation", { name: "面包屑" }), + ).toContainText("文档中心"); + await expect( + page.getByRole("complementary", { name: "文档目录" }).or( + page.getByRole("navigation", { name: "文档目录(移动端)" }), + ), + ).toBeVisible({ timeout: 15_000 }); + await expect(page.getByRole("link", { name: "快速开始" }).first()).toBeVisible(); + await page.getByRole("link", { name: "OpenAI" }).first().click(); + await expect(page).toHaveURL(/\/docs\/models\/openai/); + await expect(page.locator(".docs-prose h1, .docs-prose h2").first()).toContainText( + "OpenAI", + ); + await expect(page.getByText("chat/completions")).toBeVisible(); + }); + + test("全局样式编译通过(无 Turbopack CSS 报错页)", async ({ page }) => { + await page.goto("/", { waitUntil: "domcontentloaded" }); + const bodyText = await page.locator("body").innerText(); + expect(bodyText).not.toContain("Cannot apply unknown utility class"); + expect(bodyText).not.toContain("CssSyntaxError"); + }); +}); diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..b3f11a2 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,14 @@ +import nextra from "nextra"; + +const withNextra = nextra({ + contentDirBasePath: "/docs", + search: { codeblocks: true }, +}); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactCompiler: true, + output: "standalone", +}; + +export default withNextra(nextConfig); diff --git a/package.json b/package.json new file mode 100644 index 0000000..6811d7e --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "haiyushuke-website", + "version": "0.1.0", + "private": true, + "packageManager": "pnpm@10.11.0", + "scripts": { + "dev": "next dev", + "build": "next build --webpack", + "postbuild": "pagefind --site .next/server/app --output-path public/_pagefind", + "start": "next start", + "test": "pnpm build && playwright test", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui" + }, + "dependencies": { + "@headlessui/react": "2.1.2", + "@tsparticles/engine": "^4.0.5", + "@tsparticles/react": "^4.0.5", + "@tsparticles/slim": "^4.0.5", + "motion": "^12.40.0", + "next": "16.2.6", + "nextra": "^4.6.1", + "nextra-theme-docs": "^4.6.1", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@playwright/test": "^1.60.0", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "babel-plugin-react-compiler": "1.0.0", + "pagefind": "^1.5.2", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..9799fc3 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,31 @@ +import { defineConfig, devices } from "@playwright/test"; + +const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? "http://127.0.0.1:3000"; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: [["list"], ["html", { open: "never" }]], + use: { + baseURL, + trace: "on-first-retry", + }, + projects: [ + { + name: "chromium", + use: { + ...devices["Desktop Chrome"], + channel: "chrome", + }, + }, + ], + webServer: { + command: "pnpm dev --webpack --port 3000", + url: baseURL, + reuseExistingServer: !process.env.CI, + timeout: 120_000, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..dfbb445 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5307 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@headlessui/react': + specifier: 2.1.2 + version: 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tsparticles/engine': + specifier: ^4.0.5 + version: 4.0.5 + '@tsparticles/react': + specifier: ^4.0.5 + version: 4.0.5(@tsparticles/engine@4.0.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tsparticles/slim': + specifier: ^4.0.5 + version: 4.0.5 + motion: + specifier: ^12.40.0 + version: 12.40.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: + specifier: 16.2.6 + version: 16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + nextra: + specifier: ^4.6.1 + version: 4.6.1(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + nextra-theme-docs: + specifier: ^4.6.1 + version: 4.6.1(@types/react@19.2.15)(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nextra@4.6.1(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + react: + specifier: 19.2.4 + version: 19.2.4 + react-dom: + specifier: 19.2.4 + version: 19.2.4(react@19.2.4) + devDependencies: + '@playwright/test': + specifier: ^1.60.0 + version: 1.60.0 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.3.0 + '@types/node': + specifier: ^20 + version: 20.19.41 + '@types/react': + specifier: ^19 + version: 19.2.15 + '@types/react-dom': + specifier: ^19 + version: 19.2.3(@types/react@19.2.15) + babel-plugin-react-compiler: + specifier: 1.0.0 + version: 1.0.0 + pagefind: + specifier: ^1.5.2 + version: 1.5.2 + tailwindcss: + specifier: ^4 + version: 4.3.0 + typescript: + specifier: ^5 + version: 5.9.3 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@formatjs/intl-localematcher@0.6.2': + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + + '@headlessui/react@2.1.2': + resolution: {integrity: sha512-Kb3hgk9gRNRcTZktBrKdHhF3xFhYkca1Rk6e1/im2ENf83dgN54orMW0uSKTXFnUpZOUFZ+wcY05LlipwgZIFQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.3': + resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@internationalized/date@3.12.1': + resolution: {integrity: sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==} + + '@internationalized/number@3.6.6': + resolution: {integrity: sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==} + + '@internationalized/string@3.2.8': + resolution: {integrity: sha512-NdbMQUSfXLYIQol5VyMtinm9pZDciiMfN7RtmSuSB78io1hqwJ0naYfxyW6vgxWBkzWymQa/3uLDlbfmshtCaA==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@mermaid-js/parser@1.1.1': + resolution: {integrity: sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==} + + '@napi-rs/simple-git-android-arm-eabi@0.1.22': + resolution: {integrity: sha512-JQZdnDNm8o43A5GOzwN/0Tz3CDBQtBUNqzVwEopm32uayjdjxev1Csp1JeaqF3v9djLDIvsSE39ecsN2LhCKKQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/simple-git-android-arm64@0.1.22': + resolution: {integrity: sha512-46OZ0SkhnvM+fapWjzg/eqbJvClxynUpWYyYBn4jAj7GQs1/Yyc8431spzDmkA8mL0M7Xo8SmbkzTDE7WwYAfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/simple-git-darwin-arm64@0.1.22': + resolution: {integrity: sha512-zH3h0C8Mkn9//MajPI6kHnttywjsBmZ37fhLX/Fiw5XKu84eHA6dRyVtMzoZxj6s+bjNTgaMgMUucxPn9ktxTQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/simple-git-darwin-x64@0.1.22': + resolution: {integrity: sha512-GZN7lRAkGKB6PJxWsoyeYJhh85oOOjVNyl+/uipNX8bR+mFDCqRsCE3rRCFGV9WrZUHXkcuRL2laIRn7lLi3ag==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/simple-git-freebsd-x64@0.1.22': + resolution: {integrity: sha512-xyqX1C5I0WBrUgZONxHjZH5a4LqQ9oki3SKFAVpercVYAcx3pq6BkZy1YUOP4qx78WxU1CCNfHBN7V+XO7D99A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.22': + resolution: {integrity: sha512-4LOtbp9ll93B9fxRvXiUJd1/RM3uafMJE7dGBZGKWBMGM76+BAcCEUv2BY85EfsU/IgopXI6n09TycRfPWOjxA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.22': + resolution: {integrity: sha512-GVOjP/JjCzbQ0kSqao7ctC/1sodVtv5VF57rW9BFpo2y6tEYPCqHnkQkTpieuwMNe+TVOhBUC1+wH0d9/knIHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/simple-git-linux-arm64-musl@0.1.22': + resolution: {integrity: sha512-MOs7fPyJiU/wqOpKzAOmOpxJ/TZfP4JwmvPad/cXTOWYwwyppMlXFRms3i98EU3HOazI/wMU2Ksfda3+TBluWA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/simple-git-linux-ppc64-gnu@0.1.22': + resolution: {integrity: sha512-L59dR30VBShRUIZ5/cQHU25upNgKS0AMQ7537J6LCIUEFwwXrKORZKJ8ceR+s3Sr/4jempWVvMdjEpFDE4HYww==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@napi-rs/simple-git-linux-s390x-gnu@0.1.22': + resolution: {integrity: sha512-4FHkPlCSIZUGC6HiADffbe6NVoTBMd65pIwcd40IDbtFKOgFMBA+pWRqKiQ21FERGH16Zed7XHJJoY3jpOqtmQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@napi-rs/simple-git-linux-x64-gnu@0.1.22': + resolution: {integrity: sha512-Ei1tM5Ho/dwknF3pOzqkNW9Iv8oFzRxE8uOhrITcdlpxRxVrBVptUF6/0WPdvd7R9747D/q61QG/AVyWsWLFKw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/simple-git-linux-x64-musl@0.1.22': + resolution: {integrity: sha512-zRYxg7it0p3rLyEJYoCoL2PQJNgArVLyNavHW03TFUAYkYi5bxQ/UFNVpgxMaXohr5yu7qCBqeo9j4DWeysalg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.22': + resolution: {integrity: sha512-XGFR1fj+Y9cWACcovV2Ey/R2xQOZKs8t+7KHPerYdJ4PtjVzGznI4c2EBHXtdOIYvkw7tL5rZ7FN1HJKdD5Quw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/simple-git-win32-ia32-msvc@0.1.22': + resolution: {integrity: sha512-Gqr9Y0gs6hcNBA1IXBpoqTFnnIoHuZGhrYqaZzEvGMLrTrpbXrXVEtX3DAAD2RLc1b87CPcJ49a7sre3PU3Rfw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/simple-git-win32-x64-msvc@0.1.22': + resolution: {integrity: sha512-hQjcreHmUcpw4UrtkOron1/TQObfe484lxiXFLLUj7aWnnnOVs1mnXq5/Bo9+3NYZldFpFRJPdPBeHCisXkKJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/simple-git@0.1.22': + resolution: {integrity: sha512-bMVoAKhpjTOPHkW/lprDPwv5aD4R4C3Irt8vn+SKA9wudLe9COLxOhurrKRsxmZccUbWXRF7vukNeGUAj5P8kA==} + engines: {node: '>= 10'} + + '@next/env@16.2.6': + resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} + + '@next/swc-darwin-arm64@16.2.6': + resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.2.6': + resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.2.6': + resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@16.2.6': + resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@16.2.6': + resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@16.2.6': + resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@16.2.6': + resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.2.6': + resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} + cpu: [x64] + os: [win32] + + '@playwright/test@1.60.0': + resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} + engines: {node: '>=18'} + hasBin: true + + '@react-aria/focus@3.22.0': + resolution: {integrity: sha512-ZfDOVuVhqDsM9mkNji3QUZ/d40JhlVgXrDkrfXylM1035QCrcTHN7m2DpbE95sU2A8EQb4wikvt5jM6K/73BPg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.28.0': + resolution: {integrity: sha512-OXwdU1EWFdMxmr/K1CXNGJzmNlCClByb+PuCaqUyzBymHPCGVhawirLIon/CrIN5psh3AiWpHSh4H0WeJdVpng==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.34.0': + resolution: {integrity: sha512-gp6xo/s2lX54AlTjOiqwDnxA7UW79BNvI9dB9pr3LZTzRKCd1ZA+ZbgKw/ReIiWuvvVw/8QFJpnqeeFyLocMcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/twoslash@3.23.0': + resolution: {integrity: sha512-pNaLJWMA3LU7PhT8tm9OQBZ1epy0jmdgeJzntBtr1EVXLbHxGzTj3mnf9vOdcl84l96qnlJXkJ/NGXZYBpXl5g==} + peerDependencies: + typescript: '>=5.5.0' + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.3.0': + resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} + + '@tanstack/react-virtual@3.13.25': + resolution: {integrity: sha512-bmNoqMu6gcAW9JGrKVB0Q1tN1i5RONZF8r1fW0bbE4Oyf3DwEGnzzQJ2OW+Ozg1P4s8PyugkHg2ULZoFQN+cqw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.15.0': + resolution: {integrity: sha512-0AwPGx0I8QxPYjAxShT/+z+ZOe9u8mW5rsXvivCTjRfRmz9a43+3mRyi4wwlyoUqOC56q/jatKa0Bh9M99BEHQ==} + + '@theguild/remark-mermaid@0.3.0': + resolution: {integrity: sha512-Fy1J4FSj8totuHsHFpaeWyWRaRSIvpzGTRoEfnNJc1JmLV9uV70sYE3zcT+Jj5Yw20Xq4iCsiT+3Ho49BBZcBQ==} + peerDependencies: + react: ^18.2.0 || ^19.0.0 + + '@theguild/remark-npm2yarn@0.3.3': + resolution: {integrity: sha512-ma6DvR03gdbvwqfKx1omqhg9May/VYGdMHvTzB4VuxkyS7KzfZ/lzrj43hmcsggpMje0x7SADA/pcMph0ejRnA==} + + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + + '@tsparticles/basic@4.0.5': + resolution: {integrity: sha512-JWAsRUh8v8RYxLilAAlcwIvUlO2Jfl0DW2t+aAm0OAp4WjmebWSYeG+/CV6Ov+ynV/38vEDAYQIRpyG8Vpmyrg==} + + '@tsparticles/canvas-utils@4.0.5': + resolution: {integrity: sha512-U/KtQBuv1reSTnpyBswp4SfhDjOSG9lvcR8Z+1FTV+5/Vfjz2hEy3p61dN934xffrY24uFJE1f60m1npwZ4Ayg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/engine@4.0.5': + resolution: {integrity: sha512-ovFQNzz18Ef0ww7wPqykHWU06K1EhTkMPZhoIZQQaRbFmKKoE+5LyTGGTZGzGjQ4GjHLZq7l9kGl1oInpzoK4Q==} + + '@tsparticles/interaction-external-attract@4.0.5': + resolution: {integrity: sha512-k/2/TGRhCEJHUTWjcarWzG2c4OdHKihkjrEaKaLNuLOtJr30IPAzD4WSs8TDUEFAh1lEKmpC3stbRcjMmHMnMQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-bounce@4.0.5': + resolution: {integrity: sha512-p6KWrxFmhWXvae3HA3SpE5q8X7eVvPKpxbqjk+pK648zb20u8iCpD+7ahadkey10TxggC7ffAa20ATLGftchdw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-bubble@4.0.5': + resolution: {integrity: sha512-rFBCF0oOD2bFDM/VmN1M/8LC114UXOvJSyAHmxB1z3N9u/S1MfQBz3nh98D6hTsYAyc9pKdaInDWqBQxabEmUw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-connect@4.0.5': + resolution: {integrity: sha512-e9xmZGLI8C7yf+G9Bpbh30QxwXDJkbV16d012jrjVklRnT2iQvs6y2p1KGI3xTNWkyKAKnyIiXYRRSSvBgc4+Q==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-destroy@4.0.5': + resolution: {integrity: sha512-AX9o1nytQVQdCvhSzF2fzJwVyG0dtSmWIgC1HBklCoARmyydyWOJ2rt0/4sPCu0RjEYeUDI6LSTzzCy6LSJaTw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-grab@4.0.5': + resolution: {integrity: sha512-xa+zfluNw+nhoNxBbqeM62QYvfb0NV+gt91R/1bYHJb8CmflBiYhLX5kO3dsGu/zzpjnccqnEN5UDnvPKO8niQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-parallax@4.0.5': + resolution: {integrity: sha512-arNHolnrksrbeLjDZbVDStwgNZAudkRoC3BnR+a2bzVEyGQnix/3MVT+N1PnrSnd0KuXN+yec+N3MlU91aJ2FQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-pause@4.0.5': + resolution: {integrity: sha512-ehMtDvISL40Sr8cQ6vqv67LjwV9xj92OI7RkigTViJiwC4+GNv+3mdEb9Nn/dBphuQ2LmjZAc9b7FfPmBoKIdQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-push@4.0.5': + resolution: {integrity: sha512-XmDUE7HoAIJf9MFC+7WBuEvTk9RfXyLSLFWxRmyEapy4AMDUyWR8DhZU+yslj440W1J0rq28vPOjsOYUwvY9tQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-remove@4.0.5': + resolution: {integrity: sha512-Vd3KWTPwmguAJR1xmwrYwv7ItFL7xqxDzTS0YfDwtm7glXQG/Uo8lszxcASQTw6DNvSG6opGisGlO+dGSX0uJw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-repulse@4.0.5': + resolution: {integrity: sha512-Fpd8PBJDRcBohuJbwpr99annMWVVuct5EPiTRsyigshrERpFr4xDHPodhgVJ6A9IFs0NGMH5Kfa1WReSsM8tCA==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-external-slow@4.0.5': + resolution: {integrity: sha512-u1RFBXmsOWVPnmdgOsgI3Usg8By0u+xARS1faU+DeQx0UCZeVTbRKR9/f+afcP36EVGb9y5Ij4+zjq5M84dmbA==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-particles-attract@4.0.5': + resolution: {integrity: sha512-1FWdRXB32s1LUrV7u0D+mu88WxRq8ijmUfqTlEHMPX/nNPKoSRbic4pN1fTxdbH9hD21S+rjECBmaLmEzpqnVg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-particles-collisions@4.0.5': + resolution: {integrity: sha512-kF5f/7xnjj3tPFUFxuPe2TX8Ee0ZNJskvU0gXjNb6UER9WuvK596gkJWxeWib8VMyKgAywyV0Mp/hXQh0YsJRw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/interaction-particles-links@4.0.5': + resolution: {integrity: sha512-06+CKi4DwbmBwoIuHc/PTpnI7V7loqFgmddY16xPXzDs5i9W/Uhhovg5d5yplFOTxmiNLF9QY0Yz6aMHZ3f7cQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5 + + '@tsparticles/plugin-blend@4.0.5': + resolution: {integrity: sha512-7w21hS28GnD4ac5uooRskmMprFUCJs6wHveC4CY5XiiE7ldcHTUMNT9b2fwXMFawBZDSezfjhCms7zhIQDbjgg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-easing-quad@4.0.5': + resolution: {integrity: sha512-CsRCndjCeRAUAz+l7zrYEWdw8JK7gbNBxnq5sRcaflESDLNtyeZQtkYoVsMouUgbr4/UdShLMi1IqQiR117vpw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-hex-color@4.0.5': + resolution: {integrity: sha512-GWmkiiSlb4oow1OxJQF32R2ulOhMwToQvexJC7oqd/2yxZuScD7fukpM5kv9S9XhKVE+zjOJHeWIhRFrBl7mCQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-hsl-color@4.0.5': + resolution: {integrity: sha512-gdey7PUKPijnG9hIfrD3z8N4xjyOyRWXsvaGXhoMgpaD47Vcc/wsIXmx/0Znsct0cEEXByXoMQyM8MRO1yTg0w==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-interactivity@4.0.5': + resolution: {integrity: sha512-tRTvH5/MUy/3MNG344rBNuTFxLVCo9MaiYU3d0cxg9Xuh1jVOsIcNj3KbQrOdYvFowzVml8+cAeMGfLtsQoyDw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-move@4.0.5': + resolution: {integrity: sha512-IJVS/f7QHEfGz4LSlidAmLPPGc2Jj1vp6ydxvMOIyjzPrxS8PIYqsXB0jWjy2fr5KT6+VCNDX+7fY8v0EK9OOg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-rgb-color@4.0.5': + resolution: {integrity: sha512-+JDxQWW1WupxnDwvN+C0vWQmOvBFkvtvK2MJ6qNjOI9/7Nj8s0xzwm5KGqVUWkaF16K3+AihNjEQRb/M8E5skg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/react@4.0.5': + resolution: {integrity: sha512-3XJmucy/gOgPzQ+i5ZAt3LD8840xdxLPfbNMuRk8D/fHhxI07SHx/8GhODcqnHHHme1zEf0/zUdFee73PuH+NA==} + peerDependencies: + '@tsparticles/engine': workspace:^ + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@tsparticles/shape-circle@4.0.5': + resolution: {integrity: sha512-y2CcWNCnC2m2/DaE5CsWbJSCjKsLbOySdT9qgyezmT/boYHupJuNNNOeXP56Tlq+je1wZpayCIAKOpl+VhBtiw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-emoji@4.0.5': + resolution: {integrity: sha512-OyEtJ+tspbIQz21S2aUReH1yllIsZ8eAQ+OthcXllviS43hUSjlNdhsYhlJquIX4pU4UixpMaNngM2CaUDb4RQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-image@4.0.5': + resolution: {integrity: sha512-2tmJly5jLDJo8MtWOYbBTy07h7cZQ3vMLbux4frANBVgUJxipKl4DK0o2uXx0Qq7g+yMOObIPb17GR8FC2KQdg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-line@4.0.5': + resolution: {integrity: sha512-5pcbqrkH1l9spGV7nYpfEiA94NlZYGYUEBP8x/Hk4SIyvV1085ewonDj+fPcoOad27JXaq076xZlqJZMxo/9WA==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-polygon@4.0.5': + resolution: {integrity: sha512-RZwLXtSsnX/KC8Jxjlvp/eSBPs7pU9uN06peWGsteqFUteuMMaCvTPzNpOX0yevDsDKWj8YOklaD89GjrEZ1GQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-square@4.0.5': + resolution: {integrity: sha512-TMwvEp81/RhJfwRQM/Z7/D56ZZX8RbKd+8OT2DFtk1RJ0OMp+JQT3untwU0rV5pbQsazrlFWj5pnUk5Dy1kTlQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-star@4.0.5': + resolution: {integrity: sha512-Gg9kg3iTDywyN0PSTliQFa6CFdS4vtTRnSw7Yi1ofAL8KDQHzakpLHoRnKeJJudFHtLOQgJkX7/jVG1yZ82nbw==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/slim@4.0.5': + resolution: {integrity: sha512-W90wnex7dZsYszd+J98IoKUX5U+7Q53r9USsPl8edpY1vNJvJh0VijY5Hbi1KTIbG1w/9DCn7HAvMLRyv99gYQ==} + + '@tsparticles/updater-life@4.0.5': + resolution: {integrity: sha512-ncBXJ6HljAK6ddMkjh0NQu2IrkC6IGBtPn6cH+/74kn1S2Aa4m8pOlQzUbvSbvT9NRoLDaWp+/M1vn+Wx8ISvQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-opacity@4.0.5': + resolution: {integrity: sha512-VNuJyLleqRgRfefmTbTg8bnCEyg1I24zJ46y9TMXwzklrz7A/7go94bt/0SO1nUGpRkOhJ06/2LkRrN1dH4gSQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-out-modes@4.0.5': + resolution: {integrity: sha512-1SeMXkvEfJB5v6AeMVB2qFXzvzOMLMAhKfgQ4IJpnOttjKEAOn/ATq9t7HGPlaR2yL/uC2X1awyNmKs2U6nuJg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-paint@4.0.5': + resolution: {integrity: sha512-wb2jdSOwkCaosZqvXicwYn/QADXbQlrGy6EqImX9Mdplssq8wlVGEe8DjfFFhVtbq7w4mY7mXis1rhPRYYzZGg==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-rotate@4.0.5': + resolution: {integrity: sha512-9uMiwrumR0UQeqKYAx8dzLMdvaqH3aqzP8zK0d5Goib0fVaQaiILdNIHqMGiH/PjJ4JuGTtV5KqeFEwdSCFQ9Q==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-size@4.0.5': + resolution: {integrity: sha512-MNCJph1o0uwdOXrFQ2myXd3gtn8MnqKb2XMCEZfYRcnGvxzoTPo8H2IH3wqebagj5u8Ah0pk0yWmvBW0239kfQ==} + peerDependencies: + '@tsparticles/engine': 4.0.5 + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@20.19.41': + resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.15': + resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.31: + resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + better-react-mathjax@2.3.0: + resolution: {integrity: sha512-K0ceQC+jQmB+NLDogO5HCpqmYf18AU2FxDbLdduYgkHYWZApFggkHE4dIaXCV1NqeoscESYXXo1GSkY6fA295w==} + peerDependencies: + react: '>=16.8' + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.4: + resolution: {integrity: sha512-HIN5Pmd9MrX9BkV7tDwnOcEJCSFvCpc8X97h3f508J6I5FsqAY65wKOCvgH2CuP42CaahWaz4tuh32SOOIH7ww==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dompurify@3.4.5: + resolution: {integrity: sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==} + + enhanced-resolve@5.21.6: + resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} + engines: {node: '>=10.13.0'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-toolkit@1.46.1: + resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + framer-motion@12.40.0: + resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + mathjax-full@3.2.2: + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} + deprecated: Version 4 replaces this package with the scoped package @mathjax/src + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.15.0: + resolution: {integrity: sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==} + + mhchemparser@4.2.1: + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + mj-context-menu@0.6.1: + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + + motion-dom@12.40.0: + resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + motion@12.40.0: + resolution: {integrity: sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@16.2.6: + resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + nextra-theme-docs@4.6.1: + resolution: {integrity: sha512-u5Hh8erVcGOXO1FVrwYBgrEjyzdYQY0k/iAhLd8RofKp+Bru3fyLy9V9W34mfJ0KHKHjv/ldlDTlb4KlL4eIuQ==} + peerDependencies: + next: '>=14' + nextra: 4.6.1 + react: '>=18' + react-dom: '>=18' + + nextra@4.6.1: + resolution: {integrity: sha512-yz5WMJFZ5c58y14a6Rmwt+SJUYDdIgzWSxwtnpD4XAJTq3mbOqOg3VTaJqLiJjwRSxoFRHNA1yAhnhbvbw9zSg==} + engines: {node: '>=18'} + peerDependencies: + next: '>=14' + react: '>=18' + react-dom: '>=18' + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-to-yarn@3.0.1: + resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + engines: {node: '>=18'} + hasBin: true + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-aria@3.48.0: + resolution: {integrity: sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + react-compiler-runtime@19.1.0-rc.3: + resolution: {integrity: sha512-Cssogys2XZu6SqxRdX2xd8cQAf57BBvFbLEBlIa77161lninbKUn/EqbecCe7W3eqDQfg3rIoOwzExzgCh7h/g==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-medium-image-zoom@5.4.5: + resolution: {integrity: sha512-58QSIRK6X3uw2fSTejJRnH0JuKTZl7ZJYX+sAMaYx4YTEm33gsNdnP5RuQSCnBiAvisQeErqZWAT31bR89WB6g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-stately@3.46.0: + resolution: {integrity: sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.14.1: + resolution: {integrity: sha512-IpG4OL0iYlbx78muVldsK86hdfNoht0z63AP7sekQNW2QOTmjxB7RbTO+rhIYNGRljgHxgVZoPwUl6bIC9SbjA==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.0.0 || ^2.0.0 || ^3.0.0 + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-reading-time@2.1.0: + resolution: {integrity: sha512-gBsJbQv87TUq4dRMSOgIX6P60Tk9ke8c29KsL7bccmsv2m9AycDfVu3ghRtrNpHLZU3TE5P/vImGOMSPzYU8rA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speech-rule-engine@4.1.4: + resolution: {integrity: sha512-i/VCLG1fvRc95pMHRqG4aQNscv+9aIsqA2oI7ZQS51sTdUcDHYX6cpT8/tqZ+enjs1tKVwbRBWgxut9SWn+f9g==} + hasBin: true + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + title@4.0.1: + resolution: {integrity: sha512-xRnPkJx9nvE5MF6LkB5e8QJjE2FW8269wTu/LQdf7zZqBgPly0QJPf/CWAo7srj5so4yXfoLEdCFgurlpi47zg==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + twoslash-protocol@0.3.8: + resolution: {integrity: sha512-HmvAHoiEviK8LqvAQyc9/irkdvwTUiR1fHmNwH/0gq8EHxyBt4PWVPixjEXg6wJu1u6yBrILEWXGK9Kw58/8yQ==} + + twoslash@0.3.8: + resolution: {integrity: sha512-OeDz0kDl8sqPUN3nr7gqcvOs70f5lZsdhKYTX3/SgB9OvdadzzoYJI/4SBXhXV1HG8E9fLc+e17itoRYTxmoig==} + peerDependencies: + typescript: ^5.5.0 || ^6.0.0 + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + hasBin: true + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wicked-good-xpath@1.3.0: + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zustand@5.0.13: + resolution: {integrity: sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.1.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@braintree/sanitize-url@7.1.2': {} + + '@chevrotain/types@11.1.2': {} + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/react@0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.11 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.11': {} + + '@formatjs/intl-localematcher@0.6.2': + dependencies: + tslib: 2.8.1 + + '@headlessui/react@2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/focus': 3.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/interactions': 3.28.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-virtual': 3.13.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.3': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@internationalized/date@3.12.1': + dependencies: + '@swc/helpers': 0.5.15 + + '@internationalized/number@3.6.6': + dependencies: + '@swc/helpers': 0.5.15 + + '@internationalized/string@3.2.8': + dependencies: + '@swc/helpers': 0.5.15 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.16.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.16.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@mermaid-js/parser@1.1.1': + dependencies: + '@chevrotain/types': 11.1.2 + + '@napi-rs/simple-git-android-arm-eabi@0.1.22': + optional: true + + '@napi-rs/simple-git-android-arm64@0.1.22': + optional: true + + '@napi-rs/simple-git-darwin-arm64@0.1.22': + optional: true + + '@napi-rs/simple-git-darwin-x64@0.1.22': + optional: true + + '@napi-rs/simple-git-freebsd-x64@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-arm64-musl@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-ppc64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-s390x-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-x64-gnu@0.1.22': + optional: true + + '@napi-rs/simple-git-linux-x64-musl@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-ia32-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git-win32-x64-msvc@0.1.22': + optional: true + + '@napi-rs/simple-git@0.1.22': + optionalDependencies: + '@napi-rs/simple-git-android-arm-eabi': 0.1.22 + '@napi-rs/simple-git-android-arm64': 0.1.22 + '@napi-rs/simple-git-darwin-arm64': 0.1.22 + '@napi-rs/simple-git-darwin-x64': 0.1.22 + '@napi-rs/simple-git-freebsd-x64': 0.1.22 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.22 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.22 + '@napi-rs/simple-git-linux-ppc64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-s390x-gnu': 0.1.22 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.22 + '@napi-rs/simple-git-linux-x64-musl': 0.1.22 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.22 + '@napi-rs/simple-git-win32-ia32-msvc': 0.1.22 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.22 + + '@next/env@16.2.6': {} + + '@next/swc-darwin-arm64@16.2.6': + optional: true + + '@next/swc-darwin-x64@16.2.6': + optional: true + + '@next/swc-linux-arm64-gnu@16.2.6': + optional: true + + '@next/swc-linux-arm64-musl@16.2.6': + optional: true + + '@next/swc-linux-x64-gnu@16.2.6': + optional: true + + '@next/swc-linux-x64-musl@16.2.6': + optional: true + + '@next/swc-win32-arm64-msvc@16.2.6': + optional: true + + '@next/swc-win32-x64-msvc@16.2.6': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + + '@playwright/test@1.60.0': + dependencies: + playwright: 1.60.0 + + '@react-aria/focus@3.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@swc/helpers': 0.5.15 + react: 19.2.4 + react-aria: 3.48.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + + '@react-aria/interactions@3.28.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-types/shared': 3.34.0(react@19.2.4) + '@swc/helpers': 0.5.15 + react: 19.2.4 + react-aria: 3.48.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + + '@react-types/shared@3.34.0(react@19.2.4)': + dependencies: + react: 19.2.4 + + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/twoslash@3.23.0(typescript@5.9.3)': + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/types': 3.23.0 + twoslash: 0.3.8(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.6 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/postcss@4.3.0': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + postcss: 8.5.15 + tailwindcss: 4.3.0 + + '@tanstack/react-virtual@3.13.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@tanstack/virtual-core': 3.15.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@tanstack/virtual-core@3.15.0': {} + + '@theguild/remark-mermaid@0.3.0(react@19.2.4)': + dependencies: + mermaid: 11.15.0 + react: 19.2.4 + unist-util-visit: 5.1.0 + + '@theguild/remark-npm2yarn@0.3.3': + dependencies: + npm-to-yarn: 3.0.1 + unist-util-visit: 5.1.0 + + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.16 + + '@tsparticles/basic@4.0.5': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-blend': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/plugin-hex-color': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/plugin-hsl-color': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/plugin-move': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/plugin-rgb-color': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-circle': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-opacity': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-out-modes': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-paint': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-size': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/canvas-utils@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/engine@4.0.5': {} + + '@tsparticles/interaction-external-attract@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-bounce@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-bubble@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-connect@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/canvas-utils': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-destroy@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-grab@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/canvas-utils': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-parallax@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-pause@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-push@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-remove@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-repulse@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-external-slow@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-particles-attract@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-particles-collisions@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/interaction-particles-links@4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5))': + dependencies: + '@tsparticles/canvas-utils': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/engine': 4.0.5 + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/plugin-blend@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-easing-quad@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-hex-color@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-hsl-color@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-move@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/plugin-rgb-color@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/react@4.0.5(@tsparticles/engine@4.0.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@tsparticles/engine': 4.0.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@tsparticles/shape-circle@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-emoji@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/canvas-utils': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-image@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-line@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-polygon@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-square@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/shape-star@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/slim@4.0.5': + dependencies: + '@tsparticles/basic': 4.0.5 + '@tsparticles/engine': 4.0.5 + '@tsparticles/interaction-external-attract': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-bounce': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-bubble': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-connect': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-destroy': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-grab': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-parallax': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-pause': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-push': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-remove': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-repulse': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-external-slow': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-particles-attract': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-particles-collisions': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/interaction-particles-links': 4.0.5(@tsparticles/engine@4.0.5)(@tsparticles/plugin-interactivity@4.0.5(@tsparticles/engine@4.0.5)) + '@tsparticles/plugin-easing-quad': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/plugin-interactivity': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-emoji': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-image': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-line': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-polygon': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-square': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/shape-star': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-life': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-paint': 4.0.5(@tsparticles/engine@4.0.5) + '@tsparticles/updater-rotate': 4.0.5(@tsparticles/engine@4.0.5) + + '@tsparticles/updater-life@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-opacity@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-out-modes@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-paint@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-rotate@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@tsparticles/updater-size@4.0.5(@tsparticles/engine@4.0.5)': + dependencies: + '@tsparticles/engine': 4.0.5 + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + + '@types/estree@1.0.9': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/katex@0.16.8': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@20.19.41': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.2.3(@types/react@19.2.15)': + dependencies: + '@types/react': 19.2.15 + + '@types/react@19.2.15': + dependencies: + csstype: 3.2.3 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@typescript/vfs@1.6.4(typescript@5.9.3)': + dependencies: + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.3.1': {} + + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + '@xmldom/xmldom@0.9.10': {} + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + arg@5.0.2: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.0 + + bail@2.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.31: {} + + better-react-mathjax@2.3.0(react@19.2.4): + dependencies: + mathjax-full: 3.2.2 + react: 19.2.4 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + caniuse-lite@1.0.30001793: {} + + ccount@2.0.1: {} + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + client-only@0.0.1: {} + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.1 + is64bit: 2.0.0 + + clsx@2.1.1: {} + + code-block-writer@13.0.3: {} + + collapse-white-space@2.1.0: {} + + comma-separated-tokens@2.0.3: {} + + commander@13.1.0: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compute-scroll-into-view@3.1.1: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.4): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.4 + + cytoscape-fcose@2.2.0(cytoscape@3.33.4): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.4 + + cytoscape@3.33.4: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.1.0 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.18.1 + + dayjs@1.11.20: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dompurify@3.4.5: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + enhanced-resolve@5.21.6: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@6.0.1: {} + + es-toolkit@1.46.1: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.16.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + escape-string-regexp@5.0.0: {} + + esm@3.2.25: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + extend@3.0.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + format@0.2.2: {} + + framer-motion@12.40.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + motion-dom: 12.40.0 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + fsevents@2.3.2: + optional: true + + get-stream@8.0.1: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + graceful-fs@4.2.11: {} + + hachure-fill@0.5.2: {} + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.1 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-void-elements@3.0.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + import-meta-resolve@4.2.0: {} + + inline-style-parser@0.2.7: {} + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-stream@3.0.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isexe@2.0.0: {} + + jiti@2.7.0: {} + + katex@0.16.47: + dependencies: + commander: 8.3.0 + + khroma@2.1.0: {} + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lodash-es@4.18.1: {} + + longest-streak@3.1.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + marked@16.4.2: {} + + mathjax-full@3.2.2: + dependencies: + esm: 3.2.25 + mhchemparser: 4.2.1 + mj-context-menu: 0.6.1 + speech-rule-engine: 4.1.4 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@11.15.0: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.3 + '@mermaid-js/parser': 1.1.1 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.33.4 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.4) + cytoscape-fcose: 2.2.0(cytoscape@3.33.4) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.20 + dompurify: 3.4.5 + es-toolkit: 1.46.1 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.4.0 + ts-dedent: 2.2.0 + uuid: 14.0.0 + + mhchemparser@4.2.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.47 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mimic-fn@4.0.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + mj-context-menu@0.6.1: {} + + motion-dom@12.40.0: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + motion@12.40.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + framer-motion: 12.40.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + negotiator@1.0.0: {} + + next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.2.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.31 + caniuse-lite: 1.0.30001793 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.2.6 + '@next/swc-darwin-x64': 16.2.6 + '@next/swc-linux-arm64-gnu': 16.2.6 + '@next/swc-linux-arm64-musl': 16.2.6 + '@next/swc-linux-x64-gnu': 16.2.6 + '@next/swc-linux-x64-musl': 16.2.6 + '@next/swc-win32-arm64-msvc': 16.2.6 + '@next/swc-win32-x64-msvc': 16.2.6 + '@playwright/test': 1.60.0 + babel-plugin-react-compiler: 1.0.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nextra-theme-docs@4.6.1(@types/react@19.2.15)(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(nextra@4.6.1(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + dependencies: + '@headlessui/react': 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + clsx: 2.1.1 + next: 16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + nextra: 4.6.1(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + react-compiler-runtime: 19.1.0-rc.3(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + scroll-into-view-if-needed: 3.1.0 + zod: 4.4.3 + zustand: 5.0.13(@types/react@19.2.15)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + nextra@4.6.1(next@16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + dependencies: + '@formatjs/intl-localematcher': 0.6.2 + '@headlessui/react': 2.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mdx-js/mdx': 3.1.1 + '@napi-rs/simple-git': 0.1.22 + '@shikijs/twoslash': 3.23.0(typescript@5.9.3) + '@theguild/remark-mermaid': 0.3.0(react@19.2.4) + '@theguild/remark-npm2yarn': 0.3.3 + better-react-mathjax: 2.3.0(react@19.2.4) + clsx: 2.1.1 + estree-util-to-js: 2.0.0 + estree-util-value-to-estree: 3.5.0 + fast-glob: 3.3.3 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + katex: 0.16.47 + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm: 3.1.0 + mdast-util-to-hast: 13.2.1 + negotiator: 1.0.0 + next: 16.2.6(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-compiler-runtime: 19.1.0-rc.3(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + react-medium-image-zoom: 5.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + rehype-katex: 7.0.1 + rehype-pretty-code: 0.14.1(shiki@3.23.0) + rehype-raw: 7.0.0 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-reading-time: 2.1.0 + remark-smartypants: 3.0.2 + server-only: 0.0.1 + shiki: 3.23.0 + slash: 5.1.0 + title: 4.0.1 + ts-morph: 27.0.2 + unist-util-remove: 4.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-children: 3.0.0 + yaml: 2.9.0 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + - typescript + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-to-yarn@3.0.1: {} + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + package-manager-detector@1.6.0: {} + + pagefind@1.5.2: + optionalDependencies: + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-numeric-range@1.3.0: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + path-data-parser@0.1.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + playwright-core@1.60.0: {} + + playwright@1.60.0: + dependencies: + playwright-core: 1.60.0 + optionalDependencies: + fsevents: 2.3.2 + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss@8.4.31: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.1.0: {} + + queue-microtask@1.2.3: {} + + react-aria@3.48.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@internationalized/date': 3.12.1 + '@internationalized/number': 3.6.6 + '@internationalized/string': 3.2.8 + '@react-types/shared': 3.34.0(react@19.2.4) + '@swc/helpers': 0.5.15 + aria-hidden: 1.2.6 + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-stately: 3.46.0(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.4) + + react-compiler-runtime@19.1.0-rc.3(react@19.2.4): + dependencies: + react: 19.2.4 + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-medium-image-zoom@5.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + react-stately@3.46.0(react@19.2.4): + dependencies: + '@internationalized/date': 3.12.1 + '@internationalized/number': 3.6.6 + '@internationalized/string': 3.2.8 + '@react-types/shared': 3.34.0(react@19.2.4) + '@swc/helpers': 0.5.15 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + + react@19.2.4: {} + + reading-time@1.5.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.47 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.14.1(shiki@3.23.0): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 3.23.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-reading-time@2.1.0: + dependencies: + estree-util-is-identifier-name: 3.0.0 + estree-util-value-to-estree: 3.5.0 + reading-time: 1.5.0 + unist-util-visit: 5.1.0 + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + robust-predicates@3.0.3: {} + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + semver@7.8.0: + optional: true + + server-only@0.0.1: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.0 + 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 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@3.23.0: + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + signal-exit@4.1.0: {} + + slash@5.1.0: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + speech-rule-engine@4.1.4: + dependencies: + '@xmldom/xmldom': 0.9.10 + commander: 13.1.0 + wicked-good-xpath: 1.3.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-final-newline@3.0.0: {} + + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + + stylis@4.4.0: {} + + system-architecture@0.1.0: {} + + tabbable@6.4.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tinyexec@1.1.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + title@4.0.1: + dependencies: + arg: 5.0.2 + chalk: 5.6.2 + clipboardy: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-dedent@2.2.0: {} + + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + + tslib@2.8.1: {} + + twoslash-protocol@0.3.8: {} + + twoslash@0.3.8(typescript@5.9.3): + dependencies: + '@typescript/vfs': 1.6.4(typescript@5.9.3) + twoslash-protocol: 0.3.8 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + use-sync-external-store@1.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + + uuid@14.0.0: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + web-namespaces@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wicked-good-xpath@1.3.0: {} + + yaml@2.9.0: {} + + zod@4.4.3: {} + + zustand@5.0.13(@types/react@19.2.15)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.15 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..581a9d5 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +ignoredBuiltDependencies: + - sharp + - unrs-resolver diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/banner.png b/public/banner.png new file mode 100644 index 0000000..a3dbc12 Binary files /dev/null and b/public/banner.png differ diff --git a/public/contact/business-wechat-qr.png b/public/contact/business-wechat-qr.png new file mode 100644 index 0000000..a2f8220 Binary files /dev/null and b/public/contact/business-wechat-qr.png differ diff --git a/public/doubao_logo.image b/public/doubao_logo.image new file mode 100644 index 0000000..9aeb3bf Binary files /dev/null and b/public/doubao_logo.image differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..834de20 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..c4dba7d Binary files /dev/null and b/public/logo.png differ diff --git a/public/models/deepseek.ico b/public/models/deepseek.ico new file mode 100644 index 0000000..8e78c0b Binary files /dev/null and b/public/models/deepseek.ico differ diff --git a/public/models/minimax.ico b/public/models/minimax.ico new file mode 100644 index 0000000..38c0025 Binary files /dev/null and b/public/models/minimax.ico differ diff --git a/public/models/zhipu.ico b/public/models/zhipu.ico new file mode 100644 index 0000000..4ffc98e --- /dev/null +++ b/public/models/zhipu.ico @@ -0,0 +1,32 @@ +智谱AI开放平台
智谱AI
\ No newline at end of file diff --git a/public/news/1.webp b/public/news/1.webp new file mode 100644 index 0000000..f6cac92 Binary files /dev/null and b/public/news/1.webp differ diff --git a/public/news/2.webp b/public/news/2.webp new file mode 100644 index 0000000..54771a4 Binary files /dev/null and b/public/news/2.webp differ diff --git a/public/news/3.webp b/public/news/3.webp new file mode 100644 index 0000000..b6d5802 Binary files /dev/null and b/public/news/3.webp differ diff --git a/public/news/4.webp b/public/news/4.webp new file mode 100644 index 0000000..4a89394 Binary files /dev/null and b/public/news/4.webp differ diff --git a/public/news/5.webp b/public/news/5.webp new file mode 100644 index 0000000..39affeb Binary files /dev/null and b/public/news/5.webp differ diff --git a/public/news/6.webp b/public/news/6.webp new file mode 100644 index 0000000..215590b Binary files /dev/null and b/public/news/6.webp differ diff --git a/public/news/7.webp b/public/news/7.webp new file mode 100644 index 0000000..319284a Binary files /dev/null and b/public/news/7.webp differ diff --git a/public/news/8.webp b/public/news/8.webp new file mode 100644 index 0000000..8cbdfb2 Binary files /dev/null and b/public/news/8.webp differ diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..920142f --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "海宇数科", + "short_name": "海宇数科", + "description": "企业级大模型服务与智能报告平台", + "background_color": "#ffffff", + "theme_color": "#2670e8", + "display": "standalone", + "icons": [ + { + "src": "/logo.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/favicon.ico", + "sizes": "48x48", + "type": "image/x-icon" + } + ] +} diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scripts/docker/build-push.ps1 b/scripts/docker/build-push.ps1 new file mode 100644 index 0000000..ea6ab01 --- /dev/null +++ b/scripts/docker/build-push.ps1 @@ -0,0 +1,76 @@ +#Requires -Version 5.1 +<# +.SYNOPSIS + 构建官网镜像并推送到私有 Registry(对齐 bd-server/scripts/push-main-image.ps1) + +.DESCRIPTION + 使用前: docker login docker-registry.tianyuanapi.com + 默认镜像: docker-registry.tianyuanapi.com/haiyushuke/website:latest + +.EXAMPLE + .\scripts\docker\build-push.ps1 + .\scripts\docker\build-push.ps1 -ExportTar +#> +param( + [string]$Registry = "docker-registry.tianyuanapi.com", + [string]$ImagePath = "haiyushuke/website", + [string]$SiteUrl = "https://www.haiyushuke.com", + [string]$BaiduVerification = "", + [string]$NodeImage = "docker.m.daocloud.io/library/node:20-alpine", + [switch]$ExportTar +) + +$ErrorActionPreference = "Stop" +$Tag = "latest" +$ProjectRoot = Resolve-Path (Join-Path $PSScriptRoot "../..") +$FullImage = "${Registry}/${ImagePath}:${Tag}" +$LocalName = "haiyushuke-website:build" +$TarPath = Join-Path $PSScriptRoot "haiyushuke-website-latest.tar" + +Set-Location $ProjectRoot + +Write-Host "==> Pre-pull base image: $NodeImage" +docker pull $NodeImage +if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + +Write-Host "==> build $LocalName" +$buildArgs = @( + "build", + "-t", $LocalName, + "--build-arg", "NODE_IMAGE=$NodeImage", + "--build-arg", "NEXT_PUBLIC_SITE_URL=$SiteUrl" +) +if ($BaiduVerification) { + $buildArgs += @("--build-arg", "BAIDU_SITE_VERIFICATION=$BaiduVerification") +} +$buildArgs += "." +docker @buildArgs +if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + +if ($ExportTar) { + Write-Host "==> tag $FullImage (for save)" + docker tag $LocalName $FullImage + Write-Host "==> save $TarPath" + docker save -o $TarPath $FullImage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + Write-Host "Done (tar): $TarPath" + exit 0 +} + +Write-Host "==> tag $FullImage" +docker tag $LocalName $FullImage + +Write-Host "==> push $FullImage" +docker push $FullImage +if ($LASTEXITCODE -ne 0) { + Write-Host "" + Write-Host "Push failed. Check:" -ForegroundColor Yellow + Write-Host " docker login $Registry" -ForegroundColor Yellow + Write-Host (' curl -sI "https://{0}/v2/{1}/manifests/latest"' -f $Registry, $ImagePath) -ForegroundColor Yellow + Write-Host "Registry host must be docker-registry.tianyuanapi.com (not docker-register...)." -ForegroundColor Yellow + exit $LASTEXITCODE +} + +Write-Host "" +Write-Host "Done. Pushed: $FullImage" +Write-Host "Deploy host: cd scripts/docker && ./deploy-pull.sh" diff --git a/scripts/docker/deploy-load-tar.sh b/scripts/docker/deploy-load-tar.sh new file mode 100644 index 0000000..218afd5 --- /dev/null +++ b/scripts/docker/deploy-load-tar.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# 无法 pull 时:本机 build-push.ps1 -ExportTar,拷 tar 到服务器后执行 +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +TAR_FILE="${1:-${SCRIPT_DIR}/haiyushuke-website-latest.tar}" +ENV_FILE="${ENV_FILE:-${SCRIPT_DIR}/deploy.env}" +COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" + +[[ -f "${ENV_FILE}" ]] || { echo "missing ${ENV_FILE}" >&2; exit 1; } +[[ -f "${TAR_FILE}" ]] || { echo "missing tar: ${TAR_FILE}" >&2; exit 1; } + +cd "${SCRIPT_DIR}" +docker load -i "${TAR_FILE}" +docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" up -d diff --git a/scripts/docker/deploy-pull.sh b/scripts/docker/deploy-pull.sh new file mode 100644 index 0000000..48a337e --- /dev/null +++ b/scripts/docker/deploy-pull.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# 部署机拉取 latest 并启动(对齐 bd-server/scripts/pull-main-on-deploy.sh) +# 自测: curl -sI "https://docker-registry.tianyuanapi.com/v2/haiyushuke/website/manifests/latest" +# +# 用法: +# cp deploy.env.example deploy.env +# ./deploy-pull.sh + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" +ENV_FILE="${ENV_FILE:-${SCRIPT_DIR}/deploy.env}" + +if [[ ! -f "${ENV_FILE}" ]]; then + echo "missing ${ENV_FILE} (cp deploy.env.example deploy.env)" >&2 + exit 1 +fi + +cd "${SCRIPT_DIR}" + +echo "==> pull website (latest)" +docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" pull + +echo "==> up -d website" +docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" up -d + +# shellcheck disable=SC1090 +set -a +source "${ENV_FILE}" +set +a +HOST_PORT="${HOST_PORT:-3000}" + +echo "==> health http://127.0.0.1:${HOST_PORT}/" +sleep 2 +if curl -fsS -o /dev/null "http://127.0.0.1:${HOST_PORT}/"; then + echo "OK" +else + echo "WARN: curl failed; docker compose logs -f website" +fi + +echo "Done: ${REGISTRY}/${IMAGE_PATH}:latest" diff --git a/scripts/docker/deploy.env b/scripts/docker/deploy.env new file mode 100644 index 0000000..d5edde5 --- /dev/null +++ b/scripts/docker/deploy.env @@ -0,0 +1,6 @@ +REGISTRY=docker-registry.tianyuanapi.com +IMAGE_PATH=haiyushuke/website +CONTAINER_NAME=haiyushuke-website +HOST_PORT=3000 +NEXT_PUBLIC_SITE_URL=https://www.haiyushuke.com +BAIDU_SITE_VERIFICATION= diff --git a/scripts/docker/deploy.env.example b/scripts/docker/deploy.env.example new file mode 100644 index 0000000..dfcc361 --- /dev/null +++ b/scripts/docker/deploy.env.example @@ -0,0 +1,9 @@ +# cp deploy.env.example deploy.env +# 与 bd-server 相同 Registry 主机名;镜像路径为命名空间/名称 + +REGISTRY=docker-registry.tianyuanapi.com +IMAGE_PATH=haiyushuke/website +CONTAINER_NAME=haiyushuke-website +HOST_PORT=3000 +NEXT_PUBLIC_SITE_URL=https://www.haiyushuke.com +BAIDU_SITE_VERIFICATION= diff --git a/scripts/docker/docker-compose.yml b/scripts/docker/docker-compose.yml new file mode 100644 index 0000000..e69f6e4 --- /dev/null +++ b/scripts/docker/docker-compose.yml @@ -0,0 +1,14 @@ +# 服务器部署:docker compose pull && up(镜像由 build-push.ps1 推送) +# 自测: curl -sI "https://docker-registry.tianyuanapi.com/v2/haiyushuke/website/manifests/latest" + +services: + website: + image: ${REGISTRY}/${IMAGE_PATH}:latest + container_name: ${CONTAINER_NAME} + restart: unless-stopped + ports: + - "${HOST_PORT}:3000" + environment: + NODE_ENV: production + NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL} + BAIDU_SITE_VERIFICATION: ${BAIDU_SITE_VERIFICATION:-} diff --git a/scripts/docker/docker-daemon.snippet.json b/scripts/docker/docker-daemon.snippet.json new file mode 100644 index 0000000..520b334 --- /dev/null +++ b/scripts/docker/docker-daemon.snippet.json @@ -0,0 +1,3 @@ +{ + "insecure-registries": [] +} diff --git a/src/app/(site)/agents/page.tsx b/src/app/(site)/agents/page.tsx new file mode 100644 index 0000000..c7b7b76 --- /dev/null +++ b/src/app/(site)/agents/page.tsx @@ -0,0 +1,24 @@ +import type { Metadata } from "next"; +import { SubpageShell } from "@/components/subpage-shell"; +import { PageHero } from "@/components/page-hero"; +import { SectionReportAgent } from "@/components/section-report-agent"; +import { site } from "@/content/site"; +import { pageMetadata } from "@/lib/site-metadata"; + +const s = site.reportAgent; + +export const metadata: Metadata = pageMetadata({ + title: s.title, + description: s.lead, + path: "/agents", + keywords: ["Agent", "Skill", "智能体", "报告智能体", "海宇数科"], +}); + +export default function AgentsPage() { + return ( + + + + + ); +} diff --git a/src/app/(site)/layout.tsx b/src/app/(site)/layout.tsx new file mode 100644 index 0000000..fc971a3 --- /dev/null +++ b/src/app/(site)/layout.tsx @@ -0,0 +1,26 @@ +import { ParticlesShell } from "@/components/particles-shell"; +import { JsonLd } from "@/components/json-ld"; +import { + organizationJsonLd, + rootMetadata, + webSiteJsonLd, +} from "@/lib/site-metadata"; + +export const metadata = rootMetadata(); + +export default function SiteLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + <> + + +
+ {children} +
+
+ + ); +} diff --git a/src/app/(site)/models/page.tsx b/src/app/(site)/models/page.tsx new file mode 100644 index 0000000..da45a64 --- /dev/null +++ b/src/app/(site)/models/page.tsx @@ -0,0 +1,29 @@ +import type { Metadata } from "next"; +import { SubpageShell } from "@/components/subpage-shell"; +import { PageHero } from "@/components/page-hero"; +import { ModelsSquareClient } from "@/components/models-square-client"; +import { modelSquarePage } from "@/content/model-catalog"; +import { loadModelCatalog } from "@/lib/public-models"; +import { pageMetadata } from "@/lib/site-metadata"; + +export const metadata: Metadata = pageMetadata({ + title: modelSquarePage.title, + description: modelSquarePage.lead, + path: "/models", + keywords: ["模型广场", "大模型 API", "模型选型", "海宇数科"], +}); + +export default async function ModelsSquarePage() { + const p = modelSquarePage; + const initialModels = await loadModelCatalog(); + return ( + + +
+
+ +
+
+
+ ); +} diff --git a/src/app/(site)/news/[slug]/not-found.tsx b/src/app/(site)/news/[slug]/not-found.tsx new file mode 100644 index 0000000..1c53188 --- /dev/null +++ b/src/app/(site)/news/[slug]/not-found.tsx @@ -0,0 +1,26 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { SubpageShell } from "@/components/subpage-shell"; + +export const metadata: Metadata = { + title: "资讯未找到", + robots: { index: false, follow: true }, +}; + +export default function NewsNotFound() { + return ( + +
+
+

未找到该资讯

+

+ 链接可能已失效,请返回列表浏览最新文章。 +

+ + 返回 AI 资讯 + +
+
+
+ ); +} diff --git a/src/app/(site)/news/[slug]/page.tsx b/src/app/(site)/news/[slug]/page.tsx new file mode 100644 index 0000000..b850697 --- /dev/null +++ b/src/app/(site)/news/[slug]/page.tsx @@ -0,0 +1,100 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import { SubpageShell } from "@/components/subpage-shell"; +import { JsonLd } from "@/components/json-ld"; +import { NewsCoverImage } from "@/components/news-cover-image"; +import { + getAllNewsSlugs, + getNewsBySlug, +} from "@/content/news-articles"; +import { + articleMetadata, + newsArticleJsonLd, +} from "@/lib/site-metadata"; + +type PageProps = { + params: Promise<{ slug: string }>; +}; + +export function generateStaticParams() { + return getAllNewsSlugs().map((slug) => ({ slug })); +} + +export async function generateMetadata({ + params, +}: PageProps): Promise { + const { slug } = await params; + const article = getNewsBySlug(slug); + if (!article) { + return { title: "文章未找到", robots: { index: false, follow: false } }; + } + return articleMetadata({ + title: article.title, + description: article.summary, + path: `/news/${slug}`, + publishedTime: `${article.date}T08:00:00+08:00`, + imagePath: article.image, + imageAlt: article.imageAlt, + }); +} + +export default async function NewsDetailPage({ params }: PageProps) { + const { slug } = await params; + const article = getNewsBySlug(slug); + if (!article) { + notFound(); + } + + return ( + + +
+
+ + ← 返回资讯列表 + + +
+ +
+ +
+

{article.tag}

+

+ {article.title} +

+

{article.summary}

+

+ {article.date} + + · + + {article.author} + + · + + 约 {article.readMinutes} 分钟阅读 +

+
+ +
+ {article.paragraphs.map((para, index) => ( +

+ {para} +

+ ))} +
+
+
+
+ ); +} diff --git a/src/app/(site)/news/page.tsx b/src/app/(site)/news/page.tsx new file mode 100644 index 0000000..f2b87a6 --- /dev/null +++ b/src/app/(site)/news/page.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import { SubpageShell } from "@/components/subpage-shell"; +import { PageHero } from "@/components/page-hero"; +import { NewsListCard } from "@/components/news-list-card"; +import { newsArticles, newsListPage } from "@/content/news-articles"; +import { pageMetadata } from "@/lib/site-metadata"; + +export const metadata: Metadata = pageMetadata({ + title: newsListPage.title, + description: newsListPage.lead, + path: "/news", + keywords: ["AI 资讯", "大模型动态", "海宇数科", "智能报告"], +}); + +export default function NewsListPage() { + const p = newsListPage; + return ( + + +
+
+
+ {newsArticles.map((article, index) => ( + + ))} +
+
+
+
+ ); +} diff --git a/src/app/(site)/page.tsx b/src/app/(site)/page.tsx new file mode 100644 index 0000000..8aecb89 --- /dev/null +++ b/src/app/(site)/page.tsx @@ -0,0 +1,56 @@ +import type { Metadata } from "next"; +import { SiteHeader } from "@/components/site-header"; +import { SiteFooter } from "@/components/site-footer"; +import { HeroSection } from "@/components/hero-section"; +import { SectionIntelligentReport } from "@/components/section-intelligent-report"; +import { SectionReportAgent } from "@/components/section-report-agent"; +import { SectionModels } from "@/components/section-models"; +import { SectionEnterprise } from "@/components/section-enterprise"; +import { SectionNews } from "@/components/section-news"; +import { SectionContact } from "@/components/section-contact"; +import { ScrollReveal, ScrollRevealHero } from "@/components/scroll-reveal"; +import { canonicalAbsoluteUrl } from "@/lib/site-url"; + +/** 首页 SEO:canonical 带尾部 `/`,renderer 适配国产双核浏览器 */ +export const metadata: Metadata = { + alternates: { + canonical: canonicalAbsoluteUrl("/"), + }, + other: { + renderer: "webkit", + }, +}; + +export default function Home() { + return ( + <> + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + ); +} diff --git a/src/app/(site)/reports/page.tsx b/src/app/(site)/reports/page.tsx new file mode 100644 index 0000000..e6ccab7 --- /dev/null +++ b/src/app/(site)/reports/page.tsx @@ -0,0 +1,24 @@ +import type { Metadata } from "next"; +import { SubpageShell } from "@/components/subpage-shell"; +import { PageHero } from "@/components/page-hero"; +import { SectionIntelligentReport } from "@/components/section-intelligent-report"; +import { site } from "@/content/site"; +import { pageMetadata } from "@/lib/site-metadata"; + +const s = site.intelligentReport; + +export const metadata: Metadata = pageMetadata({ + title: s.title, + description: s.lead, + path: "/reports", + keywords: ["智能报告", "KYB", "企业核验", "尽调", "海宇数科"], +}); + +export default function ReportsPage() { + return ( + + + + + ); +} diff --git a/src/app/(site)/solutions/page.tsx b/src/app/(site)/solutions/page.tsx new file mode 100644 index 0000000..9aca5ba --- /dev/null +++ b/src/app/(site)/solutions/page.tsx @@ -0,0 +1,24 @@ +import type { Metadata } from "next"; +import { SubpageShell } from "@/components/subpage-shell"; +import { PageHero } from "@/components/page-hero"; +import { SectionEnterprise } from "@/components/section-enterprise"; +import { site } from "@/content/site"; +import { pageMetadata } from "@/lib/site-metadata"; + +const s = site.enterprise; + +export const metadata: Metadata = pageMetadata({ + title: s.title, + description: s.lead, + path: "/solutions", + keywords: ["企业数字化", "解决方案", "大模型", "海宇数科"], +}); + +export default function SolutionsPage() { + return ( + + + + + ); +} diff --git a/src/app/api/models/route.ts b/src/app/api/models/route.ts new file mode 100644 index 0000000..c95d8b6 --- /dev/null +++ b/src/app/api/models/route.ts @@ -0,0 +1,20 @@ +import { NextResponse } from "next/server"; +import { proxyPublicModelsResponse } from "@/lib/public-models"; + +export async function GET() { + const res = await proxyPublicModelsResponse(); + if (!res.ok) { + if (res.status === 502) { + return NextResponse.json( + { code: "INTERNAL_ERROR", message: "服务暂时不可用" }, + { status: 500 }, + ); + } + return NextResponse.json( + { code: "UPSTREAM_ERROR", message: "获取模型列表失败" }, + { status: res.status || 502 }, + ); + } + const envelope = await res.json(); + return NextResponse.json(envelope); +} diff --git a/src/app/docs/[[...mdxPath]]/page.tsx b/src/app/docs/[[...mdxPath]]/page.tsx new file mode 100644 index 0000000..1dc7714 --- /dev/null +++ b/src/app/docs/[[...mdxPath]]/page.tsx @@ -0,0 +1,31 @@ +import { generateStaticParamsFor, importPage } from "nextra/pages"; +import { useMDXComponents } from "@/mdx-components"; +import { DocsArticle } from "@/components/docs-article"; +import type { DocsTocItem } from "@/components/docs-on-this-page"; + +export const generateStaticParams = generateStaticParamsFor("mdxPath"); + +export async function generateMetadata(props: { + params: Promise<{ mdxPath?: string[] }>; +}) { + const params = await props.params; + const { metadata } = await importPage(params.mdxPath); + return metadata; +} + +export default async function DocsPage(props: { + params: Promise<{ mdxPath?: string[] }>; +}) { + const params = await props.params; + const { + default: MDXContent, + toc, + } = await importPage(params.mdxPath); + const components = useMDXComponents(); + + return ( + + + + ); +} diff --git a/src/app/docs/layout.tsx b/src/app/docs/layout.tsx new file mode 100644 index 0000000..c3a3398 --- /dev/null +++ b/src/app/docs/layout.tsx @@ -0,0 +1,16 @@ +import { DocsShell } from "@/components/docs-shell"; + +export const metadata = { + title: { + default: "文档中心", + template: "%s · 海宇数科文档", + }, +}; + +export default function DocsLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return {children}; +} diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/src/app/favicon.ico differ diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..35fbabc --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,50 @@ +@import "tailwindcss"; +@import "../styles/tokens.css"; +@import "../styles/typography.css"; +@import "../styles/layout.css"; +@import "../styles/components.css"; +@import "../styles/effects.css"; +@import "../styles/locale-zh.css"; +@import "../styles/responsive.css"; +@import "../styles/docs.css"; + +@layer base { + html { + color-scheme: light; + scroll-behavior: smooth; + } + + @media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + } + + body { + @apply font-display type-body-md antialiased; + background-color: var(--color-canvas-page); + color: var(--color-ink); + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + } + + html[lang="zh-CN"] body { + font-feature-settings: normal; + } + + a { + color: inherit; + text-decoration: none; + } + + a:hover { + text-decoration: underline; + text-underline-offset: 0.25em; + text-decoration-thickness: 1px; + } + + :focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..a0cea14 --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,42 @@ +import { Inter, Noto_Serif_SC, JetBrains_Mono } from "next/font/google"; +import "./globals.css"; +import { rootMetadata } from "@/lib/site-metadata"; + +const inter = Inter({ + variable: "--font-inter", + subsets: ["latin"], + weight: ["400", "500"], + display: "swap", +}); + +const notoSerif = Noto_Serif_SC({ + variable: "--font-noto-serif", + subsets: ["latin"], + weight: ["400", "500", "600"], + display: "swap", +}); + +const jetbrainsMono = JetBrains_Mono({ + variable: "--font-jetbrains-mono", + subsets: ["latin"], + weight: ["400", "500"], + display: "swap", +}); + +export const metadata = rootMetadata(); + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/src/app/robots.ts b/src/app/robots.ts new file mode 100644 index 0000000..450121a --- /dev/null +++ b/src/app/robots.ts @@ -0,0 +1,20 @@ +import type { MetadataRoute } from "next"; +import { getSiteUrl } from "@/lib/site-url"; + +export default function robots(): MetadataRoute.Robots { + const base = getSiteUrl(); + const allowAll = { userAgent: "*", allow: "/" }; + + return { + rules: [ + allowAll, + { userAgent: "Baiduspider", allow: "/" }, + { userAgent: "Baiduspider-image", allow: "/" }, + { userAgent: "Sogou web spider", allow: "/" }, + { userAgent: "360Spider", allow: "/" }, + { userAgent: "YisouSpider", allow: "/" }, + ], + sitemap: new URL("/sitemap.xml", base).toString(), + host: base.host, + }; +} diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts new file mode 100644 index 0000000..dbdcd3f --- /dev/null +++ b/src/app/sitemap.ts @@ -0,0 +1,41 @@ +import type { MetadataRoute } from "next"; +import { getAllNewsSlugs, getNewsBySlug } from "@/content/news-articles"; +import { canonicalAbsoluteUrl } from "@/lib/site-url"; + +export default function sitemap(): MetadataRoute.Sitemap { + const now = new Date(); + + const staticPaths = [ + "/", + "/reports", + "/agents", + "/models", + "/solutions", + "/news", + "/docs", + "/docs/getting-started", + "/docs/faq", + ] as const; + + const staticEntries: MetadataRoute.Sitemap = staticPaths.map((path) => ({ + url: canonicalAbsoluteUrl(path), + lastModified: now, + changeFrequency: path === "/news" ? ("daily" as const) : ("weekly" as const), + priority: path === "/" ? 1 : 0.9, + })); + + const newsEntries: MetadataRoute.Sitemap = getAllNewsSlugs().map((slug) => { + const article = getNewsBySlug(slug); + const lastModified = article?.date + ? new Date(`${article.date}T08:00:00+08:00`) + : now; + return { + url: canonicalAbsoluteUrl(`/news/${slug}`), + lastModified, + changeFrequency: "monthly" as const, + priority: 0.7, + }; + }); + + return [...staticEntries, ...newsEntries]; +} diff --git a/src/components/ambient-motion-glow.tsx b/src/components/ambient-motion-glow.tsx new file mode 100644 index 0000000..dbf0549 --- /dev/null +++ b/src/components/ambient-motion-glow.tsx @@ -0,0 +1,214 @@ +"use client"; + +import { motion, useReducedMotion } from "motion/react"; + +/** 与站点墨蓝 / nav-axis 一致的 AI 冷色光晕,避免高饱和「彩虹」感 */ +const AI_GLOW_PALETTE = { + axis: "rgb(158 178 212 / 0.48)", + blue: "rgb(91 142 196 / 0.44)", + slate: "rgb(74 101 130 / 0.4)", + cyan: "rgb(86 168 198 / 0.38)", + violet: "rgb(124 140 200 / 0.42)", + periwinkle: "rgb(108 128 178 / 0.36)", + ice: "rgb(176 198 228 / 0.32)", + deep: "rgb(46 72 108 / 0.28)", +} as const; + +type GlowOrb = { + id: string; + width: number; + height: number; + top: string; + left: string; + radius: string; + gradient: string; + duration: number; + path: { x: number[]; y: number[]; rotate?: number[] }; +}; + +const ORBS: GlowOrb[] = [ + { + id: "axis-tr", + width: 680, + height: 420, + top: "-18%", + left: "58%", + radius: "58% 42% 45% 55% / 52% 48% 62% 38%", + gradient: `radial-gradient(ellipse 90% 70% at 35% 45%, ${AI_GLOW_PALETTE.axis}, transparent 72%)`, + duration: 11, + path: { + x: [0, 180, -120, 80, 0], + y: [0, -140, 100, -50, 0], + rotate: [0, 22, -18, 8, 0], + }, + }, + { + id: "blue-wide", + width: 520, + height: 780, + top: "12%", + left: "-22%", + radius: "48% 52% 40% 60% / 55% 45% 50% 50%", + gradient: `radial-gradient(ellipse 75% 85% at 60% 50%, ${AI_GLOW_PALETTE.blue}, transparent 70%)`, + duration: 13, + path: { + x: [0, -140, 170, -90, 0], + y: [0, 120, -150, 70, 0], + rotate: [0, -28, 24, -12, 0], + }, + }, + { + id: "violet-mid", + width: 440, + height: 360, + top: "38%", + left: "42%", + radius: "62% 38% 55% 45% / 48% 52% 42% 58%", + gradient: `radial-gradient(ellipse 80% 65% at 50% 40%, ${AI_GLOW_PALETTE.violet}, transparent 68%)`, + duration: 9, + path: { + x: [0, -160, 130, -70, 0], + y: [0, 95, -130, 75, 0], + rotate: [0, 16, -20, 0], + }, + }, + { + id: "cyan-ribbon", + width: 900, + height: 280, + top: "62%", + left: "-12%", + radius: "40% 60% 50% 50% / 45% 55% 60% 40%", + gradient: `radial-gradient(ellipse 120% 55% at 50% 50%, ${AI_GLOW_PALETTE.cyan}, transparent 75%)`, + duration: 10, + path: { + x: [0, 220, -180, 100, 0], + y: [0, -70, 95, -40, 0], + rotate: [0, 14, -12, 0], + }, + }, + { + id: "slate-br", + width: 380, + height: 520, + top: "72%", + left: "72%", + radius: "55% 45% 48% 52% / 60% 40% 55% 45%", + gradient: `radial-gradient(ellipse 70% 90% at 40% 60%, ${AI_GLOW_PALETTE.slate}, transparent 72%)`, + duration: 12, + path: { + x: [0, -110, 150, -60, 0], + y: [0, -120, 85, 50, 0], + rotate: [0, -18, 14, 0], + }, + }, + { + id: "periwinkle-sm", + width: 260, + height: 340, + top: "18%", + left: "78%", + radius: "63% 37% 42% 58% / 50% 50% 58% 42%", + gradient: `radial-gradient(ellipse 65% 80% at 50% 50%, ${AI_GLOW_PALETTE.periwinkle}, transparent 70%)`, + duration: 8, + path: { + x: [0, 100, -85, 55, 0], + y: [0, -80, 65, -35, 0], + rotate: [0, 35, -28, 12, 0], + }, + }, + { + id: "ice-float", + width: 320, + height: 200, + top: "48%", + left: "88%", + radius: "50% 50% 45% 55% / 42% 58% 52% 48%", + gradient: `radial-gradient(ellipse 100% 60% at 30% 70%, ${AI_GLOW_PALETTE.ice}, transparent 68%)`, + duration: 7, + path: { + x: [0, -90, 130, -50, 0], + y: [0, 55, -70, 40, 0], + rotate: [0, 20, -16, 0], + }, + }, + { + id: "deep-anchor", + width: 560, + height: 640, + top: "85%", + left: "-8%", + radius: "42% 58% 60% 40% / 55% 45% 48% 52%", + gradient: `radial-gradient(ellipse 85% 75% at 55% 35%, ${AI_GLOW_PALETTE.deep}, transparent 78%)`, + duration: 14, + path: { + x: [0, 120, -150, 70, 0], + y: [0, -95, 130, -55, 0], + rotate: [0, -14, 18, 0], + }, + }, + { + id: "blue-cap", + width: 340, + height: 280, + top: "-8%", + left: "8%", + radius: "57% 43% 52% 48% / 46% 54% 50% 50%", + gradient: `radial-gradient(ellipse 70% 75% at 50% 50%, ${AI_GLOW_PALETTE.blue}, transparent 65%)`, + duration: 9, + path: { + x: [0, 85, -110, 45, 0], + y: [0, 70, -55, 30, 0], + rotate: [0, 24, -20, 0], + }, + }, +]; + +export function AmbientMotionGlow() { + const reduceMotion = useReducedMotion(); + + return ( +
+ {ORBS.map((orb) => ( + + ))} +
+ ); +} diff --git a/src/components/docs-article.tsx b/src/components/docs-article.tsx new file mode 100644 index 0000000..982b35a --- /dev/null +++ b/src/components/docs-article.tsx @@ -0,0 +1,26 @@ +import { + DocsOnThisPage, + type DocsTocItem, +} from "@/components/docs-on-this-page"; + +type DocsArticleProps = { + children: React.ReactNode; + toc?: DocsTocItem[]; +}; + +export function DocsArticle({ children, toc = [] }: DocsArticleProps) { + return ( +
+
+
+ {children} +
+
+
+
+ +
+
+
+ ); +} diff --git a/src/components/docs-breadcrumb.tsx b/src/components/docs-breadcrumb.tsx new file mode 100644 index 0000000..a53ad1b --- /dev/null +++ b/src/components/docs-breadcrumb.tsx @@ -0,0 +1,53 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { docsNav } from "@/lib/docs-nav"; + +function findLabel(pathname: string): string { + if (pathname === "/docs" || pathname === "/docs/") return "文档中心"; + for (const item of docsNav) { + if (pathname === item.href || pathname.startsWith(`${item.href}/`)) { + const child = item.children?.find( + (c) => pathname === c.href || pathname.startsWith(`${c.href}/`), + ); + if (child) return child.label; + return item.label; + } + } + return "文档"; +} + +export function DocsBreadcrumb() { + const pathname = usePathname(); + const current = findLabel(pathname); + const isHome = pathname === "/docs" || pathname === "/docs/"; + + return ( + + ); +} diff --git a/src/components/docs-code-block.tsx b/src/components/docs-code-block.tsx new file mode 100644 index 0000000..5d0002f --- /dev/null +++ b/src/components/docs-code-block.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { useCallback, useState, type ComponentProps } from "react"; + +export function DocsCodeBlock(props: ComponentProps<"pre">) { + const [copied, setCopied] = useState(false); + + const onCopy = useCallback(async () => { + const text = props.children + ? extractText(props.children) + : ""; + if (!text) return; + try { + await navigator.clipboard.writeText(text); + setCopied(true); + window.setTimeout(() => setCopied(false), 2000); + } catch { + /* ignore */ + } + }, [props.children]); + + return ( +
+ +
+    
+ ); +} + +function extractText(node: React.ReactNode): string { + if (typeof node === "string") return node; + if (typeof node === "number") return String(node); + if (Array.isArray(node)) return node.map(extractText).join(""); + if (node && typeof node === "object" && "props" in node) { + const p = (node as { props?: { children?: React.ReactNode } }).props; + return extractText(p?.children ?? ""); + } + return ""; +} diff --git a/src/components/docs-mobile-nav.tsx b/src/components/docs-mobile-nav.tsx new file mode 100644 index 0000000..3108b8e --- /dev/null +++ b/src/components/docs-mobile-nav.tsx @@ -0,0 +1,48 @@ +"use client"; + +import { useEffect, useId, useState } from "react"; +import { DocsSidebarNav } from "@/components/docs-sidebar-nav"; +export function DocsMobileNav() { + const [open, setOpen] = useState(false); + const panelId = useId(); + + useEffect(() => { + if (!open) return; + const prev = document.body.style.overflow; + document.body.style.overflow = "hidden"; + return () => { + document.body.style.overflow = prev; + }; + }, [open]); + + return ( +
+ + {open ? ( +
setOpen(false)} + /> + ) : null} + +
+ ); +} diff --git a/src/components/docs-on-this-page.tsx b/src/components/docs-on-this-page.tsx new file mode 100644 index 0000000..411bc79 --- /dev/null +++ b/src/components/docs-on-this-page.tsx @@ -0,0 +1,109 @@ +"use client"; + +import { useEffect, useState } from "react"; + +export type DocsTocItem = { + id?: string; + value: string; + depth: number; +}; + +export function DocsOnThisPage({ items }: { items: DocsTocItem[] }) { + const headings = items.filter((item) => item.depth >= 2 && item.depth <= 3); + const [activeId, setActiveId] = useState(null); + + useEffect(() => { + if (!headings.length) return; + + const slugify = (text: string) => + text + .toLowerCase() + .replace(/\s+/g, "-") + .replace(/[^\w\u4e00-\u9fff-]/g, ""); + + const elements = headings + .map((h) => { + const id = + h.id || + slugify( + typeof h.value === "string" + ? h.value + : String(h.value ?? ""), + ); + const el = document.getElementById(id); + return el ? { id, el } : null; + }) + .filter(Boolean) as { id: string; el: HTMLElement }[]; + + if (!elements.length) return; + + const observer = new IntersectionObserver( + (entries) => { + const visible = entries + .filter((e) => e.isIntersecting) + .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top); + if (visible[0]?.target.id) { + setActiveId(visible[0].target.id); + } + }, + { rootMargin: "-20% 0px -70% 0px", threshold: 0 }, + ); + + for (const { el } of elements) observer.observe(el); + return () => observer.disconnect(); + }, [headings]); + + if (headings.length < 2) return null; + + const slugify = (text: string) => + text + .toLowerCase() + .replace(/\s+/g, "-") + .replace(/[^\w\u4e00-\u9fff-]/g, ""); + + return ( + + ); +} diff --git a/src/components/docs-search.tsx b/src/components/docs-search.tsx new file mode 100644 index 0000000..e5e462a --- /dev/null +++ b/src/components/docs-search.tsx @@ -0,0 +1,261 @@ +"use client"; + +import { + Combobox, + ComboboxInput, + ComboboxOption, + ComboboxOptions, +} from "@headlessui/react"; +import { addBasePath } from "next/dist/client/add-base-path"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { + type ChangeEvent, + type ReactNode, + useDeferredValue, + useEffect, + useRef, + useState, +} from "react"; + +declare global { + interface Window { + pagefind?: { + options: (opts: { baseUrl: string }) => Promise; + debouncedSearch: ( + query: string, + opts?: Record, + ) => Promise< + | { + results: Array<{ + data: () => Promise; + }>; + } + | undefined + >; + }; + } +} + +type SearchResultData = { + url: string; + meta: { title: string }; + sub_results: Array<{ + url: string; + title: string; + excerpt: string; + }>; +}; + +const INPUT_TAGS = new Set(["INPUT", "SELECT", "BUTTON", "TEXTAREA"]); + +const DEV_SEARCH_NOTICE = ( + <> +

+ 开发环境下需先执行 pnpm build 生成索引,再重启{" "} + pnpm dev 方可使用搜索(与 Nextra 一致)。 +

+ +); + +async function importPagefind() { + window.pagefind = await import( + /* webpackIgnore: true */ + addBasePath("/_pagefind/pagefind.js") + ); + await window.pagefind!.options({ baseUrl: "/" }); +} + +function cn(...parts: Array) { + return parts.filter(Boolean).join(" "); +} + +function SearchResultGroup({ data }: { data: SearchResultData }) { + return ( + <> +
{data.meta.title}
+ {data.sub_results.map((sub) => ( + + cn("docs-spotlight__hit", focus && "docs-spotlight__hit--focus") + } + > +
{sub.title}
+
+ + ))} + + ); +} + +/** 与 Nextra 一致的 Pagefind 搜索(样式用本站 token,不引入 nextra-theme 全局 CSS) */ +export function DocsSearch({ className }: { className?: string }) { + const router = useRouter(); + const inputRef = useRef(null); + const [search, setSearch] = useState(""); + const deferredSearch = useDeferredValue(search); + const [results, setResults] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(""); + const [focused, setFocused] = useState(false); + const [mounted, setMounted] = useState(false); + + useEffect(() => setMounted(true), []); + + useEffect(() => { + const onKeyDown = (event: KeyboardEvent) => { + const el = document.activeElement; + if ( + !el || + INPUT_TAGS.has(el.tagName) || + (el instanceof HTMLElement && el.isContentEditable) + ) { + return; + } + const mod = navigator.userAgent.includes("Mac") + ? event.metaKey + : event.ctrlKey; + if ( + event.key === "/" || + (event.key === "k" && !event.shiftKey && mod) + ) { + event.preventDefault(); + inputRef.current?.focus({ preventScroll: true }); + } + }; + window.addEventListener("keydown", onKeyDown); + return () => window.removeEventListener("keydown", onKeyDown); + }, []); + + useEffect(() => { + let cancelled = false; + + async function run() { + if (!deferredSearch) { + setResults([]); + setError(""); + return; + } + setIsLoading(true); + if (!window.pagefind) { + try { + await importPagefind(); + } catch (err) { + const message = + err instanceof Error + ? process.env.NODE_ENV !== "production" && + err.message.includes("Failed to fetch") + ? DEV_SEARCH_NOTICE + : `${err.constructor.name}: ${err.message}` + : String(err); + if (!cancelled) { + setError(message); + setIsLoading(false); + } + return; + } + } + const response = await window.pagefind!.debouncedSearch(deferredSearch); + if (!response || cancelled) return; + const data = await Promise.all(response.results.map((r) => r.data())); + const normalized = data.map((item) => ({ + ...item, + sub_results: item.sub_results.map((sub) => ({ + ...sub, + url: sub.url.replace(/\.html$/, "").replace(/\.html#/, "#"), + })), + })); + if (!cancelled) { + setResults(normalized); + setError(""); + setIsLoading(false); + } + } + + void run(); + return () => { + cancelled = true; + }; + }, [deferredSearch]); + + const handleSelect = (hit: SearchResultData["sub_results"][number] | null) => { + if (!hit) return; + inputRef.current?.blur(); + const [path, hash] = hit.url.split("#"); + if (location.pathname === path) { + location.href = `#${hash}`; + } else { + router.push(hit.url); + } + setSearch(""); + }; + + const showShortcut = mounted && !focused; + const isMac = mounted && navigator.userAgent.includes("Mac"); + + return ( + +
+ + cn("docs-spotlight__input", focus && "docs-spotlight__input--focus") + } + placeholder="搜索文档…" + value={search} + onChange={(e: ChangeEvent) => + setSearch(e.target.value) + } + onFocus={() => setFocused(true)} + onBlur={() => setFocused(false)} + /> + + {isMac ? ( + <> + K + + ) : ( + "CTRL K" + )} + +
+ + + {error ? ( +
+ 无法加载搜索索引 +
{error}
+
+ ) : isLoading ? ( +
加载中…
+ ) : results.length ? ( + results.map((group) => ( + + )) + ) : deferredSearch ? ( +
未找到结果
+ ) : null} +
+
+ ); +} diff --git a/src/components/docs-shell.tsx b/src/components/docs-shell.tsx new file mode 100644 index 0000000..03f9f01 --- /dev/null +++ b/src/components/docs-shell.tsx @@ -0,0 +1,33 @@ +import { SiteHeader } from "@/components/site-header"; +import { SiteFooter } from "@/components/site-footer"; +import { ParticlesShell } from "@/components/particles-shell"; +import { DocsSidebarNav } from "@/components/docs-sidebar-nav"; +import { DocsMobileNav } from "@/components/docs-mobile-nav"; +import { DocsSubnav } from "@/components/docs-subnav"; + +export function DocsShell({ children }: { children: React.ReactNode }) { + return ( + +
+ + +
+
+ + +
{children}
+
+
+ +
+
+ ); +} diff --git a/src/components/docs-sidebar-nav.tsx b/src/components/docs-sidebar-nav.tsx new file mode 100644 index 0000000..31ad15c --- /dev/null +++ b/src/components/docs-sidebar-nav.tsx @@ -0,0 +1,107 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { useEffect, useId, useState } from "react"; +import { docsNav, type DocsNavItem } from "@/lib/docs-nav"; + +function isActive(pathname: string, href: string) { + if (href === "/docs") { + return pathname === "/docs" || pathname === "/docs/"; + } + return pathname === href || pathname.startsWith(`${href}/`); +} + +function isGroupActive(pathname: string, item: DocsNavItem) { + if (isActive(pathname, item.href)) return true; + return item.children?.some((c) => isActive(pathname, c.href)) ?? false; +} + +function NavLink({ + href, + label, + nested, +}: { + href: string; + label: string; + nested?: boolean; +}) { + const pathname = usePathname(); + const active = isActive(pathname, href); + + return ( + + {label} + + ); +} + +function NavGroup({ item }: { item: DocsNavItem }) { + const pathname = usePathname(); + const groupActive = isGroupActive(pathname, item); + const [open, setOpen] = useState(groupActive); + const panelId = useId(); + + useEffect(() => { + if (groupActive) setOpen(true); + }, [groupActive]); + + const hasChildren = Boolean(item.children?.length); + + if (!hasChildren) { + return ( +
  • + +
  • + ); + } + + return ( +
  • +
    + + +
    +
      + {item.children!.map((child) => ( +
    • + +
    • + ))} +
    +
  • + ); +} + +export function DocsSidebarNav() { + return ( +
      + {docsNav.map((item) => ( + + ))} +
    + ); +} diff --git a/src/components/docs-subnav.tsx b/src/components/docs-subnav.tsx new file mode 100644 index 0000000..84da41e --- /dev/null +++ b/src/components/docs-subnav.tsx @@ -0,0 +1,18 @@ +import { DocsBreadcrumb } from "@/components/docs-breadcrumb"; +import { DocsSearch } from "@/components/docs-search"; + +/** 文档次顶栏:面包屑 + 搜索,滚动时固定在全站顶栏下方 */ +export function DocsSubnav() { + return ( +
    +
    +
    + +
    + +
    +
    +
    +
    + ); +} diff --git a/src/components/hero-section.tsx b/src/components/hero-section.tsx new file mode 100644 index 0000000..e46c686 --- /dev/null +++ b/src/components/hero-section.tsx @@ -0,0 +1,52 @@ +import Image from "next/image"; +import { site } from "@/content/site"; + +export function HeroSection() { + const { hero } = site; + return ( +
    + 海宇数科品牌视觉 +
    +
    +
    +

    + {hero.eyebrow} +

    +

    + {hero.title} +

    +

    {hero.lead}

    + +
    +
    +
    + ); +} diff --git a/src/components/intelligent-report-grid.tsx b/src/components/intelligent-report-grid.tsx new file mode 100644 index 0000000..5264975 --- /dev/null +++ b/src/components/intelligent-report-grid.tsx @@ -0,0 +1,122 @@ +"use client"; + +import { useCallback, useEffect, useState } from "react"; +import { site } from "@/content/site"; +import { ScrollRevealItem } from "@/components/scroll-reveal"; + +type Report = (typeof site.intelligentReport.reports)[number]; + +export function IntelligentReportGrid() { + const { reports, viewExampleLabel } = site.intelligentReport; + const [active, setActive] = useState(null); + + const openExample = useCallback((report: Report) => { + setActive(report); + }, []); + + const closeExample = useCallback(() => { + setActive(null); + }, []); + + useEffect(() => { + if (!active) return; + const prev = document.body.style.overflow; + document.body.style.overflow = "hidden"; + return () => { + document.body.style.overflow = prev; + }; + }, [active]); + + return ( + <> +
    + {reports.map((r, index) => ( + +
    +
    +

    {r.audience}

    + + {String(index + 1).padStart(2, "0")} + +
    +

    {r.title}

    +

    + {r.body} +

    +
    + +
    +
    +
    + ))} +
    + + {active ? ( +
    { + if (e.target === e.currentTarget) closeExample(); + }} + onKeyDown={(e) => { + if (e.key === "Escape") closeExample(); + }} + > +
    +
    +
    +

    {active.audience}

    +

    + {active.example.title} +

    +

    {active.example.meta}

    +
    +
    + {active.example.sections.map((sec) => ( +
    +

    + {sec.heading} +

    + {"body" in sec && sec.body ? ( +

    {sec.body}

    + ) : null} + {"bullets" in sec && sec.bullets ? ( +
      + {sec.bullets.map((item) => ( +
    • {item}
    • + ))} +
    + ) : null} +
    + ))} +
    +
    + +
    +
    +
    +
    + ) : null} + + ); +} diff --git a/src/components/json-ld.tsx b/src/components/json-ld.tsx new file mode 100644 index 0000000..dbfa3b4 --- /dev/null +++ b/src/components/json-ld.tsx @@ -0,0 +1,13 @@ +type JsonLdProps = { + data: Record | Record[]; +}; + +export function JsonLd({ data }: JsonLdProps) { + const payload = Array.isArray(data) ? data : [data]; + return ( +