From bd92f10b83e5e83fb262fac29dfbf6541b719de4 Mon Sep 17 00:00:00 2001 From: JiaJun <2394389886@qq.com> Date: Thu, 23 Apr 2026 16:41:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 + .env.example | 4 + .env.production | 4 + .gitignore | 27 + .husky/commit-msg | 1 + .husky/pre-commit | 1 + README.md | 421 +- biome.json | 65 + commitlint.config.mjs | 3 + ...6字花_ 前端开发对接与交互逻辑说明书》.docx | Bin 0 -> 162 bytes docs/frontend-baseline-requirements.md | 439 ++ ...36字花》用户前端 (User Portal) UI_UX .docx | Bin 0 -> 195519 bytes ...36字花_ 前端开发对接与交互逻辑说明书》.docx | Bin 0 -> 10287 bytes index.html | 31 + package.json | 61 + pnpm-lock.yaml | 3687 +++++++++++++++++ public/favicon.svg | 1 + src/constants/index.ts | 41 + src/i18n/index.ts | 112 + src/lib/api/api-client.ts | 212 + src/lib/api/api-error.ts | 20 + src/lib/api/types.ts | 6 + src/lib/auth/auth-session.ts | 104 + src/lib/auth/require-auth.ts | 29 + src/lib/head/document-metadata.ts | 95 + src/lib/query/query-client.ts | 43 + src/locales/en-US/common.ts | 42 + src/locales/zh-CN/common.ts | 42 + src/main.tsx | 31 + src/routeTree.gen.ts | 104 + src/router.tsx | 14 + src/routes/$lang/index.tsx | 19 + src/routes/$lang/route.tsx | 46 + src/routes/__root.tsx | 64 + src/routes/index.tsx | 13 + src/store/auth-store.ts | 143 + src/styles.css | 22 + src/vite-env.d.ts | 12 + tsconfig.app.json | 28 + tsconfig.json | 7 + tsconfig.node.json | 27 + vite.config.ts | 24 + 42 files changed, 6047 insertions(+), 2 deletions(-) create mode 100644 .env.development create mode 100644 .env.example create mode 100644 .env.production create mode 100644 .gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 biome.json create mode 100644 commitlint.config.mjs create mode 100644 docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx create mode 100644 docs/frontend-baseline-requirements.md create mode 100644 docs/《36字花》用户前端 (User Portal) UI_UX .docx create mode 100644 docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/favicon.svg create mode 100644 src/constants/index.ts create mode 100644 src/i18n/index.ts create mode 100644 src/lib/api/api-client.ts create mode 100644 src/lib/api/api-error.ts create mode 100644 src/lib/api/types.ts create mode 100644 src/lib/auth/auth-session.ts create mode 100644 src/lib/auth/require-auth.ts create mode 100644 src/lib/head/document-metadata.ts create mode 100644 src/lib/query/query-client.ts create mode 100644 src/locales/en-US/common.ts create mode 100644 src/locales/zh-CN/common.ts create mode 100644 src/main.tsx create mode 100644 src/routeTree.gen.ts create mode 100644 src/router.tsx create mode 100644 src/routes/$lang/index.tsx create mode 100644 src/routes/$lang/route.tsx create mode 100644 src/routes/__root.tsx create mode 100644 src/routes/index.tsx create mode 100644 src/store/auth-store.ts create mode 100644 src/styles.css create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..49980cb --- /dev/null +++ b/.env.development @@ -0,0 +1,4 @@ +VITE_APP_ENV=development +VITE_API_BASE_URL=http://localhost:3000 +VITE_ENABLE_QUERY_DEVTOOLS=true +VITE_ENABLE_REQUEST_LOG=true diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..49980cb --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +VITE_APP_ENV=development +VITE_API_BASE_URL=http://localhost:3000 +VITE_ENABLE_QUERY_DEVTOOLS=true +VITE_ENABLE_REQUEST_LOG=true diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..32fb8d6 --- /dev/null +++ b/.env.production @@ -0,0 +1,4 @@ +VITE_APP_ENV=production +VITE_API_BASE_URL=https://api.example.com +VITE_ENABLE_QUERY_DEVTOOLS=false +VITE_ENABLE_REQUEST_LOG=false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5ec0f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +coverage +*.local +.env.local +.env.*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..2e6b87e --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +pnpm exec commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..5ee7abd --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/README.md b/README.md index 676dc4c..3fb190f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,420 @@ -# 36-character-flower +# React SPA Template -36字花 \ No newline at end of file +这是一个用于后台系统或通用 SPA 项目的前端基础脚手架。它已经接好了以下底座能力: + +- `Vite + React 19 + TypeScript` +- `TanStack Router` 文件路由 +- `TanStack Query + ky` 请求与缓存 +- `Zustand` 会话状态基座 +- `Tailwind CSS` 原子化样式 +- `i18next` 多语言 +- `Head / Metadata` 动态标题与元信息 +- `Biome + Husky + commitlint` 代码规范与提交规范 + +这个模板现在已经被“净化”为一个空白 scaffold。 +你拿到它之后,应该在这个基础上替换成自己的页面、接口、登录逻辑和测试,而不是继续沿用示例业务。 + +## 1. 快速开始 + +```bash +pnpm install +pnpm dev +``` + +常用命令: + +```bash +pnpm dev +pnpm build +pnpm lint +pnpm lint:fix +pnpm generate-routes +pnpm commit +``` + +## 2. 目录结构 + +核心目录说明: + +- `src/routes` + TanStack Router 文件路由目录。你新增页面,优先在这里建文件。 +- `src/lib/api` + 通用请求层。`api-client.ts` 是所有接口调用的基础入口。 +- `src/lib/auth` + 会话初始化、401 清理、refresh token、受保护路由 helper。 +- `src/lib/head` + 页面标题、description、Open Graph、Twitter metadata。 +- `src/lib/query` + TanStack Query 全局默认配置。 +- `src/store` + 全局状态。目前主要是认证状态。 +- `src/styles.css` + 全局 Tailwind 入口。当前项目只保留这一份样式文件。 +- `src/locales` + 多语言文案。 + +## 3. 新项目落地后先改哪里 + +如果你要基于这个模板开一个新项目,建议按这个顺序改: + +### 第一步:改首页 + +先改这个文件: + +- `src/routes/$lang/index.tsx` + +这是当前默认首页。通常你会: + +- 改成你的项目欢迎页 +- 或直接改成 dashboard / 工作台入口 +- 或拆成自己的页面布局 + +同时对应修改多语言文案: + +- `src/locales/zh-CN/common.ts` +- `src/locales/en-US/common.ts` + +### 第二步:改接口基础地址 + +先看这些文件: + +- `.env.development` +- `.env.production` +- `src/vite-env.d.ts` + +至少确认这些变量: + +- `VITE_APP_ENV` +- `VITE_API_BASE_URL` +- `VITE_ENABLE_QUERY_DEVTOOLS` +- `VITE_ENABLE_REQUEST_LOG` + +### 第三步:改全局样式入口 + +当前模板已经切到 Tailwind CSS,并移除了旧的 `App.css` / `index.css`。 + +你主要会改: + +- `src/styles.css` + +这里通常只放: + +- `@import "tailwindcss";` +- 少量全局 base 样式 +- 你的主题变量 + +### 第四步:接你的业务模块 + +建议按“功能模块”建目录,而不是把所有请求、类型和 hooks 混在一起。 + +例如: + +```text +src/features/user/api/user-api.ts +src/features/user/hooks/use-current-user.ts +src/features/user/types/user.ts +src/routes/$lang/users/index.tsx +``` + +### 第五步:接你的登录体系 + +优先改这些文件: + +- `src/store/auth-store.ts` +- `src/lib/auth/auth-session.ts` +- `src/lib/api/api-client.ts` + +## 4. Head / Metadata 怎么用 + +模板已经提供了一个通用 hook: + +- `src/lib/head/document-metadata.ts` + +在页面组件里直接调用: + +```tsx +import { useDocumentMetadata } from '@/lib/head/document-metadata' + +function UserPage() { + useDocumentMetadata({ + title: '用户管理', + description: '用户管理页面', + }) + + return
User Page
+} +``` + +它会自动更新: + +- `document.title` +- `meta[name="description"]` +- `meta[name="robots"]` +- `og:title` +- `og:description` +- `twitter:title` +- `twitter:description` + +适用场景: + +- 列表页标题 +- 详情页标题 +- 登录页 / 404 页 +- 分享卡片基础描述 + +## 5. 登录怎么接 + +这个模板的认证层不是“现成登录系统”,而是“认证骨架”。 + +它已经有: + +- `accessToken` +- `refreshToken` +- `currentUser` +- `status` +- `401` 后清会话 +- refresh token 的可插拔入口 + +核心文件: + +- `src/store/auth-store.ts` +- `src/lib/auth/auth-session.ts` +- `src/lib/api/api-client.ts` + +### 5.1 登录成功后怎么写入会话 + +假设你的登录接口返回: + +```ts +{ + accessToken: string + refreshToken: string + user: { + id: string + name: string + } +} +``` + +那么登录成功后可以这样写: + +```ts +import { useAuthStore } from '@/store/auth-store' + +useAuthStore.getState().startSession({ + accessToken: response.accessToken, + refreshToken: response.refreshToken, + currentUser: response.user, +}) +``` + +### 5.2 刷新 token 怎么接 + +模板里预留了 refresh 的注册入口: + +```ts +import { registerRefreshSessionHandler } from '@/lib/auth/auth-session' + +registerRefreshSessionHandler(async (refreshToken) => { + const response = await fetch('/auth/refresh', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ refreshToken }), + }).then((result) => result.json()) + + return { + accessToken: response.accessToken, + refreshToken: response.refreshToken, + currentUser: response.user ?? null, + } +}) +``` + +当请求返回 `401` 时,请求层会: + +1. 尝试执行这个 refresh handler +2. 如果 refresh 成功,则自动重试原请求一次 +3. 如果 refresh 失败,则清空本地会话 + +### 5.3 当前用户初始化怎么接 + +如果你的项目在刷新页面后,需要根据已有 token 主动请求一次“当前用户信息”,可以注册: + +```ts +import { registerCurrentUserInitializer } from '@/lib/auth/auth-session' + +registerCurrentUserInitializer(async () => { + const response = await fetch('/auth/me').then((result) => result.json()) + + return response.user +}) +``` + +这样在应用启动时,模板会在已有 token 且尚未拿到 `currentUser` 的情况下,自动初始化一次用户信息。 + +## 6. 怎么加受保护路由 + +模板已经提供了路由保护 helper: + +- `src/lib/auth/require-auth.ts` + +用法是,在路由的 `beforeLoad` 里调用它。 + +示例: + +```tsx +import { createFileRoute } from '@tanstack/react-router' + +import { requireAuthenticatedSession } from '@/lib/auth/require-auth' + +export const Route = createFileRoute('/$lang/dashboard')({ + beforeLoad: async () => { + await requireAuthenticatedSession() + }, + component: DashboardPage, +}) + +function DashboardPage() { + return
Dashboard
+} +``` + +它的行为是: + +- 如果当前已经登录,正常进入页面 +- 如果当前未登录,重定向到 `/$lang` + +如果你想把未登录用户导向专门的登录页,可以直接修改: + +- `src/lib/auth/require-auth.ts` + +把重定向目标从 `/$lang` 改成你的登录页路由,例如 `/$lang/login`。 + +## 7. 怎么写第一个接口模块 + +推荐模式是: + +1. 在 `src/features/.../types` 定义类型 +2. 在 `src/features/.../api` 写请求函数 +3. 在 `src/features/.../hooks` 写 query / mutation hook +4. 在 `src/routes/...` 页面里消费 + +示例: + +```ts +// src/features/user/api/user-api.ts +import { api } from '@/lib/api/api-client' + +export interface CurrentUser { + id: string + name: string +} + +export function getCurrentUser() { + return api.get('users/me').then((response) => response.data) +} +``` + +```ts +// src/features/user/hooks/use-current-user.ts +import { useQuery } from '@tanstack/react-query' + +import { getCurrentUser } from '@/features/user/api/user-api' +import type { ApiError } from '@/lib/api/api-error' + +export function useCurrentUserQuery() { + return useQuery>, ApiError>({ + queryKey: ['current-user'], + queryFn: getCurrentUser, + }) +} +``` + +## 8. 路由相关说明 + +这个模板使用 TanStack Router 文件路由。 + +路由目录: + +- `src/routes` + +生成文件: + +- `src/routeTree.gen.ts` + +你通常不需要手改 `src/routeTree.gen.ts`。 +新增、删除、修改路由文件后,执行: + +```bash +pnpm generate-routes +``` + +`pnpm dev` 和 `pnpm build` 也都会自动先生成一次路由树。 + +## 9. 代码规范和提交流程 + +## 9.1 Tailwind 说明 + +当前模板使用的是官方 Vite 接法: + +- `tailwindcss` +- `@tailwindcss/vite` + +核心文件: + +- `vite.config.ts` +- `src/styles.css` + +新增页面时,优先直接写 Tailwind utility class,而不是再恢复成多个分散的 CSS 文件。 + +格式化与 lint: + +```bash +pnpm lint +pnpm lint:fix +pnpm format +``` + +提交规范: + +```bash +pnpm commit +``` + +仓库已经包含: + +- `Biome` +- `Husky` +- `lint-staged` +- `commitlint` +- `Commitizen` + +## 10. 你后续最可能改动的文件 + +如果你刚接手这个模板,优先关注这几个文件: + +- `src/routes/$lang/index.tsx` +- `src/routes/$lang/route.tsx` +- `src/lib/api/api-client.ts` +- `src/lib/auth/auth-session.ts` +- `src/lib/auth/require-auth.ts` +- `src/store/auth-store.ts` +- `src/lib/head/document-metadata.ts` +- `src/locales/zh-CN/common.ts` +- `src/locales/en-US/common.ts` + +## 11. 当前状态 + +当前模板已经验证通过: + +- `pnpm lint` +- `pnpm build` + +如果你继续往前整理,下一步通常就是: + +1. 接入真实登录接口 +2. 增加 `login`、`dashboard`、`403` 等实际页面 +3. 按业务模块拆分 `features` +4. 按项目实际需要补充测试方案 diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..fafe1dd --- /dev/null +++ b/biome.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.12/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": ["**", "!coverage", "!src/routeTree.gen.ts"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "complexity": { + "noUselessTypeConstraint": "error" + }, + "correctness": { + "useExhaustiveDependencies": "warn", + "useHookAtTopLevel": "error" + }, + "style": { + "noNamespace": "error", + "useArrayLiterals": "error", + "useAsConstAssertion": "error", + "useComponentExportOnlyModules": { + "level": "error", + "options": { + "allowConstantExport": true + } + }, + "useConst": "error" + }, + "suspicious": { + "noExplicitAny": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "double", + "semicolons": "asNeeded" + } + }, + "css": { + "parser": { + "tailwindDirectives": true + } + } +} diff --git a/commitlint.config.mjs b/commitlint.config.mjs new file mode 100644 index 0000000..d179c69 --- /dev/null +++ b/commitlint.config.mjs @@ -0,0 +1,3 @@ +export default { + extends: ['@commitlint/config-conventional'], +} diff --git a/docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx b/docs/.~36字花_ 前端开发对接与交互逻辑说明书》.docx new file mode 100644 index 0000000000000000000000000000000000000000..99b9bd35603f65cb19eef57e85395c105bdf42c0 GIT binary patch literal 162 jcmZS2%1kWHE6rmd39vI{F=R3%GL$mpfiX#%NmL8~2a*N@ literal 0 HcmV?d00001 diff --git a/docs/frontend-baseline-requirements.md b/docs/frontend-baseline-requirements.md new file mode 100644 index 0000000..8dd8fc6 --- /dev/null +++ b/docs/frontend-baseline-requirements.md @@ -0,0 +1,439 @@ +# 《36字花》前端开发基线需求文档 + +## 1. 文档目的 + +本文件基于以下两份前期文档整理: + +- `docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx` +- `docs/《36字花》用户前端 (User Portal) UI_UX .docx` + +目标是移除营销型表述和非关键修辞,只保留后续 UI 设计、前端开发、联调和验收所需的核心设计要求、交互逻辑和技术栈建议。 + +## 2. 核心结论 + +### 2.1 产品形态 + +- 产品为实时开奖类游戏前端,主场景是移动端 H5,同时要求兼容桌面端响应式布局。 +- 页面核心是围绕单局倒计时循环运行的 36 宫格下注界面。 +- 前端必须以服务器状态为准,不能依赖客户端本地时间做开奖判断。 + +### 2.2 设计方向 + +- 视觉风格保留为深色背景、高对比强调色的娱乐场风格。 +- 颜色建议以深海蓝/黑为底,青色和金色作为强调色。 +- 视觉参考中的“神鼎、宝箱、卷轴、巨龙、赛博朋克”等描述,只作为美术方向参考,不作为开发阻塞项。 +- 所有文案容器必须支持多语言伸缩,禁止固定宽度写死。 + +### 2.3 交付优先级 + +后续设计与开发应按以下优先级执行: + +1. 玩法状态正确 +2. 倒计时与服务端同步正确 +3. 下单、封盘、开奖、派彩状态切换正确 +4. 移动端可用性与性能达标 +5. 动效和视觉强化 + +## 3. 推荐技术栈 + +## 3.1 前端框架 + +- `React + TypeScript + Vite` +- 原因:移动 H5 交互复杂、状态密集、联调频繁,Vite 启动快,React 生态成熟,TypeScript 适合管理复杂状态和接口约束。 + +## 3.2 路由与页面组织 + +- `React Router` +- 页面结构建议按大厅主界面、公告弹窗、规则面板、用户侧滑面板拆分。 + +## 3.3 状态管理 + +- `Zustand` 作为全局业务状态容器 +- `XState` 或等价状态机方案用于维护单局生命周期状态 +- 原因:本项目存在明确的 4 段式回合状态机、局内局外状态切换、自动托管覆盖态、网络重连恢复,单纯依赖局部状态容易错乱。 + +建议状态拆分: + +- `roundStore`:期号、阶段、倒计时、开奖数据 +- `betStore`:选中格子、锁定格子、筹码、总注额、按钮状态 +- `userStore`:余额、连赢状态、下注上限、公告状态 +- `uiStore`:弹窗、抽屉、Toast、动画开关、自动托管蒙层 + +## 3.4 数据请求与实时通信 + +- `TanStack Query`:管理普通 HTTP 请求、缓存与重拉 +- `WebSocket`:接收当前局状态、开奖、余额变动、派彩、自动托管进度 +- 如果后端使用 Socket.IO,则前端改用 `socket.io-client` + +## 3.5 样式与动画 + +- 页面布局:`Tailwind CSS` +- 复杂状态样式:`CSS Modules` 或同级方案 +- 盘面高频动画:优先 `CSS Animation / Transition / SVG` +- 全屏粒子特效:`PixiJS` 或 `tsParticles` + +约束: + +- 禁止用 JS 逐帧操作 DOM 做 36 宫格边框动画 +- 动效必须优先使用合成层友好的属性,如 `transform`、`opacity`、`filter` + +## 3.6 国际化与时间处理 + +- `react-i18next` +- `dayjs` + +说明: + +- `dayjs` 只用于显示格式化,不用于决定回合状态。 +- 回合倒计时必须基于服务端时间戳推导。 + +## 3.7 测试与质量保障 + +- 单元测试:按项目需要自行接入 +- 组件测试:按项目需要自行接入 +- 端到端测试:`Playwright` +- 线上监控:建议接入 `Sentry` + +## 4. 页面与模块范围 + +## 4.1 主游戏界面 + +必须包含以下区域: + +- 顶部导航栏 +- 开奖展示区 +- 中控信息区 +- 36 宫格下注区 +- 筹码与操作栏 +- 右侧历史区 +- 底部单双走势区 + +## 4.2 次级界面 + +必须包含以下弹层或侧栏: + +- 强制公告弹窗 +- 自动托管运行浮层 +- 玩法与规则面板 +- 用户 Dashboard 侧滑面板 + +## 5. 单局生命周期状态机 + +后台可配置单局时长,前端默认按 30 秒一局建模,并支持服务端参数覆盖。 + +### 5.1 游戏阶段枚举 + +- `BETTING`:下注期 +- `LOCKED`:封盘锁定 +- `DRAWING`:算票与开奖 +- `PAYOUT`:派彩与收尾 + +### 5.2 各阶段规则 + +`BETTING` + +- 允许选格子、换筹码、清除未确认、重复上一注、确认下注、开启自动托管。 +- 显示倒计时。 +- 跑马灯处于常规速度。 + +`LOCKED` + +- 到达封盘时间点后,前端必须立即锁盘,不等待后端响应。 +- 所有点击事件、按钮、输入行为全部禁用。 +- 所有 `PRE_SELECTED` 未确认格子必须清空。 +- 显示“停止下注”提示。 + +`DRAWING` + +- 等待 WebSocket 推送开奖结果。 +- 收到开奖后,盘面跑马灯加速。 +- 最终定格中奖格子,进入中奖态。 + +`PAYOUT` + +- 接收余额和连赢状态更新。 +- 播放中奖特效。 +- 更新历史和走势。 +- 为下一局做状态重置。 + +## 6. 36 宫格下注区需求 + +## 6.1 网格结构 + +- 固定为 `6 x 6` +- 每个格子包含:编号、动物名、动物图 +- 格子需要支持轻量分组提示,用于区分业务分类,但不影响下注逻辑 + +## 6.2 单格状态枚举 + +建议统一实现 `CellStatus`: + +- `IDLE`:默认闲置 +- `MARQUEE`:跑马灯焦点 +- `HOVER`:PC 悬浮 +- `PRE_SELECTED`:已选未确认 +- `LOCKED`:已确认下注 +- `DISABLED`:不可操作 +- `ERROR`:错误反馈 +- `WINNING`:中奖高亮 +- `LOSER`:未中奖弱化 +- `AUTO_ACTIVE`:自动托管执行态 + +## 6.3 单格交互规则 + +- 玩家单局最多选择 5 个格子。 +- `PRE_SELECTED + LOCKED` 的总数不得超过 5。 +- 达到 5 个后,其余可选格子全部置为 `DISABLED`。 +- 点击第 6 个格子时,不得选中,必须触发错误反馈。 +- 余额不足或超限点击时,必须触发错误反馈。 +- 已确认格子在本局内不可取消。 +- 若本局尚未封盘且未满 5 个,允许继续追加下注并再次确认。 + +## 7. 筹码与下注逻辑 + +## 7.1 筹码区 + +标准筹码档位: + +- `1` +- `5` +- `10` +- `25` +- `50` +- `100` + +## 7.2 统一下注金额同步 + +- 全局维护 `currentChipValue` +- 已处于 `PRE_SELECTED` 的所有格子,其显示筹码必须跟随 `currentChipValue` 实时同步 +- 筹码切换后,总下注金额必须同步刷新 + +## 7.3 连赢上限与余额限制 + +需要实时校验: + +- `selectedCount * currentChipValue <= streakMaxBetLimit` +- `totalBetAmount <= balance` + +当不满足时: + +- 对应不可选的大额筹码必须禁用 +- 确认下注按钮进入错误态或禁用态 +- 格子点击需给出明确错误反馈 + +## 8. 确认下注主按钮状态机 + +按钮需要独立维护以下 4 个状态: + +- `DISABLED`:未选任何格子 +- `READY`:已选格子且余额足够,可点击提交 +- `ERROR`:总下注金额大于余额,文案显示“余额不足” +- `SUCCESS`:下注成功后维持成功态直到本局结束 + +约束: + +- 禁止自动提交 +- 必须由用户手动点击确认 +- 成功后已确认格子不可撤销 + +## 9. 自动托管需求 + +## 9.1 功能行为 + +- 调用自动托管接口提交:下注格子、金额、局数 +- 前端进入 `AUTO_MODE` +- 主键盘和筹码区整体进入不可编辑状态 +- 自动托管中的目标格子显示 `AUTO_ACTIVE` +- 前端展示当前进度,例如 `12 / 50` +- 必须提供显式“停止托管”操作 + +## 9.2 视觉与交互约束 + +- 使用全局玻璃遮罩阻断手动操作 +- 自动托管目标格子需要穿透遮罩高亮显示 +- 自动托管态必须与手动锁定态有视觉区分 + +## 10. 中控信息区需求 + +必须展示以下信息: + +- 当前余额 +- 当前赔率 +- 当前连赢次数 +- 连赢限额提示 +- 当前倒计时 +- 当前期号 +- 当前阶段状态,如 `OPEN` / `CLOSED` + +倒计时要求: + +- 最后 5 秒需要强化提示 +- 倒计时只展示服务器推导结果 + +## 11. 历史与走势需求 + +## 11.1 右侧历史区 + +- 显示最近开奖记录 +- 每条至少包含时间、号码、动物名 +- 最新一条高亮 +- 需要支持滚动 + +## 11.2 底部单双走势 + +- 保留最近 30 局 +- 奇数显示红色圆点 +- 偶数显示蓝色圆点 +- 新增一条数据时,最后一个点需要入场动画 + +## 12. 弹窗与侧栏需求 + +## 12.1 强制公告弹窗 + +功能要求: + +- 首屏进入时请求公告接口 +- 若存在未读公告,必须强制弹出 +- 不允许点击遮罩关闭 +- 不允许提供右上角关闭按钮 +- 勾选“已阅读并同意”前,进入游戏按钮必须禁用 +- 关闭后要记录已读状态 +- 无新公告时,不重复弹出 + +布局要求: + +- 支持图文内容 +- 内容超长时支持滚动 +- 移动端建议复选框和主按钮上下排列,避免多语言挤压 + +## 12.2 规则面板 + +- 提供玩法规则、赔率说明、连胜机制、大奖说明 +- 允许分页或滚动 +- 结构化展示,不得纯长文堆叠 + +## 12.3 用户 Dashboard 侧滑面板 + +至少包含: + +- 资产信息 +- 充值入口 +- 提现入口与手续费说明 +- 最近 1 个月投注历史 +- 站内信列表 +- 公告信箱入口 + +## 13. 异常与容错要求 + +## 13.1 本地锁盘优先 + +- 到达封盘时间点时,前端必须立刻锁盘 +- 即使网络延迟,也不能继续允许下注交互 + +## 13.2 压秒点击失败处理 + +场景: + +- 用户在接近封盘时点击确认 +- 请求发出,但服务器实际已封盘 + +前端处理: + +- 先进入锁盘和加载态 +- 若稍后收到失败响应,必须撤销未成功下注的本地状态 +- 明确提示“网络延迟,下注失败,未扣款” +- 严禁误显示为下注成功 + +## 13.3 断线重连恢复 + +触发条件: + +- 页面重新可见 +- WebSocket 断开后重连 + +前端处理: + +- 立即调用全量状态接口重新同步 +- 重置倒计时、期号、余额、连赢、走势、当前盘面状态 +- 禁止依赖本地累计时间继续运行 + +## 13.4 余额不足场景 + +- 确认按钮进入错误态 +- 充值入口需要有明显引导 +- 相关格子或筹码点击时给出即时反馈 + +## 14. 接口与事件依赖 + +以下为前端开发所需的最小接口能力,命名可与后端协商,但能力不可缺失。 + +## 14.1 HTTP 接口 + +- `GET /api/user/announcement` +- `GET /api/game/current_status` +- `POST /api/bet/place` +- `POST /api/auto_spin` +- `POST /api/announcement/read` + +## 14.2 WebSocket 事件 + +- `round_status`:当前阶段、期号、服务器时间、剩余时间 +- `draw_result`:开奖结果、中奖格子 +- `balance_changed`:余额变化 +- `streak_changed`:连赢状态与限额变化 +- `trend_updated`:最新走势数据 +- `auto_spin_progress`:自动托管局数进度 + +## 15. 性能与实现约束 + +- 移动端目标帧率:`60 FPS` +- 36 宫格状态切换不得出现明显掉帧 +- 高亮、缩放、呼吸、闪烁等动画优先使用 GPU 友好属性 +- 避免大面积重排和重绘 +- 长列表区域应考虑虚拟化或分段渲染 +- 全局状态更新必须避免引起整盘 36 格不必要重渲染 + +## 16. 多语言与响应式要求 + +- 所有按钮、标签、提示文案必须支持长度扩展 +- 不允许固定像素宽度导致文案截断 +- 文本区域需预留至少 40% 的横向伸缩空间 +- 设计需优先保证移动端单手操作 +- PC 端可补充 Hover 态,移动端不依赖 Hover 完成交互 + +## 17. 开发验收基线 + +满足以下条件才可进入测试或交付: + +- 单局状态机完整跑通 +- 封盘时前端能本地立即锁盘 +- 服务端时间同步准确 +- 下注数量限制与统一筹码机制无误 +- 余额与连赢上限限制生效 +- 自动托管可启动、运行、停止 +- 公告弹窗强阻断逻辑正确 +- 断线重连后状态可恢复 +- 走势与历史区数据更新正确 +- 移动端核心流程可稳定使用 + +## 18. 建议的开发顺序 + +1. 搭建项目骨架、路由、状态层、接口层 +2. 先实现 30 秒回合状态机和服务端时间同步 +3. 完成 36 宫格、筹码区、确认按钮的核心下注流程 +4. 接入开奖、派彩、历史、走势 +5. 实现公告弹窗、规则面板、用户侧栏 +6. 实现自动托管 +7. 最后补齐粒子特效、强化动画和视觉细节 + +## 19. 明确降级为“视觉参考”的内容 + +以下内容不应阻塞前端逻辑开发,可在视觉设计阶段再细化: + +- 神坛主体到底是神鼎、宝箱还是法槌 +- 是否采用卷轴、金属边框或全息科技框 +- Jackpot 动画具体表现形式 +- 动物头像是否 3D、半写实或插画风 +- 特效音、粒子素材、品牌化图标样式 + +以上内容只影响视觉表现,不影响本文件定义的交互和功能边界。 diff --git a/docs/《36字花》用户前端 (User Portal) UI_UX .docx b/docs/《36字花》用户前端 (User Portal) UI_UX .docx new file mode 100644 index 0000000000000000000000000000000000000000..64ebf8c92008f1b9c99c9b7b7310967216c751fc GIT binary patch literal 195519 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 z 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 U7nG8L=7KO@U?g{`pwqDb103*`ApigX literal 0 HcmV?d00001 diff --git a/docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx b/docs/《_36字花_ 前端开发对接与交互逻辑说明书》.docx new file mode 100644 index 0000000000000000000000000000000000000000..ebe8a025100df14da17814d7930ac7ccbab02986 GIT binary patch literal 10287 zcmaia1yo(hvNrA--2D&;9^BpCHMqOG6WrZhgG+FC4ess)cMb4h-uyF}S?}Jz&g!$y z-n+iNs;f)-bd{_GC>Sab6ciMYykDXw&~JqD_FF^1+RDMu%0XMv)yB|Xi^j#$;(Pp< zRW}_{fHv9XcX2o_MJ1t)i7fpQUv3|B>kp+DQLV6F8_od02)tyJ@fztV84nh0Db)29 zW6aSL5Za-p^vGB)c;PpW6x=G-4|#*p@hsoq@x`k_QNtcAzK8i>jk{3^37}@>3$FSo zs0Kh~CQy{O7}3QQjVk}ZFfShK(BiJ=99rf>e8xIY%h zTAKgLQzs_-gll0T*x3SU@hDLt@T4k~|I4He`$D4fK^CR>_blIeR`*1m-{< zKA98145+Ev*Zd}UHf)=1a22Z*kE^vZ<;jYU_d!!>0n6HqbMZt*G|-)i@Dkq6(pE9O z<|RC@b|lYGGLjO^&jCwkqA>54C3{r+*`L{}L%W4m^p^+L=Eo=)U*2As{kv*o*5YmA ziHf#!J~*H@r{bh%9;+8vSqVre{-(`WabO@IVsIcJ+5fl{uy0GDZD(jo4nm~Kyxk^~LX->ki%{@#~3 zG4OK%`%hJ3GcIxK&yS$D1}c{B=DXyeKT?b^a0h9qx{l@CVV`7=nG)0Oe zJ4$vdaJaZU42_p)t$Z>X)I66JW5_pCd(&Sv0wcvKWL0;TcyskvAJFpBut>)Fy%m~Y zsF-8*c>81yzeaOCfu|w9tA@69I(6%9;*uc$O*Kew90u0;UP6OytA~7oQ}KRKna6xQg!#+N6Bhh6;yml=GuxwdQAN#Tm0J-MExhF`^AV_` z%;AxH%G?C=hol^B3IZ_5C>*1?xE~wrbR&&@EHJJC^M-{rl0>dOWQADWjBH^^I@
    0+b;k*#@CTzpo_|Gei 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..bb56a27 --- /dev/null +++ b/index.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + React SPA Template + + +
    + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..4ee3e0c --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "react-spa-template", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "commit": "cz", + "dev": "pnpm generate-routes && vite", + "build": "pnpm generate-routes && tsc -b && vite build", + "generate-routes": "tsr generate", + "lint": "biome check .", + "lint:fix": "biome check --write .", + "format": "biome format --write .", + "prepare": "husky", + "preview": "vite preview" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,json,jsonc,css,md,html}": [ + "biome check --write" + ] + }, + "config": { + "commitizen": { + "path": "cz-conventional-changelog" + } + }, + "dependencies": { + "@tanstack/react-query": "^5.99.0", + "@tanstack/react-query-devtools": "^5.99.0", + "@tanstack/react-router": "^1.168.22", + "i18next": "^26.0.5", + "ky": "^2.0.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-i18next": "^17.0.3", + "zustand": "^5.0.12" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@biomejs/biome": "2.4.12", + "@commitlint/cli": "20.5.0", + "@commitlint/config-conventional": "20.5.0", + "@rolldown/plugin-babel": "^0.2.2", + "@tailwindcss/vite": "^4.2.2", + "@tanstack/router-cli": "^1.166.33", + "@tanstack/router-plugin": "^1.167.22", + "@types/babel__core": "^7.20.5", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "babel-plugin-react-compiler": "^1.0.0", + "commitizen": "4.3.1", + "cz-conventional-changelog": "3.3.0", + "husky": "9.1.7", + "lint-staged": "16.4.0", + "tailwindcss": "^4.2.2", + "typescript": "~6.0.2", + "vite": "^8.0.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..7d4d468 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3687 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tanstack/react-query': + specifier: ^5.99.0 + version: 5.99.0(react@19.2.5) + '@tanstack/react-query-devtools': + specifier: ^5.99.0 + version: 5.99.0(@tanstack/react-query@5.99.0(react@19.2.5))(react@19.2.5) + '@tanstack/react-router': + specifier: ^1.168.22 + version: 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + i18next: + specifier: ^26.0.5 + version: 26.0.5(typescript@6.0.2) + ky: + specifier: ^2.0.1 + version: 2.0.1 + react: + specifier: ^19.2.4 + version: 19.2.5 + react-dom: + specifier: ^19.2.4 + version: 19.2.5(react@19.2.5) + react-i18next: + specifier: ^17.0.3 + version: 17.0.3(i18next@26.0.5(typescript@6.0.2))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.2) + zustand: + specifier: ^5.0.12 + version: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.0 + '@biomejs/biome': + specifier: 2.4.12 + version: 2.4.12 + '@commitlint/cli': + specifier: 20.5.0 + version: 20.5.0(@types/node@24.12.2)(conventional-commits-parser@6.4.0)(typescript@6.0.2) + '@commitlint/config-conventional': + specifier: 20.5.0 + version: 20.5.0 + '@rolldown/plugin-babel': + specifier: ^0.2.2 + version: 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.15)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@tailwindcss/vite': + specifier: ^4.2.2 + version: 4.2.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@tanstack/router-cli': + specifier: ^1.166.33 + version: 1.166.33 + '@tanstack/router-plugin': + specifier: ^1.167.22 + version: 1.167.22(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/node': + specifier: ^24.12.2 + version: 24.12.2 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.15)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 + commitizen: + specifier: 4.3.1 + version: 4.3.1(@types/node@24.12.2)(typescript@6.0.2) + cz-conventional-changelog: + specifier: 3.3.0 + version: 3.3.0(@types/node@24.12.2)(typescript@6.0.2) + husky: + specifier: 9.1.7 + version: 9.1.7 + lint-staged: + specifier: 16.4.0 + version: 16.4.0 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + typescript: + specifier: ~6.0.2 + version: 6.0.2 + vite: + specifier: ^8.0.4 + version: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + +packages: + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@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/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.4.12': + resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.12': + resolution: {integrity: sha512-BnMU4Pc3ciEVteVpZ0BK33MLr7X57F5w1dwDLDn+/iy/yTrA4Q/N2yftidFtsA4vrDh0FMXDpacNV/Tl3fbmng==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.12': + resolution: {integrity: sha512-x9uJ0bI1rJsWICp3VH8w/5PnAVD3A7SqzDpbrfoUQX1QyWrK5jSU4fRLo/wSgGeplCivbxBRKmt5Xq4/nWvq8A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.12': + resolution: {integrity: sha512-FhfpkAAlKL6kwvcVap0Hgp4AhZmtd3YImg0kK1jd7C/aSoh4SfsB2f++yG1rU0lr8Y5MCFJrcSkmssiL9Xnnig==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.4.12': + resolution: {integrity: sha512-tOwuCuZZtKi1jVzbk/5nXmIsziOB6yqN8c9r9QM0EJYPU6DpQWf11uBOSCfFKKM4H3d9ZoarvlgMfbcuD051Pw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.4.12': + resolution: {integrity: sha512-dwTIgZrGutzhkQCuvHynCkyW6hJxUuyZqKKO0YNfaS2GUoRO+tOvxXZqZB6SkWAOdfZTzwaw8IEdUnIkHKHoew==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.4.12': + resolution: {integrity: sha512-8pFeAnLU9QdW9jCIslB/v82bI0lhBmz2ZAKc8pVMFPO0t0wAHsoEkrUQUbMkIorTRIjbqyNZHA3lEXavsPWYSw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.4.12': + resolution: {integrity: sha512-B0DLnx0vA9ya/3v7XyCaP+/lCpnbWbMOfUFFve+xb5OxyYvdHaS55YsSddr228Y+JAFk58agCuZTsqNiw2a6ig==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.12': + resolution: {integrity: sha512-yMckRzTyZ83hkk8iDFWswqSdU8tvZxspJKnYNh7JZr/zhZNOlzH13k4ecboU6MurKExCe2HUkH75pGI/O2JwGA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@commitlint/cli@20.5.0': + resolution: {integrity: sha512-yNkyN/tuKTJS3wdVfsZ2tXDM4G4Gi7z+jW54Cki8N8tZqwKBltbIvUUrSbT4hz1bhW/h0CdR+5sCSpXD+wMKaQ==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@20.5.0': + resolution: {integrity: sha512-t3Ni88rFw1XMa4nZHgOKJ8fIAT9M2j5TnKyTqJzsxea7FUetlNdYFus9dz+MhIRZmc16P0PPyEfh6X2d/qw8SA==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@20.5.0': + resolution: {integrity: sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@20.5.0': + resolution: {integrity: sha512-IpHqAUesBeW1EDDdjzJeaOxU9tnogLAyXLRBn03SHlj1SGENn2JGZqSWGkFvBJkJzfXAuCNtsoYzax+ZPS+puw==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@20.0.0': + resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} + engines: {node: '>=v18'} + + '@commitlint/format@20.5.0': + resolution: {integrity: sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@20.5.0': + resolution: {integrity: sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==} + engines: {node: '>=v18'} + + '@commitlint/lint@20.5.0': + resolution: {integrity: sha512-jiM3hNUdu04jFBf1VgPdjtIPvbuVfDTBAc6L98AWcoLjF5sYqkulBHBzlVWll4rMF1T5zeQFB6r//a+s+BBKlA==} + engines: {node: '>=v18'} + + '@commitlint/load@20.5.0': + resolution: {integrity: sha512-sLhhYTL/KxeOTZjjabKDhwidGZan84XKK1+XFkwDYL/4883kIajcz/dZFAhBJmZPtL8+nBx6bnkzA95YxPeDPw==} + engines: {node: '>=v18'} + + '@commitlint/message@20.4.3': + resolution: {integrity: sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==} + engines: {node: '>=v18'} + + '@commitlint/parse@20.5.0': + resolution: {integrity: sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==} + engines: {node: '>=v18'} + + '@commitlint/read@20.5.0': + resolution: {integrity: sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@20.5.0': + resolution: {integrity: sha512-3SHPWUW2v0tyspCTcfSsYml0gses92l6TlogwzvM2cbxDgmhSRc+fldDjvGkCXJrjSM87BBaWYTPWwwyASZRrg==} + engines: {node: '>=v18'} + + '@commitlint/rules@20.5.0': + resolution: {integrity: sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@20.0.0': + resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} + engines: {node: '>=v18'} + + '@commitlint/top-level@20.4.3': + resolution: {integrity: sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==} + engines: {node: '>=v18'} + + '@commitlint/types@20.5.0': + resolution: {integrity: sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==} + engines: {node: '>=v18'} + + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.4.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@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==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.124.0': + resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==} + + '@rolldown/binding-android-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + + '@rolldown/pluginutils@1.0.0-rc.15': + resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + 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.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/history@1.161.6': + resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} + engines: {node: '>=20.19'} + + '@tanstack/query-core@5.99.0': + resolution: {integrity: sha512-3Jv3WQG0BCcH7G+7lf/bP8QyBfJOXeY+T08Rin3GZ1bshvwlbPt7NrDHMEzGdKIOmOzvIQmxjk28YEQX60k7pQ==} + + '@tanstack/query-devtools@5.99.0': + resolution: {integrity: sha512-m4ufXaJ8FjWXw7xDtyzE/6fkZAyQFg9WrbMrUpt8ZecRJx58jiFOZ2lxZMphZdIpAnIeto/S8stbwLKLusyckQ==} + + '@tanstack/react-query-devtools@5.99.0': + resolution: {integrity: sha512-CqqX7LCU9yOfCY/vBURSx2YSD83ryfX+QkfkaKionTfg1s2Hdm572Ro99gW3QPoJjzvsj1HM4pnN4nbDy3MXKA==} + peerDependencies: + '@tanstack/react-query': ^5.99.0 + react: ^18 || ^19 + + '@tanstack/react-query@5.99.0': + resolution: {integrity: sha512-OY2bCqPemT1LlqJ8Y2CUau4KELnIhhG9Ol3ZndPbdnB095pRbPo1cHuXTndg8iIwtoHTgwZjyaDnQ0xD0mYwAw==} + peerDependencies: + react: ^18 || ^19 + + '@tanstack/react-router@1.168.22': + resolution: {integrity: sha512-W2LyfkfJtDCf//jOjZeUBWwOVl8iDRVTECpGHa2M28MT3T5/VVnjgicYNHR/ax0Filk1iU67MRjcjHheTYvK1Q==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + 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/router-cli@1.166.33': + resolution: {integrity: sha512-gCWBbCVkfT2OzgxQVV275BjRYKvfh7SEKD73ATHWyLE8ifm8/O2700roObVHUy+Y0jJT91Am0UkjsES0O2jqzw==} + engines: {node: '>=20.19'} + hasBin: true + + '@tanstack/router-core@1.168.15': + resolution: {integrity: sha512-Wr0424NDtD8fT/uALobMZ9DdcfsTyXtW5IPR++7zvW8/7RaIOeaqXpVDId8ywaGtqPWLWOfaUg2zUtYtukoXYA==} + engines: {node: '>=20.19'} + hasBin: true + + '@tanstack/router-generator@1.166.32': + resolution: {integrity: sha512-VuusKwEXcgKq+myq1JQfZogY8scTXIIeFls50dJ/UXgCXWp5n14iFreYNlg41wURcak2oA3M+t2TVfD0xUUD6g==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.167.22': + resolution: {integrity: sha512-wYPzIvBK8bcmXVUpZfSgGBXOrfBAdF4odKevz6rejio5rEd947NtKDF5R7eYdwlAOmRqYpLJnJ1QHkc5t8bY4w==} + engines: {node: '>=20.19'} + hasBin: true + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.168.21 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.161.6': + resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} + engines: {node: '>=20.19'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} + engines: {node: '>=20.19'} + hasBin: true + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + + '@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.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.19: + resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001788: + resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commitizen@4.3.1: + resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} + engines: {node: '>= 12'} + hasBin: true + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} + engines: {node: '>=18'} + + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} + engines: {node: '>=18'} + + conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} + engines: {node: '>=18'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + electron-to-chromium@1.5.338: + resolution: {integrity: sha512-KVQQ3xko9/coDX3qXLUEEbqkKT8L+1DyAovrtu0Khtrt9wjSZ+7CZV4GVzxFy9Oe1NbrIU1oVXCwHJruIA1PNg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + git-raw-commits@5.0.1: + resolution: {integrity: sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==} + engines: {node: '>=18'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + i18next@26.0.5: + resolution: {integrity: sha512-9uHb4T27TdV36phJXcbpnRPt5yzAfqHXVrdASvmHZyPuZJtrLythd+GyXhiaHV5LlpuuskbAqhwPjmfTbKbi8w==} + peerDependencies: + typescript: ^5 || ^6 + peerDependenciesMeta: + typescript: + optional: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isbot@5.1.39: + resolution: {integrity: sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + ky@2.0.1: + resolution: {integrity: sha512-HJPEjEpQPZQ5M3G5eu90/LWZDwysCnvqcfbLvq9FUvfizBZRi58WEixswyyI32LOLcFQd43w7kcfgkCPFxDt/Q==} + engines: {node: '>=22'} + + 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'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@16.4.0: + resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} + engines: {node: '>=20.17'} + hasBin: true + + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} + engines: {node: '>=20.0.0'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + 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'} + + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + peerDependencies: + react: ^19.2.5 + + react-i18next@17.0.3: + resolution: {integrity: sha512-x4xjvUNZ56T+zfXWNedNnCET9Xq1IBYWX7IsWo5cCQ/RT+Rm7GWqt0h9PShFi4IhyMnsdiu1C6Jc4DE+/S3PFQ==} + peerDependencies: + i18next: '>= 26.0.1' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 || ^6 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown@1.0.0-rc.15: + resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + seroval-plugins@1.5.2: + resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + engines: {node: '>=10'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + 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 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@8.0.8: + resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zustand@5.0.12: + resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} + 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 + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.29.2': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@biomejs/biome@2.4.12': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.12 + '@biomejs/cli-darwin-x64': 2.4.12 + '@biomejs/cli-linux-arm64': 2.4.12 + '@biomejs/cli-linux-arm64-musl': 2.4.12 + '@biomejs/cli-linux-x64': 2.4.12 + '@biomejs/cli-linux-x64-musl': 2.4.12 + '@biomejs/cli-win32-arm64': 2.4.12 + '@biomejs/cli-win32-x64': 2.4.12 + + '@biomejs/cli-darwin-arm64@2.4.12': + optional: true + + '@biomejs/cli-darwin-x64@2.4.12': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.12': + optional: true + + '@biomejs/cli-linux-arm64@2.4.12': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.12': + optional: true + + '@biomejs/cli-linux-x64@2.4.12': + optional: true + + '@biomejs/cli-win32-arm64@2.4.12': + optional: true + + '@biomejs/cli-win32-x64@2.4.12': + optional: true + + '@commitlint/cli@20.5.0(@types/node@24.12.2)(conventional-commits-parser@6.4.0)(typescript@6.0.2)': + dependencies: + '@commitlint/format': 20.5.0 + '@commitlint/lint': 20.5.0 + '@commitlint/load': 20.5.0(@types/node@24.12.2)(typescript@6.0.2) + '@commitlint/read': 20.5.0(conventional-commits-parser@6.4.0) + '@commitlint/types': 20.5.0 + tinyexec: 1.1.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - conventional-commits-filter + - conventional-commits-parser + - typescript + + '@commitlint/config-conventional@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + conventional-changelog-conventionalcommits: 9.3.1 + + '@commitlint/config-validator@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + ajv: 8.18.0 + + '@commitlint/ensure@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@20.0.0': {} + + '@commitlint/format@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + picocolors: 1.1.1 + + '@commitlint/is-ignored@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + semver: 7.7.4 + + '@commitlint/lint@20.5.0': + dependencies: + '@commitlint/is-ignored': 20.5.0 + '@commitlint/parse': 20.5.0 + '@commitlint/rules': 20.5.0 + '@commitlint/types': 20.5.0 + + '@commitlint/load@20.5.0(@types/node@24.12.2)(typescript@6.0.2)': + dependencies: + '@commitlint/config-validator': 20.5.0 + '@commitlint/execute-rule': 20.0.0 + '@commitlint/resolve-extends': 20.5.0 + '@commitlint/types': 20.5.0 + cosmiconfig: 9.0.1(typescript@6.0.2) + cosmiconfig-typescript-loader: 6.3.0(@types/node@24.12.2)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2) + is-plain-obj: 4.1.0 + lodash.mergewith: 4.6.2 + picocolors: 1.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@20.4.3': {} + + '@commitlint/parse@20.5.0': + dependencies: + '@commitlint/types': 20.5.0 + conventional-changelog-angular: 8.3.1 + conventional-commits-parser: 6.4.0 + + '@commitlint/read@20.5.0(conventional-commits-parser@6.4.0)': + dependencies: + '@commitlint/top-level': 20.4.3 + '@commitlint/types': 20.5.0 + git-raw-commits: 5.0.1(conventional-commits-parser@6.4.0) + minimist: 1.2.8 + tinyexec: 1.1.1 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + '@commitlint/resolve-extends@20.5.0': + dependencies: + '@commitlint/config-validator': 20.5.0 + '@commitlint/types': 20.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.2.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@20.5.0': + dependencies: + '@commitlint/ensure': 20.5.0 + '@commitlint/message': 20.4.3 + '@commitlint/to-lines': 20.0.0 + '@commitlint/types': 20.5.0 + + '@commitlint/to-lines@20.0.0': {} + + '@commitlint/top-level@20.4.3': + dependencies: + escalade: 3.2.0 + + '@commitlint/types@20.5.0': + dependencies: + conventional-commits-parser: 6.4.0 + picocolors: 1.1.1 + + '@conventional-changelog/git-client@2.7.0(conventional-commits-parser@6.4.0)': + dependencies: + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 + semver: 7.7.4 + optionalDependencies: + conventional-commits-parser: 6.4.0 + + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@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 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.124.0': {} + + '@rolldown/binding-android-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.15': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.15': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.15': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15': + optional: true + + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.15)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@babel/core': 7.29.0 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.15 + optionalDependencies: + '@babel/runtime': 7.29.2 + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + + '@rolldown/pluginutils@1.0.0-rc.15': {} + + '@rolldown/pluginutils@1.0.0-rc.7': {} + + '@simple-libs/child-process-utils@1.0.2': + dependencies: + '@simple-libs/stream-utils': 1.2.0 + + '@simple-libs/stream-utils@1.2.0': {} + + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/vite@4.2.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + + '@tanstack/history@1.161.6': {} + + '@tanstack/query-core@5.99.0': {} + + '@tanstack/query-devtools@5.99.0': {} + + '@tanstack/react-query-devtools@5.99.0(@tanstack/react-query@5.99.0(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/query-devtools': 5.99.0 + '@tanstack/react-query': 5.99.0(react@19.2.5) + react: 19.2.5 + + '@tanstack/react-query@5.99.0(react@19.2.5)': + dependencies: + '@tanstack/query-core': 5.99.0 + react: 19.2.5 + + '@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.168.15 + isbot: 5.1.39 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@tanstack/react-store@0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.5) + + '@tanstack/router-cli@1.166.33': + dependencies: + '@tanstack/router-generator': 1.166.32 + chokidar: 3.6.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-core@1.168.15': + dependencies: + '@tanstack/history': 1.161.6 + cookie-es: 3.1.1 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + + '@tanstack/router-generator@1.166.32': + dependencies: + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + magic-string: 0.30.21 + prettier: 3.8.3 + tsx: 4.21.0 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.22(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.161.6': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.16 + transitivePeerDependencies: + - supports-color + + '@tanstack/store@0.9.3': {} + + '@tanstack/virtual-file-routes@1.161.7': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.15)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + optionalDependencies: + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(@babel/runtime@7.29.2)(rolldown@1.0.0-rc.15)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + babel-plugin-react-compiler: 1.0.0 + + acorn@8.16.0: {} + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + array-ify@1.0.0: {} + + at-least-node@1.0.0: {} + + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.0 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.19: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + brace-expansion@1.1.14: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.19 + caniuse-lite: 1.0.30001788 + electron-to-chromium: 1.5.338 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + cachedir@2.3.0: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001788: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.0 + + cli-width@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@14.0.3: {} + + commitizen@4.3.1(@types/node@24.12.2)(typescript@6.0.2): + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0(@types/node@24.12.2)(typescript@6.0.2) + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + conventional-changelog-angular@8.3.1: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@9.3.1: + dependencies: + compare-func: 2.0.0 + + conventional-commit-types@3.0.0: {} + + conventional-commits-parser@6.4.0: + dependencies: + '@simple-libs/stream-utils': 1.2.0 + meow: 13.2.0 + + convert-source-map@2.0.0: {} + + cookie-es@3.1.1: {} + + cosmiconfig-typescript-loader@6.3.0(@types/node@24.12.2)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2): + dependencies: + '@types/node': 24.12.2 + cosmiconfig: 9.0.1(typescript@6.0.2) + jiti: 2.6.1 + typescript: 6.0.2 + + cosmiconfig@9.0.1(typescript@6.0.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.2 + + csstype@3.2.3: {} + + cz-conventional-changelog@3.3.0(@types/node@24.12.2)(typescript@6.0.2): + dependencies: + chalk: 2.4.2 + commitizen: 4.3.1(@types/node@24.12.2)(typescript@6.0.2) + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.5 + optionalDependencies: + '@commitlint/load': 20.5.0(@types/node@24.12.2)(typescript@6.0.2) + transitivePeerDependencies: + - '@types/node' + - typescript + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dedent@0.7.0: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + detect-file@1.0.0: {} + + detect-indent@6.1.0: {} + + detect-libc@2.1.2: {} + + diff@8.0.4: {} + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + electron-to-chromium@1.5.338: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.2 + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + eventemitter3@5.0.4: {} + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.0: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-node-modules@2.1.3: + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + + find-root@1.1.0: {} + + findup-sync@4.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + resolve-dir: 1.0.1 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.5.0: {} + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-raw-commits@5.0.1(conventional-commits-parser@6.4.0): + dependencies: + '@conventional-changelog/git-client': 2.7.0(conventional-commits-parser@6.4.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + graceful-fs@4.2.11: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + husky@9.1.7: {} + + i18next@26.0.5(typescript@6.0.2): + dependencies: + '@babel/runtime': 7.29.2 + optionalDependencies: + typescript: 6.0.2 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + inquirer@8.2.5: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.5.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-plain-obj@4.1.0: {} + + is-unicode-supported@0.1.0: {} + + is-utf8@0.2.1: {} + + is-windows@1.0.2: {} + + isbot@5.1.39: {} + + isexe@2.0.0: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + ky@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 + + lines-and-columns@1.2.4: {} + + lint-staged@16.4.0: + dependencies: + commander: 14.0.3 + listr2: 9.0.5 + picomatch: 4.0.4 + string-argv: 0.3.2 + tinyexec: 1.1.1 + yaml: 2.8.3 + + listr2@9.0.5: + dependencies: + cli-truncate: 5.2.0 + colorette: 2.0.20 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + lodash.camelcase@4.3.0: {} + + lodash.kebabcase@4.1.1: {} + + lodash.map@4.6.0: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + longest@2.0.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + meow@13.2.0: {} + + merge@2.1.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.14 + + minimist@1.2.7: {} + + minimist@1.2.8: {} + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + nanoid@3.3.11: {} + + node-releases@2.0.37: {} + + normalize-path@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-passwd@1.0.0: {} + + path-is-absolute@1.0.1: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + postcss@8.5.10: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.8.3: {} + + react-dom@19.2.5(react@19.2.5): + dependencies: + react: 19.2.5 + scheduler: 0.27.0 + + react-i18next@17.0.3(i18next@26.0.5(typescript@6.0.2))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.2): + dependencies: + '@babel/runtime': 7.29.2 + html-parse-stringify: 3.0.1 + i18next: 26.0.5(typescript@6.0.2) + react: 19.2.5 + use-sync-external-store: 1.6.0(react@19.2.5) + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + typescript: 6.0.2 + + react@19.2.5: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rfdc@1.4.1: {} + + rolldown@1.0.0-rc.15: + dependencies: + '@oxc-project/types': 0.124.0 + '@rolldown/pluginutils': 1.0.0-rc.15 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.15 + '@rolldown/binding-darwin-x64': 1.0.0-rc.15 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15 + + run-async@2.4.1: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.7.4: {} + + seroval-plugins@1.5.2(seroval@1.5.2): + dependencies: + seroval: 1.5.2 + + seroval@1.5.2: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + source-map-js@1.2.1: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@4.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tailwindcss@4.2.2: {} + + tapable@2.3.2: {} + + through@2.3.8: {} + + tinyexec@1.1.1: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.7 + get-tsconfig: 4.14.0 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@0.21.3: {} + + typescript@6.0.2: {} + + undici-types@7.16.0: {} + + universalify@2.0.1: {} + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.6.0(react@19.2.5): + dependencies: + react: 19.2.5 + + util-deprecate@1.0.2: {} + + vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.10 + rolldown: 1.0.0-rc.15 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.6.1 + tsx: 4.21.0 + yaml: 2.8.3 + + void-elements@3.1.0: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webpack-virtual-modules@0.6.2: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.8.3: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + zod@3.25.76: {} + + zustand@5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.5 + use-sync-external-store: 1.6.0(react@19.2.5) diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..03dc5aa --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,41 @@ +/** @description 应用启动阶段使用的根节点常量。 */ +export const APP_ROOT_ELEMENT_ID = 'root' + +/** @description 应用名称,用于文档标题和分享元信息。 */ +export const APP_NAME = 'React SPA Template' + +/** @description 应用默认的页面描述,用于 SEO 和分享卡片。 */ +export const APP_DEFAULT_DESCRIPTION = + 'A frontend scaffold with Vite, React, TanStack Router, TanStack Query, Zustand, and Biome.' + +/** @description 认证状态持久化到浏览器时使用的存储键。 */ +export const AUTH_STORAGE_KEY = 'auth-session' + +/** @description 接口请求的默认超时时间,单位为毫秒。 */ +export const DEFAULT_REQUEST_TIMEOUT_MS = 15_000 + +/** @description 请求默认声明可接收的响应内容类型。 */ +export const DEFAULT_REQUEST_ACCEPT_HEADER = 'application/json' + +/** @description 请求层统一使用的错误提示文案。 */ +export const API_ERROR_MESSAGES = { + timeout: 'Request timed out', + unexpected: 'Unexpected request error', +} as const + +/** @description TanStack Query 默认的缓存新鲜时间。 */ +export const QUERY_DEFAULT_STALE_TIME_MS = 30_000 + +/** @description TanStack Query 默认的缓存回收时间。 */ +export const QUERY_DEFAULT_GC_TIME_MS = 5 * 60_000 + +/** @description 查询请求默认允许的最大重试次数。 */ +export const QUERY_RETRY_LIMIT = 2 + +/** @description 可被视为瞬时失败并允许重试的状态码集合。 */ +export const QUERY_RETRYABLE_STATUS_CODES = [ + 408, 429, 500, 502, 503, 504, +] as const + +/** @description 国际化语言设置持久化到浏览器时使用的存储键。 */ +export const I18N_LANGUAGE_STORAGE_KEY = 'app-language' diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..61e0cb6 --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,112 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' + +import { I18N_LANGUAGE_STORAGE_KEY } from '@/constants' +import enUSCommon from '@/locales/en-US/common' +import zhCNCommon from '@/locales/zh-CN/common' + +export const supportedLanguages = ['zh-CN', 'en-US'] as const +export type AppLanguage = (typeof supportedLanguages)[number] + +const defaultLanguage: AppLanguage = 'zh-CN' + +/** @description 判断给定语言是否在当前应用支持列表中。 */ +export function isSupportedLanguage( + value: string | null | undefined, +): value is AppLanguage { + return supportedLanguages.includes(value as AppLanguage) +} + +/** @description 从浏览器设置中推断最匹配的语言。 */ +function detectBrowserLanguage() { + if (typeof navigator === 'undefined') { + return defaultLanguage + } + + const browserLanguages = [...navigator.languages, navigator.language] + + for (const language of browserLanguages) { + if (isSupportedLanguage(language)) { + return language + } + + const normalizedLanguage = language.toLowerCase() + + if (normalizedLanguage.startsWith('zh')) { + return 'zh-CN' + } + + if (normalizedLanguage.startsWith('en')) { + return 'en-US' + } + } + + return defaultLanguage +} + +/** @description 获取应用启动时应使用的初始语言。 */ +function getInitialLanguage() { + if (typeof window === 'undefined') { + return defaultLanguage + } + + const persistedLanguage = window.localStorage.getItem( + I18N_LANGUAGE_STORAGE_KEY, + ) + + if (isSupportedLanguage(persistedLanguage)) { + return persistedLanguage + } + + return detectBrowserLanguage() +} + +/** @description 暴露当前应用应优先使用的语言。 */ +export function getPreferredLanguage() { + return getInitialLanguage() +} + +/** @description 从路由路径中解析语言前缀。 */ +export function getLanguageFromPathname(pathname: string) { + const [, firstSegment] = pathname.split('/') + + if (isSupportedLanguage(firstSegment)) { + return firstSegment + } + + return null +} + +void i18n.use(initReactI18next).init({ + lng: getInitialLanguage(), + fallbackLng: defaultLanguage, + debug: false, + interpolation: { + escapeValue: false, + }, + resources: { + 'zh-CN': { + common: zhCNCommon, + }, + 'en-US': { + common: enUSCommon, + }, + }, + defaultNS: 'common', +}) + +/** @description 同步当前语言到 html 标签并持久化到浏览器。 */ +function syncLanguageState(language: string) { + if (typeof document !== 'undefined') { + document.documentElement.lang = language + } + + if (typeof window !== 'undefined' && isSupportedLanguage(language)) { + window.localStorage.setItem(I18N_LANGUAGE_STORAGE_KEY, language) + } +} + +syncLanguageState(i18n.resolvedLanguage ?? defaultLanguage) +i18n.on('languageChanged', syncLanguageState) + +export default i18n diff --git a/src/lib/api/api-client.ts b/src/lib/api/api-client.ts new file mode 100644 index 0000000..6c7373f --- /dev/null +++ b/src/lib/api/api-client.ts @@ -0,0 +1,212 @@ +import ky, { HTTPError, type Options, TimeoutError } from 'ky' +import { + API_ERROR_MESSAGES, + DEFAULT_REQUEST_ACCEPT_HEADER, + DEFAULT_REQUEST_TIMEOUT_MS, +} from '@/constants' +import { + handleUnauthorizedSession, + tryRefreshAuthSession, +} from '@/lib/auth/auth-session' +import { useAuthStore } from '@/store/auth-store' + +import { ApiError } from './api-error' +import type { ApiResponse } from './types' + +type RequestOptions = Omit +type JsonRequestOptions = RequestOptions & { + json?: TBody +} + +const AUTH_REFRESH_ATTEMPTED_CONTEXT_KEY = 'authRefreshAttempted' +const AUTH_SKIP_REFRESH_CONTEXT_KEY = 'skipAuthRefresh' +const appEnv = import.meta.env.VITE_APP_ENV +const shouldLogRequests = import.meta.env.VITE_ENABLE_REQUEST_LOG === 'true' + +function normalizeApiBaseUrl(baseUrl: string | undefined) { + const candidate = baseUrl?.trim() + + if (!candidate) { + throw new Error('VITE_API_BASE_URL 未配置') + } + + if (/^https?:\/\//.test(candidate)) { + return candidate.replace(/\/+$/, '') + } + + return candidate.replace(/^\/+/, '').replace(/\/+$/, '') +} + +async function parseResponseBody(response: Response) { + if (response.status === 204) { + return null + } + + const contentType = response.headers.get('content-type') ?? '' + + if (contentType.includes('application/json')) { + return response.json() + } + + return response.text() +} + +function getErrorMessage(response: Response, data: unknown) { + if (data && typeof data === 'object') { + const message = + 'message' in data ? data.message : 'msg' in data ? data.msg : null + + if (typeof message === 'string' && message.length > 0) { + return message + } + } + + return `Request failed with status ${response.status}` +} + +async function toApiError(error: unknown) { + if (error instanceof HTTPError) { + const data = error.data + + return new ApiError({ + message: getErrorMessage(error.response, data), + status: error.response.status, + data, + url: error.response.url, + }) + } + + if (error instanceof TimeoutError) { + return new ApiError({ + message: API_ERROR_MESSAGES.timeout, + status: 408, + }) + } + + if (error instanceof Error) { + return new ApiError({ + message: error.message, + }) + } + + return new ApiError({ + message: API_ERROR_MESSAGES.unexpected, + }) +} + +export const apiBaseUrl = normalizeApiBaseUrl(import.meta.env.VITE_API_BASE_URL) + +const apiClient = ky.create({ + prefix: apiBaseUrl, + retry: 0, + timeout: DEFAULT_REQUEST_TIMEOUT_MS, + hooks: { + beforeRequest: [ + ({ request }) => { + request.headers.set('Accept', DEFAULT_REQUEST_ACCEPT_HEADER) + + const token = useAuthStore.getState().accessToken + + if (token) { + request.headers.set('Authorization', `Bearer ${token}`) + } + + if (shouldLogRequests) { + console.info(`[api:${appEnv}] ${request.method} ${request.url}`) + } + }, + ], + afterResponse: [ + ({ request, response }) => { + if (shouldLogRequests) { + console.info( + `[api:${appEnv}] ${request.method} ${response.url} -> ${response.status}`, + ) + } + }, + ], + }, +}) + +async function request(input: string, options?: Options) { + try { + const response = await apiClient(input, options) + const data = await parseResponseBody(response) + + return data as TResponse + } catch (error) { + if ( + error instanceof HTTPError && + error.response.status === 401 && + options?.context?.[AUTH_SKIP_REFRESH_CONTEXT_KEY] !== true && + options?.context?.[AUTH_REFRESH_ATTEMPTED_CONTEXT_KEY] !== true + ) { + const refreshed = await tryRefreshAuthSession() + + if (refreshed) { + return request(input, { + ...options, + context: { + ...options?.context, + [AUTH_REFRESH_ATTEMPTED_CONTEXT_KEY]: true, + }, + }) + } + } + + if (error instanceof HTTPError && error.response.status === 401) { + handleUnauthorizedSession() + } + + throw await toApiError(error) + } +} + +async function requestRest(input: string, options?: Options) { + return request>(input, options) +} + +export const api = { + get(input: string, options?: RequestOptions) { + return requestRest(input, { + ...options, + method: 'get', + }) + }, + post( + input: string, + { json, ...options }: JsonRequestOptions = {}, + ) { + return requestRest(input, { + ...options, + json, + method: 'post', + }) + }, + put( + input: string, + { json, ...options }: JsonRequestOptions = {}, + ) { + return requestRest(input, { + ...options, + json, + method: 'put', + }) + }, + patch( + input: string, + { json, ...options }: JsonRequestOptions = {}, + ) { + return requestRest(input, { + ...options, + json, + method: 'patch', + }) + }, + delete(input: string, options?: RequestOptions) { + return requestRest(input, { + ...options, + method: 'delete', + }) + }, +} diff --git a/src/lib/api/api-error.ts b/src/lib/api/api-error.ts new file mode 100644 index 0000000..e2fddd6 --- /dev/null +++ b/src/lib/api/api-error.ts @@ -0,0 +1,20 @@ +interface ApiErrorOptions { + message: string + status?: number + data?: unknown + url?: string +} + +export class ApiError extends Error { + status: number | null + data: unknown + url: string | null + + constructor({ message, status, data, url }: ApiErrorOptions) { + super(message) + this.name = 'ApiError' + this.status = status ?? null + this.data = data ?? null + this.url = url ?? null + } +} diff --git a/src/lib/api/types.ts b/src/lib/api/types.ts new file mode 100644 index 0000000..b2ead25 --- /dev/null +++ b/src/lib/api/types.ts @@ -0,0 +1,6 @@ +/** @description 后端统一响应体结构。 */ +export interface ApiResponse { + code: number + msg: string + data: T +} diff --git a/src/lib/auth/auth-session.ts b/src/lib/auth/auth-session.ts new file mode 100644 index 0000000..9a46c0c --- /dev/null +++ b/src/lib/auth/auth-session.ts @@ -0,0 +1,104 @@ +import type { AuthSessionInput, AuthUser } from '@/store/auth-store' +import { useAuthStore } from '@/store/auth-store' + +export type CurrentUserInitializer = () => Promise +export type RefreshSessionHandler = ( + refreshToken: string, +) => Promise + +let currentUserInitializer: CurrentUserInitializer | null = null +let refreshSessionHandler: RefreshSessionHandler | null = null +let authInitializationPromise: Promise | null = null +let refreshSessionPromise: Promise | null = null + +export function registerCurrentUserInitializer( + initializer: CurrentUserInitializer | null, +) { + currentUserInitializer = initializer +} + +export function registerRefreshSessionHandler( + handler: RefreshSessionHandler | null, +) { + refreshSessionHandler = handler +} + +export function isAuthenticated() { + const snapshot = useAuthStore.getState() + + return snapshot.status === 'authenticated' && Boolean(snapshot.accessToken) +} + +export function handleUnauthorizedSession() { + useAuthStore.getState().markUnauthorized() +} + +export async function initializeAuthSession() { + if (authInitializationPromise) { + return authInitializationPromise + } + + authInitializationPromise = (async () => { + await useAuthStore.persist.rehydrate() + + const snapshot = useAuthStore.getState() + + if ( + !snapshot.accessToken || + snapshot.currentUser || + !currentUserInitializer + ) { + return + } + + const currentUser = await currentUserInitializer() + + useAuthStore.getState().setCurrentUser(currentUser) + })().finally(() => { + authInitializationPromise = null + }) + + return authInitializationPromise +} + +export async function tryRefreshAuthSession() { + if (refreshSessionPromise) { + return refreshSessionPromise + } + + const snapshot = useAuthStore.getState() + + if (!snapshot.refreshToken || !refreshSessionHandler) { + return false + } + + const refreshToken = snapshot.refreshToken + + refreshSessionPromise = (async () => { + try { + const nextSession = await refreshSessionHandler(refreshToken) + + if (!nextSession?.accessToken) { + handleUnauthorizedSession() + + return false + } + + useAuthStore.getState().startSession({ + accessToken: nextSession.accessToken, + currentUser: nextSession.currentUser ?? snapshot.currentUser, + refreshToken: nextSession.refreshToken ?? snapshot.refreshToken, + }) + + return true + } catch { + handleUnauthorizedSession() + + return false + } finally { + refreshSessionPromise = null + } + })() + + return refreshSessionPromise +} diff --git a/src/lib/auth/require-auth.ts b/src/lib/auth/require-auth.ts new file mode 100644 index 0000000..20d29f8 --- /dev/null +++ b/src/lib/auth/require-auth.ts @@ -0,0 +1,29 @@ +import { redirect } from '@tanstack/react-router' + +import type { AppLanguage } from '@/i18n' +import { getPreferredLanguage } from '@/i18n' +import { useAuthStore } from '@/store/auth-store' + +import { initializeAuthSession, isAuthenticated } from './auth-session' + +interface RequireAuthenticatedSessionOptions { + fallbackLanguage?: AppLanguage +} + +export async function requireAuthenticatedSession( + options: RequireAuthenticatedSessionOptions = {}, +) { + await initializeAuthSession() + + if (isAuthenticated()) { + return useAuthStore.getState() + } + + throw redirect({ + to: '/$lang', + params: { + lang: options.fallbackLanguage ?? getPreferredLanguage(), + }, + replace: true, + }) +} diff --git a/src/lib/head/document-metadata.ts b/src/lib/head/document-metadata.ts new file mode 100644 index 0000000..427dec5 --- /dev/null +++ b/src/lib/head/document-metadata.ts @@ -0,0 +1,95 @@ +import { useEffect } from 'react' + +import { APP_DEFAULT_DESCRIPTION, APP_NAME } from '@/constants' + +interface DocumentMetadata { + description?: string + robots?: string + title?: string +} + +function upsertMetaTag( + selector: string, + attributes: Record, + content: string, +) { + let tag = document.head.querySelector(selector) + + if (!tag) { + tag = document.createElement('meta') + + for (const [attribute, value] of Object.entries(attributes)) { + tag.setAttribute(attribute, value) + } + + document.head.append(tag) + } + + tag.setAttribute('content', content) +} + +export function buildDocumentTitle(title?: string) { + if (!title) { + return APP_NAME + } + + return `${title} | ${APP_NAME}` +} + +export function applyDocumentMetadata({ + description = APP_DEFAULT_DESCRIPTION, + robots = 'index,follow', + title, +}: DocumentMetadata) { + if (typeof document === 'undefined') { + return + } + + const resolvedTitle = buildDocumentTitle(title) + + document.title = resolvedTitle + + upsertMetaTag( + 'meta[name="description"]', + { name: 'description' }, + description, + ) + upsertMetaTag('meta[name="robots"]', { name: 'robots' }, robots) + upsertMetaTag( + 'meta[property="og:title"]', + { property: 'og:title' }, + resolvedTitle, + ) + upsertMetaTag( + 'meta[property="og:description"]', + { property: 'og:description' }, + description, + ) + upsertMetaTag( + 'meta[property="og:site_name"]', + { property: 'og:site_name' }, + APP_NAME, + ) + upsertMetaTag( + 'meta[name="twitter:title"]', + { name: 'twitter:title' }, + resolvedTitle, + ) + upsertMetaTag( + 'meta[name="twitter:description"]', + { name: 'twitter:description' }, + description, + ) +} + +export function useDocumentMetadata(metadata: DocumentMetadata) { + const { description, robots, title } = metadata + + useEffect(() => { + applyDocumentMetadata({ + description, + robots, + title, + }) + }, [description, robots, title]) +} diff --git a/src/lib/query/query-client.ts b/src/lib/query/query-client.ts new file mode 100644 index 0000000..62eaa46 --- /dev/null +++ b/src/lib/query/query-client.ts @@ -0,0 +1,43 @@ +import { QueryClient } from '@tanstack/react-query' +import { + QUERY_DEFAULT_GC_TIME_MS, + QUERY_DEFAULT_STALE_TIME_MS, + QUERY_RETRY_LIMIT, + QUERY_RETRYABLE_STATUS_CODES, +} from '@/constants' + +import { ApiError } from '../api/api-error' + +const retryableStatusCodes = new Set(QUERY_RETRYABLE_STATUS_CODES) + +function shouldRetryRequest(error: unknown) { + if (!(error instanceof ApiError)) { + return true + } + + if (error.status === null) { + return true + } + + return retryableStatusCodes.has(error.status) || error.status >= 500 +} + +export function createQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + staleTime: QUERY_DEFAULT_STALE_TIME_MS, + gcTime: QUERY_DEFAULT_GC_TIME_MS, + refetchOnWindowFocus: false, + retry(failureCount, error) { + return failureCount < QUERY_RETRY_LIMIT && shouldRetryRequest(error) + }, + }, + mutations: { + retry: false, + }, + }, + }) +} + +export const queryClient = createQueryClient() diff --git a/src/locales/en-US/common.ts b/src/locales/en-US/common.ts new file mode 100644 index 0000000..91ab4d9 --- /dev/null +++ b/src/locales/en-US/common.ts @@ -0,0 +1,42 @@ +export default { + nav: { + home: 'Home', + }, + shell: { + eyebrow: 'React SPA scaffold', + subtitle: 'TanStack Router + Query + Auth + i18n', + }, + notFound: { + eyebrow: '404', + title: 'The page you requested could not be found.', + description: 'This route does not exist. Return to the scaffold home page.', + home: 'Back home', + }, + home: { + eyebrow: 'Blank scaffold ready', + title: 'Start building your frontend project from here.', + description: + 'The template already includes routing, data fetching, session state, head metadata, and i18n. After removing the examples, this page becomes your clean starting point.', + cards: { + routingMode: 'Routing mode', + dataLayer: 'Data layer', + transport: 'Transport', + auth: 'Auth layer', + metadata: 'Page metadata', + }, + values: { + routingMode: 'SPA + file routes', + dataLayer: 'TanStack Query', + transport: 'ky', + auth: 'Zustand session scaffold', + metadata: 'Dynamic title / meta', + }, + footnote: + 'A practical place to start is replacing src/routes/$lang/index.tsx, src/lib/api/api-client.ts, and src/store/auth-store.ts with your project-specific structure.', + }, + language: { + label: 'Language', + zhCN: '中文', + enUS: 'English', + }, +} as const diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts new file mode 100644 index 0000000..e2914bb --- /dev/null +++ b/src/locales/zh-CN/common.ts @@ -0,0 +1,42 @@ +export default { + nav: { + home: '首页', + }, + shell: { + eyebrow: 'React SPA 脚手架', + subtitle: 'TanStack Router + Query + Auth + i18n', + }, + notFound: { + eyebrow: '404', + title: '找不到你访问的页面。', + description: '当前路由不存在,你可以返回脚手架首页继续开始开发。', + home: '返回首页', + }, + home: { + eyebrow: '空白脚手架已就绪', + title: '从这里开始搭建你的前端项目。', + description: + '模板已经接好路由、请求层、会话状态、head metadata 和多语言。删除示例后,这一页就是你的干净起点。', + cards: { + routingMode: '路由模式', + dataLayer: '数据层', + transport: '请求层', + auth: '认证层', + metadata: '页面元信息', + }, + values: { + routingMode: 'SPA + 文件路由', + dataLayer: 'TanStack Query', + transport: 'ky', + auth: 'Zustand 会话基座', + metadata: '动态 title / meta', + }, + footnote: + '建议先从 src/routes/$lang/index.tsx、src/lib/api/api-client.ts 和 src/store/auth-store.ts 开始替换成你的项目结构。', + }, + language: { + label: '语言', + zhCN: '中文', + enUS: 'English', + }, +} as const diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..a8ff6bd --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,31 @@ +import { QueryClientProvider } from '@tanstack/react-query' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import { RouterProvider } from '@tanstack/react-router' +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { APP_ROOT_ELEMENT_ID } from '@/constants' +import '@/i18n' +import { initializeAuthSession } from '@/lib/auth/auth-session' +import { queryClient } from '@/lib/query/query-client' +import { router } from '@/router' +import './styles.css' + +const rootElement = document.getElementById(APP_ROOT_ELEMENT_ID) +const shouldShowQueryDevtools = + import.meta.env.VITE_APP_ENV === 'development' && + import.meta.env.VITE_ENABLE_QUERY_DEVTOOLS === 'true' + +if (!rootElement) { + throw new Error('Root element not found') +} + +void initializeAuthSession() + +createRoot(rootElement).render( + + + + {shouldShowQueryDevtools && } + + , +) diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts new file mode 100644 index 0000000..ec7bbd6 --- /dev/null +++ b/src/routeTree.gen.ts @@ -0,0 +1,104 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as LangRouteRouteImport } from './routes/$lang/route' +import { Route as IndexRouteImport } from './routes/index' +import { Route as LangIndexRouteImport } from './routes/$lang/index' + +const LangRouteRoute = LangRouteRouteImport.update({ + id: '/$lang', + path: '/$lang', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const LangIndexRoute = LangIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => LangRouteRoute, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/$lang': typeof LangRouteRouteWithChildren + '/$lang/': typeof LangIndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/$lang': typeof LangIndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/$lang': typeof LangRouteRouteWithChildren + '/$lang/': typeof LangIndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/$lang' | '/$lang/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/$lang' + id: '__root__' | '/' | '/$lang' | '/$lang/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LangRouteRoute: typeof LangRouteRouteWithChildren +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/$lang': { + id: '/$lang' + path: '/$lang' + fullPath: '/$lang' + preLoaderRoute: typeof LangRouteRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/$lang/': { + id: '/$lang/' + path: '/' + fullPath: '/$lang/' + preLoaderRoute: typeof LangIndexRouteImport + parentRoute: typeof LangRouteRoute + } + } +} + +interface LangRouteRouteChildren { + LangIndexRoute: typeof LangIndexRoute +} + +const LangRouteRouteChildren: LangRouteRouteChildren = { + LangIndexRoute: LangIndexRoute, +} + +const LangRouteRouteWithChildren = LangRouteRoute._addFileChildren( + LangRouteRouteChildren, +) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LangRouteRoute: LangRouteRouteWithChildren, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/src/router.tsx b/src/router.tsx new file mode 100644 index 0000000..30de1e6 --- /dev/null +++ b/src/router.tsx @@ -0,0 +1,14 @@ +import { createRouter } from '@tanstack/react-router' + +import { routeTree } from './routeTree.gen' + +export const router = createRouter({ + routeTree, + defaultPreload: 'intent', +}) + +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} diff --git a/src/routes/$lang/index.tsx b/src/routes/$lang/index.tsx new file mode 100644 index 0000000..9317e36 --- /dev/null +++ b/src/routes/$lang/index.tsx @@ -0,0 +1,19 @@ +import { createFileRoute } from '@tanstack/react-router' +import { useTranslation } from 'react-i18next' + +import { useDocumentMetadata } from '@/lib/head/document-metadata' + +export const Route = createFileRoute('/$lang/')({ + component: HomePage, +}) + +function HomePage() { + const { t } = useTranslation() + + useDocumentMetadata({ + title: t('home.title'), + description: t('home.description'), + }) + + return
    111
    +} diff --git a/src/routes/$lang/route.tsx b/src/routes/$lang/route.tsx new file mode 100644 index 0000000..9f1b327 --- /dev/null +++ b/src/routes/$lang/route.tsx @@ -0,0 +1,46 @@ +import { createFileRoute, Navigate, Outlet } from '@tanstack/react-router' +import { useEffect } from 'react' +import { useTranslation } from 'react-i18next' + +import { getPreferredLanguage, isSupportedLanguage } from '@/i18n' + +export const Route = createFileRoute('/$lang')({ + component: LanguageLayout, +}) + +function LanguageLayout() { + const { lang } = Route.useParams() + const { i18n } = useTranslation() + const preferredLanguage = getPreferredLanguage() + const isValidLanguage = isSupportedLanguage(lang) + + useEffect(() => { + if (isValidLanguage && i18n.resolvedLanguage !== lang) { + void i18n.changeLanguage(lang) + } + }, [i18n, isValidLanguage, lang]) + + if (!isValidLanguage) { + return + } + + // function changeLanguage(nextLanguage: AppLanguage) { + // const nextPathname = location.pathname.replace( + // /^\/(zh-CN|en-US)(?=\/|$)/, + // `/${nextLanguage}`, + // ) + // void i18n.changeLanguage(nextLanguage) + // void navigate({ + // to: nextPathname, + // search: location.search, + // hash: location.hash, + // replace: true, + // }) + // } + + return ( + <> + + + ) +} diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx new file mode 100644 index 0000000..98025e8 --- /dev/null +++ b/src/routes/__root.tsx @@ -0,0 +1,64 @@ +import { + createRootRoute, + Link, + Outlet, + useLocation, +} from '@tanstack/react-router' +import { useEffect } from 'react' +import { useTranslation } from 'react-i18next' + +import { getLanguageFromPathname, getPreferredLanguage } from '@/i18n' +import { useDocumentMetadata } from '@/lib/head/document-metadata' + +function NotFoundPage() { + const { i18n, t } = useTranslation() + const location = useLocation() + const routeLanguage = + getLanguageFromPathname(location.pathname) ?? + (i18n.resolvedLanguage || getPreferredLanguage()) + const homePath = `/${routeLanguage}` + + useEffect(() => { + if ( + getLanguageFromPathname(location.pathname) && + i18n.resolvedLanguage !== routeLanguage + ) { + void i18n.changeLanguage(routeLanguage) + } + }, [i18n, location.pathname, routeLanguage]) + + useDocumentMetadata({ + title: t('notFound.title'), + description: t('notFound.description'), + robots: 'noindex,nofollow', + }) + + return ( +
    + + {t('notFound.eyebrow')} + +
    +

    + {t('notFound.title')} +

    +

    + {t('notFound.description')} +

    +
    +
    + + {t('notFound.home')} + +
    +
    + ) +} + +export const Route = createRootRoute({ + component: Outlet, + notFoundComponent: NotFoundPage, +}) diff --git a/src/routes/index.tsx b/src/routes/index.tsx new file mode 100644 index 0000000..133d595 --- /dev/null +++ b/src/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute, Navigate } from '@tanstack/react-router' + +import { getPreferredLanguage } from '@/i18n' + +export const Route = createFileRoute('/')({ + component: RootRedirectPage, +}) + +function RootRedirectPage() { + return ( + + ) +} diff --git a/src/store/auth-store.ts b/src/store/auth-store.ts new file mode 100644 index 0000000..6f34b31 --- /dev/null +++ b/src/store/auth-store.ts @@ -0,0 +1,143 @@ +import { create } from 'zustand' +import { createJSONStorage, persist } from 'zustand/middleware' + +import { AUTH_STORAGE_KEY } from '@/constants' + +export type AuthStatus = 'anonymous' | 'authenticated' | 'restoring' + +export interface AuthUser { + email?: string + id: string + name?: string + roles?: string[] +} + +export interface AuthSessionInput { + accessToken: string + currentUser?: AuthUser | null + refreshToken?: string | null +} + +interface PersistedAuthState { + accessToken: string | null + currentUser: AuthUser | null + refreshToken: string | null +} + +interface AuthState extends PersistedAuthState { + clearAccessToken: () => void + clearSession: () => void + finishHydration: () => void + isHydrated: boolean + lastUnauthorizedAt: string | null + markUnauthorized: () => void + setAccessToken: (token: string) => void + setCurrentUser: (user: AuthUser | null) => void + startSession: (session: AuthSessionInput) => void + status: AuthStatus + updateTokens: (tokens: { + accessToken: string + refreshToken?: string | null + }) => void +} + +function resolveAuthStatus(accessToken: string | null): AuthStatus { + return accessToken ? 'authenticated' : 'anonymous' +} + +const initialPersistedState: PersistedAuthState = { + accessToken: null, + refreshToken: null, + currentUser: null, +} + +export const useAuthStore = create()( + persist( + (set) => ({ + ...initialPersistedState, + status: 'restoring', + isHydrated: false, + lastUnauthorizedAt: null, + setAccessToken: (token) => { + set({ + accessToken: token, + status: 'authenticated', + isHydrated: true, + }) + }, + setCurrentUser: (currentUser) => { + set((state) => ({ + currentUser, + status: resolveAuthStatus(state.accessToken), + })) + }, + startSession: ({ + accessToken, + currentUser = null, + refreshToken = null, + }) => { + set({ + accessToken, + currentUser, + refreshToken, + status: 'authenticated', + isHydrated: true, + }) + }, + updateTokens: ({ accessToken, refreshToken }) => { + set((state) => ({ + accessToken, + refreshToken: refreshToken ?? state.refreshToken, + status: 'authenticated', + isHydrated: true, + })) + }, + finishHydration: () => { + set((state) => ({ + isHydrated: true, + status: resolveAuthStatus(state.accessToken), + })) + }, + clearAccessToken: () => { + set({ + accessToken: null, + status: 'anonymous', + isHydrated: true, + }) + }, + clearSession: () => { + set({ + ...initialPersistedState, + status: 'anonymous', + isHydrated: true, + }) + }, + markUnauthorized: () => { + set({ + ...initialPersistedState, + status: 'anonymous', + isHydrated: true, + lastUnauthorizedAt: new Date().toISOString(), + }) + }, + }), + { + name: AUTH_STORAGE_KEY, + storage: createJSONStorage(() => sessionStorage), + partialize: (state) => ({ + accessToken: state.accessToken, + currentUser: state.currentUser, + refreshToken: state.refreshToken, + }), + onRehydrateStorage: () => (state, error) => { + if (error) { + state?.clearSession() + + return + } + + state?.finishHydration() + }, + }, + ), +) diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..986eaed --- /dev/null +++ b/src/styles.css @@ -0,0 +1,22 @@ +@import "tailwindcss"; + +@theme { + --font-sans: + "Inter", "SF Pro Display", "Segoe UI", "Helvetica Neue", sans-serif; + --font-mono: + "JetBrains Mono", "SFMono-Regular", "SF Mono", Consolas, monospace; +} + +@layer base { + html { + @apply h-full w-full; + } + + body { + @apply m-0 h-full w-full; + } + + #root { + @apply h-full w-full; + } +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..89854c8 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,12 @@ +/// + +interface ImportMetaEnv { + readonly VITE_APP_ENV: 'development' | 'production' | 'test' + readonly VITE_API_BASE_URL: string + readonly VITE_ENABLE_QUERY_DEVTOOLS: 'true' | 'false' + readonly VITE_ENABLE_REQUEST_LOG: 'true' | 'false' +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..96b22d1 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "paths": { + "@/*": ["./src/*"] + }, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..746d7c7 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "paths": { + "@/*": ["./src/*"] + }, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..64ba285 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,24 @@ +import { fileURLToPath, URL } from 'node:url' +import babel from '@rolldown/plugin-babel' +import tailwindcss from '@tailwindcss/vite' +import { tanstackRouter } from '@tanstack/router-plugin/vite' +import react, { reactCompilerPreset } from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +// https://vite.dev/config/ +export default defineConfig({ + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + plugins: [ + tanstackRouter({ + target: 'react', + autoCodeSplitting: true, + }), + tailwindcss(), + react(), + babel({ presets: [reactCompilerPreset()] }), + ], +})