AdmSysV2【公共组件库】@前端(For Git Submodule)
8 files modified
8 files added
13 files deleted
2318 ■■■■ changed files
.claude/commands/opsx/apply.md 152 ●●●●● patch | view | raw | blame | history
.claude/commands/opsx/archive.md 157 ●●●●● patch | view | raw | blame | history
.claude/commands/opsx/explore.md 173 ●●●●● patch | view | raw | blame | history
.claude/commands/opsx/propose.md 106 ●●●●● patch | view | raw | blame | history
.claude/settings.json 4 ●●●● patch | view | raw | blame | history
.gitignore 1 ●●●● patch | view | raw | blame | history
.mcp.json 9 ●●●●● patch | view | raw | blame | history
CLAUDE.md 3 ●●●● patch | view | raw | blame | history
STRUCTURE.md 24 ●●●● patch | view | raw | blame | history
antd-migration-v6.zh-CN.md 389 ●●●●● patch | view | raw | blame | history
eslint.config.js 2 ●●● patch | view | raw | blame | history
example/App.tsx 10 ●●●●● patch | view | raw | blame | history
example/index.css 5 ●●●●● patch | view | raw | blame | history
example/main.tsx 5 ●●●●● patch | view | raw | blame | history
index.html 2 ●●● patch | view | raw | blame | history
package.json 14 ●●●● patch | view | raw | blame | history
pnpm-lock.yaml 795 ●●●●● patch | view | raw | blame | history
public/favicon.svg 1 ●●●● patch | view | raw | blame | history
public/icons.svg 24 ●●●●● patch | view | raw | blame | history
src/App.css 184 ●●●●● patch | view | raw | blame | history
src/App.tsx 121 ●●●●● patch | view | raw | blame | history
src/assets/hero.png patch | view | raw | blame | history
src/assets/react.svg 1 ●●●● patch | view | raw | blame | history
src/assets/vite.svg 1 ●●●● patch | view | raw | blame | history
src/index.css 111 ●●●●● patch | view | raw | blame | history
src/main.tsx 10 ●●●●● patch | view | raw | blame | history
src/types.ts 1 ●●●● patch | view | raw | blame | history
test/setup.ts 1 ●●●● patch | view | raw | blame | history
vitest.config.ts 12 ●●●●● patch | view | raw | blame | history
.claude/commands/opsx/apply.md
File was deleted
.claude/commands/opsx/archive.md
File was deleted
.claude/commands/opsx/explore.md
File was deleted
.claude/commands/opsx/propose.md
File was deleted
.claude/settings.json
@@ -5,6 +5,10 @@
            "Edit(src/**)",
            "Read(public/**)",
            "Edit(public/**)",
            "Bash(npx tsc:*)",
            "Bash(pnpm dev:*)",
            "Bash(pnpm test:run:*)",
            "Bash(pnpm build:*)",
            "Bash(openspec new change *)",
            "Bash(openspec status *)",
            "Bash(openspec instructions *)",
.gitignore
@@ -11,6 +11,7 @@
dist
dist-ssr
*.local
.claude/settings.local.json
# Editor directories and files
.vscode/*
.mcp.json
New file
@@ -0,0 +1,9 @@
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp", "start", "--port", "9090"],
      "description": "Playwright browser automation for component testing"
    }
  }
}
CLAUDE.md
@@ -4,7 +4,8 @@
## 项目信息
项目详细技术介绍见 [README.md](./README.md)
- 项目详细技术介绍见 [README.md](./README.md)
- 项目详细目录结构说明见 [STRUCTURE.md](./STRUCTURE.md)
## 终端命令
STRUCTURE.md
@@ -13,7 +13,8 @@
│   ├── plugins/            # 高级组件 - 复杂功能
│   ├── bases/              # 业务组件 - 领域特定
│   └── assets/             # 静态资源
├── test/                   # 测试案例(待补充)
├── test/                   # Vitest 测试配置和案例
├── example/                # 组件展示案例
├── public/                 # 公共资源
├── openspec/               # 变更管理
├── README.md               # 项目概述
@@ -119,18 +120,31 @@
└── ...
```
## test/ - 测试案例
## test/ - 测试目录
测试目录,待测试框架确定后补充结构。
Vitest 测试配置和测试案例。
初步规划:
```
test/
├── setup.ts       # Jest DOM 全局断言配置
├── unit/          # 单元测试
├── integration/   # 集成测试
└── e2e/           # 端到端测试
└── e2e/           # 端到端测试(Playwright)
```
## example/ - 组件展示案例
用于独立展示和调试组件的示例页面,是项目的入口点。
```
example/
├── App.tsx       # 演示应用入口
├── main.tsx      # 渲染入口
└── index.css    # 全局样式
```
**入口文件**: `index.html` 引用 `/example/main.tsx` 作为模块入口。
## 文件命名规范
### 组件文件
antd-migration-v6.zh-CN.md
New file
@@ -0,0 +1,389 @@
---
group:
  title: 迁移
  order: 2
order: 0
title: 从 v5 到 v6
---
本文档将帮助你从 antd `5.x` 版本升级到 antd `6.x` 版本。本次升级为一次技术升级,虽然组件 API 保持兼容,但在升级前您需要确保您的环境满足新的要求。
## 升级准备
1. 请先升级到 **v5 最新版本**,按照控制台 warning 信息处理已废弃 API。
2. 确认项目可以运行在 **React 18 及以上**版本,v6 不再支持 React 17 及以下。
3. v6 仅支持现代浏览器,并默认使用 **CSS variables**,因此不再支持 IE。
```bash
npm install --save antd@6
# 或
yarn add antd@6
# 或
pnpm add antd@6
```
## v6 有哪些不兼容的变化
### React 版本支持调整
- `antd@6` 要求 React 版本 >= 18,不再支持 React 17 及以下。
- 不再需要 `@ant-design/v5-patch-for-react-19` 来兼容 React 19,如果使用可以移除该依赖。
```diff
- import '@ant-design/v5-patch-for-react-19';
```
### @ant-design/icons 版本升级
- `antd@6` 要求 `@ant-design/icons` 版本 >= 6.0.0。
- ⚠️ **重要**:`@ant-design/icons@6` 与 `antd@5` 不兼容,请确保同时升级两个包。
- 如果你的项目显式依赖 `@ant-design/icons`,需要同步升级到 v6 版本。
```bash
npm install --save @ant-design/icons@6
# 或
yarn add @ant-design/icons@6
# 或
pnpm add @ant-design/icons@6
```
如果你在升级过程中遇到构建错误,请检查 `@ant-design/icons` 版本是否与 `antd` 版本匹配。
### DOM 调整
- v6 对大量组件的 DOM 结构进行了升级和优化,以提升可维护性和一致性。
- 对于大多数正常使用 antd 样式的项目,这不会产生影响。
- ⚠️ 如果你的项目中存在针对组件内部 DOM 节点的自定义样式(例如依赖特定选择器或层级结构),升级后可能需要手动检查并调整样式。
### API 调整
⚠️ 下列 API 已被标记为**废弃(Deprecated)**。尽管这些属性当前仍可使用,但控制台会提示弃用警告,并将在 7.0 中被移除。为保持代码的可维护性和兼容性,**建议尽快迁移到对应的替代属性**。
- `Alert`
  - `closeText` 弃用,变为 `closable.closeIcon`。
  - `message` 弃用,变为 `title`。
- `Anchor`
  - `Anchor children` 弃用,变为 `items`。
- `AutoComplete`
  - `dropdownMatchSelectWidth` 弃用,变为 `popupMatchSelectWidth`。
  - `dropdownStyle` 弃用,变为 `styles.popup.root`。
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `popupClassName` 弃用,变为 `classNames.popup.root`。
  - `dropdownRender` 弃用,变为 `popupRender`。
  - `onDropdownVisibleChange` 弃用,变为 `onOpenChange`。
  - `dataSource` 弃用,变为 `options`。
- `Avatar.Group`
  - `maxCount` 弃用,变为 `max={{ count: number }}`。
  - `maxStyle` 弃用,变为 `max={{ style: CSSProperties }}`。
  - `maxPopoverPlacement` 弃用,变为 `max={{ popover: PopoverProps }}`。
  - `maxPopoverTrigger` 弃用,变为 `max={{ popover: PopoverProps }}`。
- `BackTop`
  - `BackTop` 弃用,变为 `FloatButton.BackTop`。
- `Breadcrumb`
  - `routes` 弃用,变为 `items`。
  - `Breadcrumb.Item` 和 `Breadcrumb.Separator` 弃用,变为 `items`。
- `Button.Group`
  - `Button.Group` 弃用,变为 `Space.Compact`。
- `Button`
  - `iconPosition` 弃用,变为 `iconPlacement`。
- `Calendar`
  - `dateFullCellRender` 弃用,变为 `fullCellRender`。
  - `dateCellRender` 弃用,变为 `cellRender`。
  - `monthFullCellRender` 弃用,变为 `fullCellRender`。
  - `monthCellRender` 弃用,变为 `cellRender`。
- `Card`
  - `headStyle` 弃用,变为 `styles.header`。
  - `bodyStyle` 弃用,变为 `styles.body`。
  - `bordered` 弃用,变为 `variant`。
- `Carousel`
  - `dotPosition` 弃用,变为 `dotPlacement`。
- `Cascader`
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `dropdownStyle` 弃用,变为 `styles.popup.root`。
  - `dropdownRender` 弃用,变为 `popupRender`。
  - `dropdownMenuColumnStyle` 弃用,变为 `popupMenuColumnStyle`。
  - `onDropdownVisibleChange` 弃用,变为 `onOpenChange`。
  - `onPopupVisibleChange` 弃用,变为 `onOpenChange`。
  - `bordered` 弃用,变为 `variant`。
- `Collapse`
  - `destroyInactivePanel` 弃用,变为 `destroyOnHidden`。
  - `expandIconPosition` 弃用,变为 `expandIconPlacement`。
- `Collapse.Panel`
  - `disabled` 弃用,变为 `collapsible="disabled"`。
- `ConfigProvider`
  - `dropdownMatchSelectWidth` 弃用,变为 `popupMatchSelectWidth`。
- `DatePicker.RangePicker`
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `popupClassName` 弃用,变为 `classNames.popup.root`。
  - `popupStyle` 弃用,变为 `styles.popup.root`。
  - `bordered` 弃用,变为 `variant`。
  - `onSelect` 弃用,变为 `onCalendarChange`。
- `DatePicker`
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `popupClassName` 弃用,变为 `classNames.popup.root`。
  - `popupStyle` 弃用,变为 `styles.popup.root`。
  - `bordered` 弃用,变为 `variant`。
  - `onSelect` 弃用,变为 `onCalendarChange`。
- `Descriptions`
  - `labelStyle` 弃用,变为 `styles.label`。
  - `contentStyle` 弃用,变为 `styles.content`。
- `Divider`
  - `type` 弃用,变为 `orientation`。
  - `orientationMargin` 弃用,变为 `styles.content.margin`。
- `Drawer`
  - `headerStyle` 弃用,变为 `styles.header`。
  - `bodyStyle` 弃用,变为 `styles.body`。
  - `footerStyle` 弃用,变为 `styles.footer`。
  - `contentWrapperStyle` 弃用,变为 `styles.wrapper`。
  - `maskStyle` 弃用,变为 `styles.mask`。
  - `drawerStyle` 弃用,变为 `styles.section`。
  - `destroyInactivePanel` 弃用,变为 `destroyOnHidden`。
  - `width` 弃用,变为 `size`。
  - `height` 弃用,变为 `size`。
- `Dropdown.Button`
  - `Dropdown.Button` 弃用,变为 `Space.Compact + Dropdown + Button`。
- `Dropdown`
  - `dropdownRender` 弃用,变为 `popupRender`。
  - `destroyPopupOnHide` 弃用,变为 `destroyOnHidden`。
  - `overlayClassName` 弃用,变为 `classNames.root`。
  - `overlayStyle` 弃用,变为 `styles.root`。
  - `placement: xxxCenter` 弃用,变为 `placement: xxx`。
- `Empty`
  - `imageStyle` 弃用,变为 `styles.image`。
- `FloatButton`
  - `description` 弃用,变为 `content`。
- `Image`
  - `wrapperStyle` 弃用,变为 `styles.root`。
  - `visible` 弃用,变为 `open`。
  - `onVisibleChange` 弃用,变为 `onOpenChange`。
  - `maskClassName` 弃用,变为 `classNames.cover`。
  - `rootClassName` 弃用,变为 `classNames.root`。
  - `toolbarRender` 弃用,变为 `actionsRender`。
- `Input.Group`
  - `Input.Group` 弃用,变为 `Space.Compact`。
- `InputNumber`
  - `bordered` 弃用,变为 `variant`。
  - `addonAfter` 弃用,变为 `Space.Compact`。
  - `addonBefore` 弃用,变为 `Space.Compact`。
- `Mentions`
  - `Mentions.Option` 弃用,变为 `options`。
- `Menu`
  - `children` 弃用,变为 `items`。
- `Modal`
  - `bodyStyle` 弃用,变为 `styles.body`。
  - `maskStyle` 弃用,变为 `styles.mask`。
  - `destroyOnClose` 弃用,变为 `destroyOnHidden`。
- `Notification`
  - `btn` 弃用,变为 `actions`。
  - `message` 弃用,变为 `title`。
- `Progress`
  - `strokeWidth` 弃用,变为 `size`。
  - `width` 弃用,变为 `size`。
  - `trailColor` 弃用,变为 `railColor`。
  - `gapPosition` 弃用,变为 `gapPlacement`。
- `Select`
  - `dropdownMatchSelectWidth` 弃用,变为 `popupMatchSelectWidth`。
  - `dropdownStyle` 弃用,变为 `styles.popup.root`。
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `popupClassName` 弃用,变为 `classNames.popup.root`。
  - `dropdownRender` 弃用,变为 `popupRender`。
  - `onDropdownVisibleChange` 弃用,变为 `onOpenChange`。
  - `bordered` 弃用,变为 `variant`。
- `Slider`
  - `tooltipPrefixCls` 弃用,变为 `tooltip.prefixCls`。
  - `getTooltipPopupContainer` 弃用,变为 `tooltip.getPopupContainer`。
  - `tipFormatter` 弃用,变为 `tooltip.formatter`。
  - `tooltipPlacement` 弃用,变为 `tooltip.placement`。
  - `tooltipVisible` 弃用,变为 `tooltip.open`。
- `Space.Compact`
  - `direction` 弃用,变为 `orientation`。
- `Space`
  - `direction` 弃用,变为 `orientation`。
  - `split` 弃用,变为 `separator`。
- `Splitter`
  - `layout` 弃用,变为 `orientation`。
- `Countdown`
  - `<Statistic.Countdown />` 弃用,变为 `<Statistic.Timer type="countdown" />`。
- `Statistic`
  - `valueStyle` 弃用,变为 `styles.content`。
- `Steps`
  - `labelPlacement` 弃用,变为 `titlePlacement`。
  - `progressDot` 弃用,变为 `type="dot"`。
  - `direction` 弃用,变为 `orientation`。
  - `items.description` 弃用,变为 `items.content`。
- `Table`
  - `pagination.position` 弃用,变为 `pagination.placement`。
  - `onSelectInvert` 弃用,变为 `onChange`。
  - `filterDropdownOpen` 弃用,变为 `filterDropdownProps.open`。
  - `onFilterDropdownOpenChange` 弃用,变为 `filterDropdownProps.onOpenChange`。
  - `filterCheckall` 弃用,变为 `locale.filterCheckAll`。
- `Tabs`
  - `popupClassName` 弃用,变为 `classNames.popup`。
  - `tabPosition` 弃用,变为 `tabPlacement`。
  - `destroyInactiveTabPane` 弃用,变为 `destroyOnHidden`。
  - `Tabs.TabPane` 弃用,变为 `items`。
- `Tag`
  - `bordered={false}` 弃用,变为 `variant="filled"`。
  - `color="xxx-inverse"` 弃用,变为 `variant="solid"`。
- `TimePicker`
  - `addon` 弃用,变为 `renderExtraFooter`。
- `Timeline`
  - `Timeline.Item` 弃用,变为 `items`。
  - `pending` 弃用,变为 `items`。
  - `pendingDot` 弃用,变为 `items`。
  - `mode=left|right` 弃用,变为 `mode=start|end`。
- `Tooltip`
  - `overlayStyle` 弃用,变为 `styles.root`。
  - `overlayInnerStyle` 弃用,变为 `styles.container`。
  - `overlayClassName` 弃用,变为 `classNames.root`。
  - `destroyTooltipOnHide` 弃用,变为 `destroyOnHidden`。
- `Transfer`
  - `listStyle` 弃用,变为 `styles.section`。
  - `operationStyle` 弃用,变为 `styles.actions`。
  - `operations` 弃用,变为 `actions`。
- `TreeSelect`
  - `dropdownMatchSelectWidth` 弃用,变为 `popupMatchSelectWidth`。
  - `dropdownStyle` 弃用,变为 `styles.popup.root`。
  - `dropdownClassName` 弃用,变为 `classNames.popup.root`。
  - `popupClassName` 弃用,变为 `classNames.popup.root`。
  - `dropdownRender` 弃用,变为 `popupRender`。
  - `onDropdownVisibleChange` 弃用,变为 `onOpenChange`。
  - `bordered` 弃用,变为 `variant`。
### 弹层类组件(Modal、Drawer 等)
- 新增 `mask` 蒙层功能,并支持模糊效果。
- 默认开启,可通过以下方式关闭模糊:
```tsx
import { ConfigProvider, Drawer, Modal } from 'antd';
export default () => (
  <ConfigProvider
    modal={{
      mask: {
        blur: false,
      },
    }}
    drawer={{
      mask: {
        blur: false,
      },
    }}
  >
    <Modal />
    <Drawer />
  </ConfigProvider>
);
```
### Tag margin 调整
v6 移除了 `Tag` 组件末尾的默认外边距(以前 Tag 末尾会额外留出一段 `margin-inline-end`)。如果你的布局或自定义样式依赖这一行为,请使用 `ConfigProvider` 的 `tag.styles` 进行补充:
```tsx
import { ConfigProvider, Tag } from 'antd';
export default () => (
  <ConfigProvider
    tag={{
      styles: {
        root: {
          marginInlineEnd: 8,
        },
      },
    }}
  >
    <Tag>Tag A</Tag>
    <Tag>Tag B</Tag>
    <Tag>Tag C</Tag>
  </ConfigProvider>
);
```
### Form `onFinish` 取值不再包含 Form.List 全部数据
v5 版本中,Form.List 会被认为是一个 Field,以至于提交时会包含 Form.List 下的所有数据结构即便其子元素的 Form.Item 没有注册过。在 v6 中,Form.List 不再包含未注册的子项数据。因而你不再需要通过 `getFieldsValue({ strict: true })` 来过滤未注册字段。
```diff
    const onFinish = (values) => {
--    const realValues = getFieldsValue({ strict: true });
++    const realValues = values;
      // ...
    }
    <Form onFinish={onFinish} />
```
### 浏览器支持调整
- 默认开启 **CSS variables**,仅支持现代浏览器。
- IE 浏览器不再支持,部分旧版国产浏览器可能存在兼容性问题,请在应用发布前确认目标浏览器的支持情况。
### 原子级通过别名安装 v6
- 如果你需要控制升级的影响范围,可以尝试[原子级迁移](https://github.com/ant-design/ant-design/discussions/55957)方案。请注意,这并非我们推荐的升级路径。
## 升级影响排查 Checklist
为了确保升级到 v6 后项目正常运行,请参考以下检查清单逐项确认:
- **React 版本**:确认项目使用的 React 版本 >= 18,并且不再引入 `@ant-design/v5-patch-for-react-19`。
- **@ant-design/icons 版本**:确认 `@ant-design/icons` 版本已升级到 >= 6.0.0,与 `antd@6` 匹配。
- **浏览器兼容性**:确认目标用户浏览器均为现代浏览器,且支持 CSS variables。
- **自定义样式检查**:如果有针对组件内部 DOM 节点的 CSS 定制,验证在 v6 下是否依然生效。
- **弹层蒙层配置**:Modal、Drawer 等弹层是否需要关闭 `mask` 的模糊效果,如不需要可保持默认。
- **构建工具配置**:确认升级后构建无报错,CSS 变量和 CSS-in-JS 能正常工作。
- **控制台 warning**:运行应用并观察控制台,处理所有 `legacy API` 的提示。
## 遇到问题
如果您在升级过程中遇到问题,请到 [GitHub issues](https://new-issue.ant.design/) 进行反馈。我们会尽快响应并在文档中完善相关说明。
eslint.config.js
@@ -8,7 +8,7 @@
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
  globalIgnores(['dist']),
  globalIgnores(['dist', 'src.old']),
  {
    files: ['**/*.{ts,tsx}'],
    extends: [
example/App.tsx
New file
@@ -0,0 +1,10 @@
function App() {
  return (
    <div style={{ padding: '20px' }}>
      <h1>admin2-components</h1>
      <p>组件展示示例(待开发)</p>
    </div>
  );
}
export default App;
example/index.css
New file
@@ -0,0 +1,5 @@
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
example/main.tsx
New file
@@ -0,0 +1,5 @@
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App';
createRoot(document.getElementById('root')!).render(<App />);
index.html
@@ -8,6 +8,6 @@
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
    <script type="module" src="/example/main.tsx"></script>
  </body>
</html>
package.json
@@ -7,15 +7,22 @@
    "dev": "vite",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "preview": "vite preview"
    "preview": "vite preview",
    "test": "vitest",
    "test:run": "vitest run"
  },
  "dependencies": {
    "@ant-design/icons": "^6.1.1",
    "antd": "^6.3.5",
    "react": "^19.2.4",
    "react-dom": "^19.2.4"
  },
  "devDependencies": {
    "@eslint/js": "^9.39.4",
    "@playwright/mcp": "^0.0.70",
    "@playwright/test": "^1.59.1",
    "@testing-library/jest-dom": "^6.9.1",
    "@testing-library/react": "^16.3.2",
    "@types/node": "^24.12.0",
    "@types/react": "^19.2.14",
    "@types/react-dom": "^19.2.3",
@@ -26,8 +33,11 @@
    "eslint-plugin-react-refresh": "^0.5.2",
    "eslint-plugin-react-x": "^4.2.1",
    "globals": "^17.4.0",
    "jsdom": "^29.0.2",
    "playwright": "^1.59.1",
    "typescript": "~5.9.3",
    "typescript-eslint": "^8.57.0",
    "vite": "^8.0.1"
    "vite": "^8.0.1",
    "vitest": "^4.1.2"
  }
}
pnpm-lock.yaml
@@ -8,6 +8,9 @@
  .:
    dependencies:
      '@ant-design/icons':
        specifier: ^6.1.1
        version: 6.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
      antd:
        specifier: ^6.3.5
        version: 6.3.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -21,6 +24,18 @@
      '@eslint/js':
        specifier: ^9.39.4
        version: 9.39.4
      '@playwright/mcp':
        specifier: ^0.0.70
        version: 0.0.70
      '@playwright/test':
        specifier: ^1.59.1
        version: 1.59.1
      '@testing-library/jest-dom':
        specifier: ^6.9.1
        version: 6.9.1
      '@testing-library/react':
        specifier: ^16.3.2
        version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
      '@types/node':
        specifier: ^24.12.0
        version: 24.12.0
@@ -51,6 +66,12 @@
      globals:
        specifier: ^17.4.0
        version: 17.4.0
      jsdom:
        specifier: ^29.0.2
        version: 29.0.2
      playwright:
        specifier: ^1.59.1
        version: 1.59.1
      typescript:
        specifier: ~5.9.3
        version: 5.9.3
@@ -60,8 +81,14 @@
      vite:
        specifier: ^8.0.1
        version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
      vitest:
        specifier: ^4.1.2
        version: 4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))
packages:
  '@adobe/css-tools@4.4.4':
    resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
  '@ant-design/colors@8.0.1':
    resolution: {integrity: sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==}
@@ -97,6 +124,17 @@
    peerDependencies:
      react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
      react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
  '@asamuzakjp/css-color@5.1.6':
    resolution: {integrity: sha512-BXWCh8dHs9GOfpo/fWGDJtDmleta2VePN9rn6WQt3GjEbxzutVF4t0x2pmH+7dbMCLtuv3MlwqRsAuxlzFXqFg==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
  '@asamuzakjp/dom-selector@7.0.7':
    resolution: {integrity: sha512-d2BgqDUOS1Hfp4IzKUZqCNz+Kg3Y88AkaBvJK/ZVSQPU1f7OpPNi7nQTH6/oI47Dkdg+Z3e8Yp6ynOu4UMINAQ==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
  '@asamuzakjp/nwsapi@2.3.9':
    resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
  '@babel/code-frame@7.29.0':
    resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
@@ -168,6 +206,46 @@
  '@babel/types@7.29.0':
    resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
    engines: {node: '>=6.9.0'}
  '@bramus/specificity@2.4.2':
    resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
    hasBin: true
  '@csstools/color-helpers@6.0.2':
    resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==}
    engines: {node: '>=20.19.0'}
  '@csstools/css-calc@3.1.1':
    resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==}
    engines: {node: '>=20.19.0'}
    peerDependencies:
      '@csstools/css-parser-algorithms': ^4.0.0
      '@csstools/css-tokenizer': ^4.0.0
  '@csstools/css-color-parser@4.0.2':
    resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==}
    engines: {node: '>=20.19.0'}
    peerDependencies:
      '@csstools/css-parser-algorithms': ^4.0.0
      '@csstools/css-tokenizer': ^4.0.0
  '@csstools/css-parser-algorithms@4.0.0':
    resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
    engines: {node: '>=20.19.0'}
    peerDependencies:
      '@csstools/css-tokenizer': ^4.0.0
  '@csstools/css-syntax-patches-for-csstree@1.1.2':
    resolution: {integrity: sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==}
    peerDependencies:
      css-tree: ^3.2.1
    peerDependenciesMeta:
      css-tree:
        optional: true
  '@csstools/css-tokenizer@4.0.0':
    resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
    engines: {node: '>=20.19.0'}
  '@emnapi/core@1.9.1':
    resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==}
@@ -257,6 +335,15 @@
    resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
  '@exodus/bytes@1.15.0':
    resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
    peerDependencies:
      '@noble/hashes': ^1.8.0 || ^2.0.0
    peerDependenciesMeta:
      '@noble/hashes':
        optional: true
  '@humanfs/core@0.19.1':
    resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
    engines: {node: '>=18.18.0'}
@@ -297,6 +384,16 @@
  '@oxc-project/types@0.122.0':
    resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==}
  '@playwright/mcp@0.0.70':
    resolution: {integrity: sha512-Kl0a6l9VL8rvT1oBou3hS5yArjwWV9UlwAkq+0skfK1YVg8XfmmNaAmwZhMeNx/ZhGiWXfCllo6rD/jvZz+WuA==}
    engines: {node: '>=18'}
    hasBin: true
  '@playwright/test@1.59.1':
    resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==}
    engines: {node: '>=18'}
    hasBin: true
  '@rc-component/async-validator@5.1.0':
    resolution: {integrity: sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==}
@@ -682,8 +779,43 @@
  '@rolldown/pluginutils@1.0.0-rc.7':
    resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
  '@standard-schema/spec@1.1.0':
    resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
  '@testing-library/dom@10.4.1':
    resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
    engines: {node: '>=18'}
  '@testing-library/jest-dom@6.9.1':
    resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==}
    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
  '@testing-library/react@16.3.2':
    resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
    engines: {node: '>=18'}
    peerDependencies:
      '@testing-library/dom': ^10.0.0
      '@types/react': ^18.0.0 || ^19.0.0
      '@types/react-dom': ^18.0.0 || ^19.0.0
      react: ^18.0.0 || ^19.0.0
      react-dom: ^18.0.0 || ^19.0.0
    peerDependenciesMeta:
      '@types/react':
        optional: true
      '@types/react-dom':
        optional: true
  '@tybys/wasm-util@0.10.1':
    resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
  '@types/aria-query@5.0.4':
    resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
  '@types/chai@5.2.3':
    resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
  '@types/deep-eql@4.0.2':
    resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
  '@types/estree@1.0.8':
    resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -774,6 +906,35 @@
      babel-plugin-react-compiler:
        optional: true
  '@vitest/expect@4.1.2':
    resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==}
  '@vitest/mocker@4.1.2':
    resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==}
    peerDependencies:
      msw: ^2.4.9
      vite: ^6.0.0 || ^7.0.0 || ^8.0.0
    peerDependenciesMeta:
      msw:
        optional: true
      vite:
        optional: true
  '@vitest/pretty-format@4.1.2':
    resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==}
  '@vitest/runner@4.1.2':
    resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==}
  '@vitest/snapshot@4.1.2':
    resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==}
  '@vitest/spy@4.1.2':
    resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==}
  '@vitest/utils@4.1.2':
    resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==}
  acorn-jsx@5.3.2:
    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
    peerDependencies:
@@ -787,9 +948,17 @@
  ajv@6.14.0:
    resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==}
  ansi-regex@5.0.1:
    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
    engines: {node: '>=8'}
  ansi-styles@4.3.0:
    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
    engines: {node: '>=8'}
  ansi-styles@5.2.0:
    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
    engines: {node: '>=10'}
  antd@6.3.5:
    resolution: {integrity: sha512-8BPz9lpZWQm42PTx7yL4KxWAotVuqINiKcoYRcLtdd5BFmAcAZicVyFTnBJyRDlzGZFZeRW3foGu6jXYFnej6Q==}
@@ -799,6 +968,17 @@
  argparse@2.0.1:
    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
  aria-query@5.3.0:
    resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
  aria-query@5.3.2:
    resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
    engines: {node: '>= 0.4'}
  assertion-error@2.0.1:
    resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
    engines: {node: '>=12'}
  balanced-match@1.0.2:
    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -811,6 +991,9 @@
    resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==}
    engines: {node: '>=6.0.0'}
    hasBin: true
  bidi-js@1.0.3:
    resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
  brace-expansion@1.1.13:
    resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==}
@@ -830,6 +1013,10 @@
  caniuse-lite@1.0.30001784:
    resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==}
  chai@6.2.2:
    resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
    engines: {node: '>=18'}
  chalk@4.1.2:
    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -862,8 +1049,19 @@
    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
    engines: {node: '>= 8'}
  css-tree@3.2.1:
    resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
  css.escape@1.5.1:
    resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
  csstype@3.2.3:
    resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
  data-urls@7.0.0:
    resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
  dayjs@1.11.20:
    resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
@@ -877,15 +1075,35 @@
      supports-color:
        optional: true
  decimal.js@10.6.0:
    resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
  deep-is@0.1.4:
    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
  dequal@2.0.3:
    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
    engines: {node: '>=6'}
  detect-libc@2.1.2:
    resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
    engines: {node: '>=8'}
  dom-accessibility-api@0.5.16:
    resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
  dom-accessibility-api@0.6.3:
    resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
  electron-to-chromium@1.5.330:
    resolution: {integrity: sha512-jFNydB5kFtYUobh4IkWUnXeyDbjf/r9gcUEXe1xcrcUxIGfTdzPXA+ld6zBRbwvgIGVzDll/LTIiDztEtckSnA==}
  entities@6.0.1:
    resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
    engines: {node: '>=0.12'}
  es-module-lexer@2.0.0:
    resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
  escalade@3.2.0:
    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
@@ -962,9 +1180,16 @@
    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
    engines: {node: '>=4.0'}
  estree-walker@3.0.3:
    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
  esutils@2.0.3:
    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
    engines: {node: '>=0.10.0'}
  expect-type@1.3.0:
    resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
    engines: {node: '>=12.0.0'}
  fast-deep-equal@3.1.3:
    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -999,6 +1224,11 @@
  flatted@3.4.2:
    resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
  fsevents@2.3.2:
    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
    os: [darwin]
  fsevents@2.3.3:
    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -1030,6 +1260,10 @@
  hermes-parser@0.25.1:
    resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
  html-encoding-sniffer@6.0.0:
    resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
  ignore@5.3.2:
    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
    engines: {node: '>= 4'}
@@ -1046,6 +1280,10 @@
    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
    engines: {node: '>=0.8.19'}
  indent-string@4.0.0:
    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
    engines: {node: '>=8'}
  is-extglob@2.1.1:
    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
    engines: {node: '>=0.10.0'}
@@ -1057,6 +1295,9 @@
  is-mobile@5.0.0:
    resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==}
  is-potential-custom-element-name@1.0.1:
    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
  isexe@2.0.0:
    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -1066,6 +1307,15 @@
  js-yaml@4.1.1:
    resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
    hasBin: true
  jsdom@29.0.2:
    resolution: {integrity: sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==}
    engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0}
    peerDependencies:
      canvas: ^3.0.0
    peerDependenciesMeta:
      canvas:
        optional: true
  jsesc@3.1.0:
    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
@@ -1177,8 +1427,26 @@
  lodash.merge@4.6.2:
    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
  lru-cache@11.3.2:
    resolution: {integrity: sha512-wgWa6FWQ3QRRJbIjbsldRJZxdxYngT/dO0I5Ynmlnin8qy7tC6xYzbcJjtN4wHLXtkbVwHzk0C+OejVw1XM+DQ==}
    engines: {node: 20 || >=22}
  lru-cache@5.1.1:
    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
  lz-string@1.5.0:
    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
    hasBin: true
  magic-string@0.30.21:
    resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
  mdn-data@2.27.1:
    resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
  min-indent@1.0.1:
    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
    engines: {node: '>=4'}
  minimatch@10.2.5:
    resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
@@ -1201,6 +1469,9 @@
  node-releases@2.0.36:
    resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
  obug@2.1.1:
    resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
  optionator@0.9.4:
    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
    engines: {node: '>= 0.8.0'}
@@ -1217,6 +1488,9 @@
    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
    engines: {node: '>=6'}
  parse5@8.0.0:
    resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==}
  path-exists@4.0.0:
    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
    engines: {node: '>=8'}
@@ -1225,12 +1499,35 @@
    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
    engines: {node: '>=8'}
  pathe@2.0.3:
    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
  picocolors@1.1.1:
    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
  picomatch@4.0.4:
    resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
    engines: {node: '>=12'}
  playwright-core@1.59.1:
    resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==}
    engines: {node: '>=18'}
    hasBin: true
  playwright-core@1.60.0-alpha-1774999321000:
    resolution: {integrity: sha512-ams3Zo4VXxeOg5ZTTh16GkE8g48Bmxo/9pg9gXl9SVKlVohCU7Jaog7XntY8yFuzENA6dJc1Fz7Z/NNTm9nGEw==}
    engines: {node: '>=18'}
    hasBin: true
  playwright@1.59.1:
    resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==}
    engines: {node: '>=18'}
    hasBin: true
  playwright@1.60.0-alpha-1774999321000:
    resolution: {integrity: sha512-Bd5DkzYKG+2g1jLO6NeTXmGLbBYSFffJIOsR4l4hUBkJvzvGGdLZ7jZb2tOtb0WIoWXQKdQj3Ap6WthV4DBS8w==}
    engines: {node: '>=18'}
    hasBin: true
  postcss@8.5.8:
    resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
@@ -1239,6 +1536,10 @@
  prelude-ls@1.2.1:
    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
    engines: {node: '>= 0.8.0'}
  pretty-format@27.5.1:
    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
  punycode@2.3.1:
    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -1249,11 +1550,22 @@
    peerDependencies:
      react: ^19.2.4
  react-is@17.0.2:
    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
  react-is@18.3.1:
    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
  react@19.2.4:
    resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
    engines: {node: '>=0.10.0'}
  redent@3.0.0:
    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
    engines: {node: '>=8'}
  require-from-string@2.0.2:
    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
    engines: {node: '>=0.10.0'}
  resolve-from@4.0.0:
@@ -1264,6 +1576,10 @@
    resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==}
    engines: {node: ^20.19.0 || >=22.12.0}
    hasBin: true
  saxes@6.0.0:
    resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
    engines: {node: '>=v12.22.7'}
  scheduler@0.27.0:
    resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -1288,15 +1604,28 @@
    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
    engines: {node: '>=8'}
  siginfo@2.0.0:
    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
  source-map-js@1.2.1:
    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
    engines: {node: '>=0.10.0'}
  stackback@0.0.2:
    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
  std-env@4.0.0:
    resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==}
  string-convert@0.2.1:
    resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
  string-ts@2.3.1:
    resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==}
  strip-indent@3.0.0:
    resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
    engines: {node: '>=8'}
  strip-json-comments@3.1.1:
    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
@@ -1309,13 +1638,42 @@
    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
    engines: {node: '>=8'}
  symbol-tree@3.2.4:
    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
  throttle-debounce@5.0.2:
    resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
    engines: {node: '>=12.22'}
  tinybench@2.9.0:
    resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
  tinyexec@1.0.4:
    resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==}
    engines: {node: '>=18'}
  tinyglobby@0.2.15:
    resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
    engines: {node: '>=12.0.0'}
  tinyrainbow@3.1.0:
    resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==}
    engines: {node: '>=14.0.0'}
  tldts-core@7.0.28:
    resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==}
  tldts@7.0.28:
    resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==}
    hasBin: true
  tough-cookie@6.0.1:
    resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}
    engines: {node: '>=16'}
  tr46@6.0.0:
    resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
    engines: {node: '>=20'}
  ts-api-utils@2.5.0:
    resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
@@ -1347,6 +1705,10 @@
  undici-types@7.16.0:
    resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
  undici@7.24.7:
    resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==}
    engines: {node: '>=20.18.1'}
  update-browserslist-db@1.2.3:
    resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
@@ -1400,14 +1762,77 @@
      yaml:
        optional: true
  vitest@4.1.2:
    resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==}
    engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
    hasBin: true
    peerDependencies:
      '@edge-runtime/vm': '*'
      '@opentelemetry/api': ^1.9.0
      '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
      '@vitest/browser-playwright': 4.1.2
      '@vitest/browser-preview': 4.1.2
      '@vitest/browser-webdriverio': 4.1.2
      '@vitest/ui': 4.1.2
      happy-dom: '*'
      jsdom: '*'
      vite: ^6.0.0 || ^7.0.0 || ^8.0.0
    peerDependenciesMeta:
      '@edge-runtime/vm':
        optional: true
      '@opentelemetry/api':
        optional: true
      '@types/node':
        optional: true
      '@vitest/browser-playwright':
        optional: true
      '@vitest/browser-preview':
        optional: true
      '@vitest/browser-webdriverio':
        optional: true
      '@vitest/ui':
        optional: true
      happy-dom:
        optional: true
      jsdom:
        optional: true
  w3c-xmlserializer@5.0.0:
    resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
    engines: {node: '>=18'}
  webidl-conversions@8.0.1:
    resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
    engines: {node: '>=20'}
  whatwg-mimetype@5.0.0:
    resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
    engines: {node: '>=20'}
  whatwg-url@16.0.1:
    resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==}
    engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
  which@2.0.2:
    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
    engines: {node: '>= 8'}
    hasBin: true
  why-is-node-running@2.3.0:
    resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
    engines: {node: '>=8'}
    hasBin: true
  word-wrap@1.2.5:
    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
    engines: {node: '>=0.10.0'}
  xml-name-validator@5.0.0:
    resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
    engines: {node: '>=18'}
  xmlchars@2.2.0:
    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
  yallist@3.1.1:
    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -1426,6 +1851,8 @@
    resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
snapshots:
  '@adobe/css-tools@4.4.4': {}
  '@ant-design/colors@8.0.1':
    dependencies:
@@ -1472,6 +1899,22 @@
      react: 19.2.4
      react-dom: 19.2.4(react@19.2.4)
      throttle-debounce: 5.0.2
  '@asamuzakjp/css-color@5.1.6':
    dependencies:
      '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-tokenizer': 4.0.0
  '@asamuzakjp/dom-selector@7.0.7':
    dependencies:
      '@asamuzakjp/nwsapi': 2.3.9
      bidi-js: 1.0.3
      css-tree: 3.2.1
      is-potential-custom-element-name: 1.0.1
  '@asamuzakjp/nwsapi@2.3.9': {}
  '@babel/code-frame@7.29.0':
    dependencies:
@@ -1574,6 +2017,34 @@
    dependencies:
      '@babel/helper-string-parser': 7.27.1
      '@babel/helper-validator-identifier': 7.28.5
  '@bramus/specificity@2.4.2':
    dependencies:
      css-tree: 3.2.1
  '@csstools/color-helpers@6.0.2': {}
  '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
    dependencies:
      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-tokenizer': 4.0.0
  '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
    dependencies:
      '@csstools/color-helpers': 6.0.2
      '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
      '@csstools/css-tokenizer': 4.0.0
  '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)':
    dependencies:
      '@csstools/css-tokenizer': 4.0.0
  '@csstools/css-syntax-patches-for-csstree@1.1.2(css-tree@3.2.1)':
    optionalDependencies:
      css-tree: 3.2.1
  '@csstools/css-tokenizer@4.0.0': {}
  '@emnapi/core@1.9.1':
    dependencies:
@@ -1703,6 +2174,8 @@
      '@eslint/core': 0.17.0
      levn: 0.4.1
  '@exodus/bytes@1.15.0': {}
  '@humanfs/core@0.19.1': {}
  '@humanfs/node@0.16.7':
@@ -1741,6 +2214,15 @@
    optional: true
  '@oxc-project/types@0.122.0': {}
  '@playwright/mcp@0.0.70':
    dependencies:
      playwright: 1.60.0-alpha-1774999321000
      playwright-core: 1.60.0-alpha-1774999321000
  '@playwright/test@1.59.1':
    dependencies:
      playwright: 1.59.1
  '@rc-component/async-validator@5.1.0':
    dependencies:
@@ -2142,10 +2624,51 @@
  '@rolldown/pluginutils@1.0.0-rc.7': {}
  '@standard-schema/spec@1.1.0': {}
  '@testing-library/dom@10.4.1':
    dependencies:
      '@babel/code-frame': 7.29.0
      '@babel/runtime': 7.29.2
      '@types/aria-query': 5.0.4
      aria-query: 5.3.0
      dom-accessibility-api: 0.5.16
      lz-string: 1.5.0
      picocolors: 1.1.1
      pretty-format: 27.5.1
  '@testing-library/jest-dom@6.9.1':
    dependencies:
      '@adobe/css-tools': 4.4.4
      aria-query: 5.3.2
      css.escape: 1.5.1
      dom-accessibility-api: 0.6.3
      picocolors: 1.1.1
      redent: 3.0.0
  '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
    dependencies:
      '@babel/runtime': 7.29.2
      '@testing-library/dom': 10.4.1
      react: 19.2.4
      react-dom: 19.2.4(react@19.2.4)
    optionalDependencies:
      '@types/react': 19.2.14
      '@types/react-dom': 19.2.3(@types/react@19.2.14)
  '@tybys/wasm-util@0.10.1':
    dependencies:
      tslib: 2.8.1
    optional: true
  '@types/aria-query@5.0.4': {}
  '@types/chai@5.2.3':
    dependencies:
      '@types/deep-eql': 4.0.2
      assertion-error: 2.0.1
  '@types/deep-eql@4.0.2': {}
  '@types/estree@1.0.8': {}
@@ -2259,6 +2782,47 @@
      '@rolldown/pluginutils': 1.0.0-rc.7
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
  '@vitest/expect@4.1.2':
    dependencies:
      '@standard-schema/spec': 1.1.0
      '@types/chai': 5.2.3
      '@vitest/spy': 4.1.2
      '@vitest/utils': 4.1.2
      chai: 6.2.2
      tinyrainbow: 3.1.0
  '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))':
    dependencies:
      '@vitest/spy': 4.1.2
      estree-walker: 3.0.3
      magic-string: 0.30.21
    optionalDependencies:
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
  '@vitest/pretty-format@4.1.2':
    dependencies:
      tinyrainbow: 3.1.0
  '@vitest/runner@4.1.2':
    dependencies:
      '@vitest/utils': 4.1.2
      pathe: 2.0.3
  '@vitest/snapshot@4.1.2':
    dependencies:
      '@vitest/pretty-format': 4.1.2
      '@vitest/utils': 4.1.2
      magic-string: 0.30.21
      pathe: 2.0.3
  '@vitest/spy@4.1.2': {}
  '@vitest/utils@4.1.2':
    dependencies:
      '@vitest/pretty-format': 4.1.2
      convert-source-map: 2.0.0
      tinyrainbow: 3.1.0
  acorn-jsx@5.3.2(acorn@8.16.0):
    dependencies:
      acorn: 8.16.0
@@ -2272,9 +2836,13 @@
      json-schema-traverse: 0.4.1
      uri-js: 4.4.1
  ansi-regex@5.0.1: {}
  ansi-styles@4.3.0:
    dependencies:
      color-convert: 2.0.1
  ansi-styles@5.2.0: {}
  antd@6.3.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
    dependencies:
@@ -2335,11 +2903,23 @@
  argparse@2.0.1: {}
  aria-query@5.3.0:
    dependencies:
      dequal: 2.0.3
  aria-query@5.3.2: {}
  assertion-error@2.0.1: {}
  balanced-match@1.0.2: {}
  balanced-match@4.0.4: {}
  baseline-browser-mapping@2.10.13: {}
  bidi-js@1.0.3:
    dependencies:
      require-from-string: 2.0.2
  brace-expansion@1.1.13:
    dependencies:
@@ -2361,6 +2941,8 @@
  callsites@3.1.0: {}
  caniuse-lite@1.0.30001784: {}
  chai@6.2.2: {}
  chalk@4.1.2:
    dependencies:
@@ -2389,7 +2971,21 @@
      shebang-command: 2.0.0
      which: 2.0.2
  css-tree@3.2.1:
    dependencies:
      mdn-data: 2.27.1
      source-map-js: 1.2.1
  css.escape@1.5.1: {}
  csstype@3.2.3: {}
  data-urls@7.0.0:
    dependencies:
      whatwg-mimetype: 5.0.0
      whatwg-url: 16.0.1
    transitivePeerDependencies:
      - '@noble/hashes'
  dayjs@1.11.20: {}
@@ -2397,11 +2993,23 @@
    dependencies:
      ms: 2.1.3
  decimal.js@10.6.0: {}
  deep-is@0.1.4: {}
  dequal@2.0.3: {}
  detect-libc@2.1.2: {}
  dom-accessibility-api@0.5.16: {}
  dom-accessibility-api@0.6.3: {}
  electron-to-chromium@1.5.330: {}
  entities@6.0.1: {}
  es-module-lexer@2.0.0: {}
  escalade@3.2.0: {}
@@ -2525,7 +3133,13 @@
  estraverse@5.3.0: {}
  estree-walker@3.0.3:
    dependencies:
      '@types/estree': 1.0.8
  esutils@2.0.3: {}
  expect-type@1.3.0: {}
  fast-deep-equal@3.1.3: {}
@@ -2553,6 +3167,9 @@
  flatted@3.4.2: {}
  fsevents@2.3.2:
    optional: true
  fsevents@2.3.3:
    optional: true
@@ -2574,6 +3191,12 @@
    dependencies:
      hermes-estree: 0.25.1
  html-encoding-sniffer@6.0.0:
    dependencies:
      '@exodus/bytes': 1.15.0
    transitivePeerDependencies:
      - '@noble/hashes'
  ignore@5.3.2: {}
  ignore@7.0.5: {}
@@ -2585,6 +3208,8 @@
  imurmurhash@0.1.4: {}
  indent-string@4.0.0: {}
  is-extglob@2.1.1: {}
  is-glob@4.0.3:
@@ -2593,6 +3218,8 @@
  is-mobile@5.0.0: {}
  is-potential-custom-element-name@1.0.1: {}
  isexe@2.0.0: {}
  js-tokens@4.0.0: {}
@@ -2600,6 +3227,32 @@
  js-yaml@4.1.1:
    dependencies:
      argparse: 2.0.1
  jsdom@29.0.2:
    dependencies:
      '@asamuzakjp/css-color': 5.1.6
      '@asamuzakjp/dom-selector': 7.0.7
      '@bramus/specificity': 2.4.2
      '@csstools/css-syntax-patches-for-csstree': 1.1.2(css-tree@3.2.1)
      '@exodus/bytes': 1.15.0
      css-tree: 3.2.1
      data-urls: 7.0.0
      decimal.js: 10.6.0
      html-encoding-sniffer: 6.0.0
      is-potential-custom-element-name: 1.0.1
      lru-cache: 11.3.2
      parse5: 8.0.0
      saxes: 6.0.0
      symbol-tree: 3.2.4
      tough-cookie: 6.0.1
      undici: 7.24.7
      w3c-xmlserializer: 5.0.0
      webidl-conversions: 8.0.1
      whatwg-mimetype: 5.0.0
      whatwg-url: 16.0.1
      xml-name-validator: 5.0.0
    transitivePeerDependencies:
      - '@noble/hashes'
  jsesc@3.1.0: {}
@@ -2679,9 +3332,21 @@
  lodash.merge@4.6.2: {}
  lru-cache@11.3.2: {}
  lru-cache@5.1.1:
    dependencies:
      yallist: 3.1.1
  lz-string@1.5.0: {}
  magic-string@0.30.21:
    dependencies:
      '@jridgewell/sourcemap-codec': 1.5.5
  mdn-data@2.27.1: {}
  min-indent@1.0.1: {}
  minimatch@10.2.5:
    dependencies:
@@ -2698,6 +3363,8 @@
  natural-compare@1.4.0: {}
  node-releases@2.0.36: {}
  obug@2.1.1: {}
  optionator@0.9.4:
    dependencies:
@@ -2720,13 +3387,35 @@
    dependencies:
      callsites: 3.1.0
  parse5@8.0.0:
    dependencies:
      entities: 6.0.1
  path-exists@4.0.0: {}
  path-key@3.1.1: {}
  pathe@2.0.3: {}
  picocolors@1.1.1: {}
  picomatch@4.0.4: {}
  playwright-core@1.59.1: {}
  playwright-core@1.60.0-alpha-1774999321000: {}
  playwright@1.59.1:
    dependencies:
      playwright-core: 1.59.1
    optionalDependencies:
      fsevents: 2.3.2
  playwright@1.60.0-alpha-1774999321000:
    dependencies:
      playwright-core: 1.60.0-alpha-1774999321000
    optionalDependencies:
      fsevents: 2.3.2
  postcss@8.5.8:
    dependencies:
@@ -2736,6 +3425,12 @@
  prelude-ls@1.2.1: {}
  pretty-format@27.5.1:
    dependencies:
      ansi-regex: 5.0.1
      ansi-styles: 5.2.0
      react-is: 17.0.2
  punycode@2.3.1: {}
  react-dom@19.2.4(react@19.2.4):
@@ -2743,9 +3438,18 @@
      react: 19.2.4
      scheduler: 0.27.0
  react-is@17.0.2: {}
  react-is@18.3.1: {}
  react@19.2.4: {}
  redent@3.0.0:
    dependencies:
      indent-string: 4.0.0
      strip-indent: 3.0.0
  require-from-string@2.0.2: {}
  resolve-from@4.0.0: {}
@@ -2773,6 +3477,10 @@
      - '@emnapi/core'
      - '@emnapi/runtime'
  saxes@6.0.0:
    dependencies:
      xmlchars: 2.2.0
  scheduler@0.27.0: {}
  scroll-into-view-if-needed@3.1.0:
@@ -2789,11 +3497,21 @@
  shebang-regex@3.0.0: {}
  siginfo@2.0.0: {}
  source-map-js@1.2.1: {}
  stackback@0.0.2: {}
  std-env@4.0.0: {}
  string-convert@0.2.1: {}
  string-ts@2.3.1: {}
  strip-indent@3.0.0:
    dependencies:
      min-indent: 1.0.1
  strip-json-comments@3.1.1: {}
@@ -2803,12 +3521,34 @@
    dependencies:
      has-flag: 4.0.0
  symbol-tree@3.2.4: {}
  throttle-debounce@5.0.2: {}
  tinybench@2.9.0: {}
  tinyexec@1.0.4: {}
  tinyglobby@0.2.15:
    dependencies:
      fdir: 6.5.0(picomatch@4.0.4)
      picomatch: 4.0.4
  tinyrainbow@3.1.0: {}
  tldts-core@7.0.28: {}
  tldts@7.0.28:
    dependencies:
      tldts-core: 7.0.28
  tough-cookie@6.0.1:
    dependencies:
      tldts: 7.0.28
  tr46@6.0.0:
    dependencies:
      punycode: 2.3.1
  ts-api-utils@2.5.0(typescript@5.9.3):
    dependencies:
@@ -2838,6 +3578,8 @@
  undici-types@7.16.0: {}
  undici@7.24.7: {}
  update-browserslist-db@1.2.3(browserslist@4.28.2):
    dependencies:
      browserslist: 4.28.2
@@ -2862,12 +3604,65 @@
      - '@emnapi/core'
      - '@emnapi/runtime'
  vitest@4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)):
    dependencies:
      '@vitest/expect': 4.1.2
      '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))
      '@vitest/pretty-format': 4.1.2
      '@vitest/runner': 4.1.2
      '@vitest/snapshot': 4.1.2
      '@vitest/spy': 4.1.2
      '@vitest/utils': 4.1.2
      es-module-lexer: 2.0.0
      expect-type: 1.3.0
      magic-string: 0.30.21
      obug: 2.1.1
      pathe: 2.0.3
      picomatch: 4.0.4
      std-env: 4.0.0
      tinybench: 2.9.0
      tinyexec: 1.0.4
      tinyglobby: 0.2.15
      tinyrainbow: 3.1.0
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
      why-is-node-running: 2.3.0
    optionalDependencies:
      '@types/node': 24.12.0
      jsdom: 29.0.2
    transitivePeerDependencies:
      - msw
  w3c-xmlserializer@5.0.0:
    dependencies:
      xml-name-validator: 5.0.0
  webidl-conversions@8.0.1: {}
  whatwg-mimetype@5.0.0: {}
  whatwg-url@16.0.1:
    dependencies:
      '@exodus/bytes': 1.15.0
      tr46: 6.0.0
      webidl-conversions: 8.0.1
    transitivePeerDependencies:
      - '@noble/hashes'
  which@2.0.2:
    dependencies:
      isexe: 2.0.0
  why-is-node-running@2.3.0:
    dependencies:
      siginfo: 2.0.0
      stackback: 0.0.2
  word-wrap@1.2.5: {}
  xml-name-validator@5.0.0: {}
  xmlchars@2.2.0: {}
  yallist@3.1.1: {}
  yocto-queue@0.1.0: {}
public/favicon.svg
File was deleted
public/icons.svg
File was deleted
src/App.css
File was deleted
src/App.tsx
File was deleted
src/assets/hero.png
Binary files differ
src/assets/react.svg
File was deleted
src/assets/vite.svg
File was deleted
src/index.css
File was deleted
src/main.tsx
File was deleted
src/types.ts
New file
@@ -0,0 +1 @@
// 组件类型定义(待实现)
test/setup.ts
New file
@@ -0,0 +1 @@
import '@testing-library/jest-dom'
vitest.config.ts
New file
@@ -0,0 +1,12 @@
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
// https://vitest.dev/config/
export default defineConfig({
  plugins: [react()],
  test: {
    environment: 'jsdom',
    globals: true,
    setupFiles: ['./test/setup.ts'],
  },
})