diff --git a/packages/inula2-ui/README.en.md b/packages/inula2-ui/README.en.md
new file mode 100644
index 0000000000000000000000000000000000000000..6352abc7390c6e3c17a7a53fa86a5dcf14c0a09b
--- /dev/null
+++ b/packages/inula2-ui/README.en.md
@@ -0,0 +1,36 @@
+# inula2-ui
+
+#### Description
+基于openInula2.0的UI组件库
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Instructions
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Contribution
+
+1. Fork the repository
+2. Create Feat_xxx branch
+3. Commit your code
+4. Create Pull Request
+
+
+#### Gitee Feature
+
+1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4. The most valuable open source project [GVP](https://gitee.com/gvp)
+5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/packages/inula2-ui/README.md b/packages/inula2-ui/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5c88ed6580e8c9d52fd88b628488d5d26bfee41c
--- /dev/null
+++ b/packages/inula2-ui/README.md
@@ -0,0 +1,69 @@
+# openinula2.0 Component Library
+
+[](https://npmjs.org/package/inulaUI)
+[](https://npmjs.org/package/inulaUI)
+
+## Project Overview
+
+openinula2.0 Component Library is a modern React UI component library based on [openinula](https://github.com/openinula/openinula). It includes a rich set of foundational components suitable for enterprise-level middle/backend and mobile application development. The component library features a modern design style, supports light/dark theme switching, and offers excellent extensibility and usability.
+
+## Development Guide
+
+Navigate to the library directory:
+
+```bash
+npm install
+npm run dev
+```
+
+Components should be named in lowercase and placed in the components directory. The directory structure is as follows (using Button component as an example):
+
+```
+button/
+├── demos/ # Button examples (different functionalities in separate files)
+├── demo.jsx # Main demo file for button
+├── index.jsx # Button component implementation
+└── index.css # Button styles
+```
+
+## Directory Structure
+
+```
+openInula2.0_Library/
+├── inulaUI/ # Main component library package
+│ ├── docs/ # Documentation & guides
+│ ├── src/ # Component source code
+│ │ ├── button/ # Button component
+│ │ │ ├── demos/ # Button component demos
+│ │ │ ├── index.jsx # Button component implementation
+│ │ │ ├── index.md # Button component documentation
+│ │ │ └── index.css # Button styles
+│ │ ├── index.ts # Entry file
+│ │ └── global.d.ts # Global type declarations
+│ ├── package.json # Component library package configuration
+│ └── ...
+├── library_code/ # Demo/Test project for component library
+│ ├── src/
+│ │ ├── components/
+│ │ │ └── button/
+│ │ │ ├── demos/ # Button demos
+│ │ │ ├── demo.jsx
+│ │ │ ├── index.jsx
+│ │ │ └── index.css
+│ │ ├── index.jsx # Entry point
+│ │ └── index.css
+│ ├── index.html
+│ └── ...
+└── README.md # Project documentation
+```
+
+## Contribution Guide
+
+1. Fork this repository and create your feature branch.
+2. Ensure all lint checks and unit tests pass before submitting code.
+3. Provide detailed description of changes when submitting PR.
+4. Contributions including documentation improvements, bug fixes, or new components are welcome.
+
+## License
+
+MIT
diff --git a/packages/inula2-ui/inulaUI/.dumirc.ts b/packages/inula2-ui/inulaUI/.dumirc.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bac3f3e0efdceee275ff52619b323dc45b6b4b13
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.dumirc.ts
@@ -0,0 +1,74 @@
+import { defineConfig } from 'dumi';
+export default defineConfig({
+ outputPath: 'docs-dist',
+ themeConfig: {
+ name: 'InulaUI',
+ nav: [
+ {
+ title: '指南',
+ link: '/guide',
+ },
+ {
+ title: '组件',
+ link: '/components/button',
+ },
+ {
+ title: '更新日志',
+ link: '/changelog',
+ },
+ {
+ title: '贡献指南',
+ link: '/contributing',
+ },
+ ],
+ sidebar: {
+ '/components': [
+ {
+ title: 'Basic 基础组件',
+ children: [
+ { title: 'Button 按钮', link: '/components/button' },
+ // { title: 'Icon 图标', link: '/components/icon' },
+ // { title: 'FloatButton 悬浮按钮', link: '/components/floatbutton' },
+ { title: 'Breadcrumb 面包屑', link: '/components/breadcrumb' },
+ ],
+ },
+ {
+ title: '导航',
+ children: [{ title: 'Tabs 标签页', link: '/components/tabs' }],
+ },
+ {
+ title: 'Form 表单组件',
+ children: [
+ { title: 'Checkbox 多选框', link: '/components/checkbox' },
+ { title: 'DatePicker 日期选择器', link: '/components/datepicker' },
+ { title: 'Form 表单', link: '/components/form' },
+ { title: 'Input 输入框', link: '/components/input' },
+ { title: 'Radio 单选框', link: '/components/radio' },
+ { title: 'Select 选择器', link: '/components/select' },
+ { title: 'Switch 开关', link: '/components/switch' },
+ ],
+ },
+ {
+ title: 'Data 数据展示',
+ children: [
+ { title: 'Card 卡片', link: '/components/card' },
+ { title: 'Tooltip 文字提示', link: '/components/tooltip' },
+ { title: 'Tag 标签', link: '/components/tag' },
+ { title: 'Tree 树形控件', link: '/components/tree' },
+ ],
+ },
+ {
+ title: '反馈',
+ children: [
+ { title: 'Modal 对话框', link: '/components/dialog' },
+ { title: 'Spin 加载中', link: '/components/spin' },
+ {
+ title: 'Notification 通知提示框',
+ link: '/components/notification',
+ },
+ ],
+ },
+ ],
+ },
+ },
+});
diff --git a/packages/inula2-ui/inulaUI/.editorconfig b/packages/inula2-ui/inulaUI/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..e717f5eb6387be229227ad8eba6a56f4cd904ade
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.editorconfig
@@ -0,0 +1,13 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/packages/inula2-ui/inulaUI/.eslintrc.js b/packages/inula2-ui/inulaUI/.eslintrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..28983409455cb5f31b65d20feb08096fedd3be09
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: require.resolve('@umijs/lint/dist/config/eslint'),
+};
diff --git a/packages/inula2-ui/inulaUI/.fatherrc.ts b/packages/inula2-ui/inulaUI/.fatherrc.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dae25c88b1a4d6ccb903b44bb04cd6c60f1db328
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.fatherrc.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from 'father';
+
+export default defineConfig({
+ // more father config: https://github.com/umijs/father/blob/master/docs/config.md
+ esm: { output: 'dist' },
+});
diff --git a/packages/inula2-ui/inulaUI/.gitignore b/packages/inula2-ui/inulaUI/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..cf89318df8a56faf24d3ea7f5237d38b21e27b6b
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+/dist
+.dumi/tmp
+.dumi/tmp-test
+.dumi/tmp-production
+.DS_Store
diff --git a/packages/inula2-ui/inulaUI/.husky/commit-msg b/packages/inula2-ui/inulaUI/.husky/commit-msg
new file mode 100644
index 0000000000000000000000000000000000000000..5b0b35410a273f2b7dd7e2abcfb5c5670c49eae0
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx commitlint --edit "${1}"
diff --git a/packages/inula2-ui/inulaUI/.husky/pre-commit b/packages/inula2-ui/inulaUI/.husky/pre-commit
new file mode 100644
index 0000000000000000000000000000000000000000..d24fdfc601b9ffe8ccc3fca5d3b873109dc56c4a
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/packages/inula2-ui/inulaUI/.prettierignore b/packages/inula2-ui/inulaUI/.prettierignore
new file mode 100644
index 0000000000000000000000000000000000000000..6a50e206c7f7445fdc8f3e2beb97101e7a9a6eb2
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.prettierignore
@@ -0,0 +1,2 @@
+/dist
+*.yaml
diff --git a/packages/inula2-ui/inulaUI/.prettierrc.js b/packages/inula2-ui/inulaUI/.prettierrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6df093da701493005c466ea6c7988a76caf364e
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.prettierrc.js
@@ -0,0 +1,19 @@
+module.exports = {
+ pluginSearchDirs: false,
+ plugins: [
+ require.resolve('prettier-plugin-organize-imports'),
+ require.resolve('prettier-plugin-packagejson'),
+ ],
+ printWidth: 80,
+ proseWrap: 'never',
+ singleQuote: true,
+ trailingComma: 'all',
+ overrides: [
+ {
+ files: '*.md',
+ options: {
+ proseWrap: 'preserve',
+ },
+ },
+ ],
+};
diff --git a/packages/inula2-ui/inulaUI/.stylelintrc b/packages/inula2-ui/inulaUI/.stylelintrc
new file mode 100644
index 0000000000000000000000000000000000000000..e3621944ffb91d709242262861bc0c016a4c7754
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/.stylelintrc
@@ -0,0 +1,3 @@
+{
+ "extends": "@umijs/lint/dist/config/stylelint"
+}
diff --git a/packages/inula2-ui/inulaUI/LICENSE b/packages/inula2-ui/inulaUI/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..7dd6caf49d44eb306288ce09fc2fa9bd081d9d0a
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) chenhaibin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/inula2-ui/inulaUI/README.md b/packages/inula2-ui/inulaUI/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e9cbbfeebd8dad73be5ea95264240b92cfd93fc3
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/README.md
@@ -0,0 +1,43 @@
+# inulaUI
+
+[](https://npmjs.org/package/inulaUI)
+[](https://npmjs.org/package/inulaUI)
+
+A react library developed with dumi
+
+## Usage
+
+TODO
+
+## Options
+
+TODO
+
+## Development
+
+```bash
+# install dependencies
+$ npm install
+
+# develop library by docs demo
+$ npm start
+
+# build library source code
+$ npm run build
+
+# build library source code in watch mode
+$ npm run build:watch
+
+# build docs
+$ npm run docs:build
+
+# Locally preview the production build.
+$ npm run docs:preview
+
+# check your project for potential problems
+$ npm run doctor
+```
+
+## LICENSE
+
+MIT
diff --git a/packages/inula2-ui/inulaUI/docs/guide.md b/packages/inula2-ui/inulaUI/docs/guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..5504ddf6ab57cec0fe2eae5ee3972e0062aa555c
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/docs/guide.md
@@ -0,0 +1 @@
+This is a guide example.
diff --git a/packages/inula2-ui/inulaUI/docs/index.md b/packages/inula2-ui/inulaUI/docs/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..dd7b0e17dcbea3f0c348ab7d0acbc549f0d53492
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/docs/index.md
@@ -0,0 +1,49 @@
+---
+hero:
+ title: inula-UI
+ description: 一个基于 openinula 的 UI 组件库
+ actions:
+ - text: 立即上手
+ link: /guide/quick-start
+ - text: Github
+ link: https://github.com/cychenhaibin/cube
+features:
+ - title: 现代化主题风格
+ image: 💠
+ description: 本主题包采用了流动色、毛玻璃、光影质感、自然动效等现代化的设计表现手法,将界面以更加简约、美观的方式呈现,使得文档更加直观、易读、易用
+ row: 6
+
+ - title: 基于 Ant Design 与 CSSinJS
+ description: 本主题包使用 antd 作为基础组件库,并使用了 CSSinJS 实现样式方案,帮助更好地控制样式的细节,提高样式的复用性和可维护性。底层使用了 antd-style 样式库,在书写样式上更加灵活、可读、易于维护。本主题包算是开发 antd-style 时的一个副产物
+ link: /guide/style
+ imageType: light
+ image: https://gw.alipayobjects.com/zos/hitu-asset/c88e3678-6900-4289-8538-31367c2d30f2/hitu-1609235995955-image.png
+ row: 9
+
+ - title: 亮暗色主题模式一键切换
+ link: /guide/theme
+ description: 本文档基于 antd v5 自定义了亮色与暗色主题算法,默认提供美观易用的亮暗色主题。用户可以根据自己的喜好选择主题模式,在不同的光线环境下都能获得良好的阅读体验。
+ image: https://mdn.alipayobjects.com/huamei_rqvucu/afts/img/A*8KE7T7l39J0AAAAAAAAAAAAADoN6AQ/original
+ imageType: primary
+
+ - title: 精美的语法高亮
+ description: 本主题包提供准确、精美的语法高亮特性。底层采用了现代化的语法高亮库 Shiki 与 Prism,并提供了丰富的代码高亮方案,帮助用户更好地阅读代码 后续会考虑支持代码块片段高亮、关键词高亮等特性
+ link: /guide/syntax-highlighter
+ image: https://mdn.alipayobjects.com/huamei_rqvucu/afts/img/A*1qLNRrRGFsQAAAAAAAAAAAAADoN6AQ/original
+ imageType: primary
+ row: 9
+
+ - title: 组件灵活复用
+ description: 本主题包为本地主题定制提供了很高的灵活度,默认导出了主题包中的精品组件,可以将组件作为独立的模块进行复用,开发者可以在 dumi 本地主题包中自由组合使用
+ image: https://mdn.alipayobjects.com/huamei_rqvucu/afts/img/A*6sjjRa7lLhAAAAAAAAAAAAAADoN6AQ/original
+ imageType: primary
+ link: /components
+ row: 8
+
+ - title: 移动端适配良好
+ description: 本主题包对移动端适配良好,基于 CSSinJS 的灵活样式方案,多套布局实现轻而易举。用户多端操作体验一致且顺滑
+ image: 📱
+ imageType: light
+ row: 6
+ hero: true
+---
diff --git a/packages/inula2-ui/inulaUI/package.json b/packages/inula2-ui/inulaUI/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d22ef4e75c89404ae0a61a362d7b61620ac6a6dd
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "inulaUI",
+ "version": "0.0.1",
+ "description": "A react library developed with dumi",
+ "module": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "scripts": {
+ "start": "npm run dev",
+ "dev": "dumi dev",
+ "build": "father build",
+ "build:watch": "father dev",
+ "docs:build": "dumi build",
+ "docs:preview": "dumi preview",
+ "prepare": "husky install && dumi setup",
+ "doctor": "father doctor",
+ "lint": "npm run lint:es && npm run lint:css",
+ "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"",
+ "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"",
+ "prepublishOnly": "father doctor && npm run build"
+ },
+ "authors": [
+ "chenhaibin"
+ ],
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ]
+ },
+ "lint-staged": {
+ "*.{md,json}": [
+ "prettier --write --no-error-on-unmatched-pattern"
+ ],
+ "*.{css,less}": [
+ "stylelint --fix",
+ "prettier --write"
+ ],
+ "*.{js,jsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ],
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --parser=typescript --write"
+ ]
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^17.1.2",
+ "@commitlint/config-conventional": "^17.1.0",
+ "@openinula/unplugin": "^0.0.3",
+ "@umijs/lint": "^4.0.0",
+ "dumi": "^2.4.13",
+ "eslint": "^8.23.0",
+ "father": "^4.1.0",
+ "husky": "^8.0.1",
+ "lint-staged": "^13.0.3",
+ "prettier": "^2.7.1",
+ "prettier-plugin-organize-imports": "^3.0.0",
+ "prettier-plugin-packagejson": "^2.2.18",
+ "stylelint": "^14.9.1"
+ },
+ "dependencies": {
+ "@openinula/next": "^0.0.5",
+ "pnpm": "^10.12.4"
+ }
+}
diff --git a/packages/inula2-ui/inulaUI/pnpm-lock.yaml b/packages/inula2-ui/inulaUI/pnpm-lock.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a4a93971475b7e35eff7953630dd472658025d9d
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/pnpm-lock.yaml
@@ -0,0 +1,16297 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ pnpm:
+ specifier: ^10.12.4
+ version: 10.12.4
+ devDependencies:
+ '@commitlint/cli':
+ specifier: ^17.1.2
+ version: 17.8.1(@swc/core@1.9.2(@swc/helpers@0.5.1))
+ '@commitlint/config-conventional':
+ specifier: ^17.1.0
+ version: 17.8.1
+ '@types/react':
+ specifier: ^18.0.0
+ version: 18.3.23
+ '@types/react-dom':
+ specifier: ^18.0.0
+ version: 18.3.7(@types/react@18.3.23)
+ '@umijs/lint':
+ specifier: ^4.0.0
+ version: 4.4.11(eslint@8.57.1)(stylelint@14.16.1)(typescript@5.4.2)
+ dumi:
+ specifier: ^2.4.13
+ version: 2.4.21(@babel/core@7.27.7)(@swc/helpers@0.5.1)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ dumi-theme-antd:
+ specifier: ^0.4.4
+ version: 0.4.4(@babel/core@7.27.7)(@types/react@18.3.23)(antd@5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dumi@2.4.21(@babel/core@7.27.7)(@swc/helpers@0.5.1)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ eslint:
+ specifier: ^8.23.0
+ version: 8.57.1
+ father:
+ specifier: ^4.1.0
+ version: 4.5.6(@babel/core@7.27.7)(@types/node@20.5.1)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(type-fest@1.4.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ husky:
+ specifier: ^8.0.1
+ version: 8.0.3
+ lint-staged:
+ specifier: ^13.0.3
+ version: 13.3.0
+ prettier:
+ specifier: ^2.7.1
+ version: 2.8.8
+ prettier-plugin-organize-imports:
+ specifier: ^3.0.0
+ version: 3.2.4(prettier@2.8.8)(typescript@5.4.2)
+ prettier-plugin-packagejson:
+ specifier: ^2.2.18
+ version: 2.5.17(prettier@2.8.8)
+ react:
+ specifier: ^18.0.0
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.0.0
+ version: 18.3.1(react@18.3.1)
+ stylelint:
+ specifier: ^14.9.1
+ version: 14.16.1
+
+packages:
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@ant-design/colors@6.0.0':
+ resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
+
+ '@ant-design/colors@7.2.1':
+ resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==}
+
+ '@ant-design/cssinjs-utils@1.1.3':
+ resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@ant-design/cssinjs@1.20.0':
+ resolution: {integrity: sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/cssinjs@1.23.0':
+ resolution: {integrity: sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/fast-color@2.0.6':
+ resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==}
+ engines: {node: '>=8.x'}
+
+ '@ant-design/icons-svg@4.4.2':
+ resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+
+ '@ant-design/icons@4.8.3':
+ resolution: {integrity: sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/icons@5.3.6':
+ resolution: {integrity: sha512-JeWsgNjvkTTC73YDPgWOgdScRku/iHN9JU0qk39OSEmJSCiRghQMLlxGTCY5ovbRRoXjxHXnUKgQEgBDnQfKmA==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/icons@5.6.1':
+ resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ '@ant-design/react-slick@1.1.2':
+ resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==}
+ peerDependencies:
+ react: '>=16.9.0'
+
+ '@antfu/install-pkg@0.1.1':
+ resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
+
+ '@antfu/utils@0.7.10':
+ resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+ '@arvinxu/layout-kit@1.4.0':
+ resolution: {integrity: sha512-dEsmFwZa/NJ2XvDBL4sCPbgFPvCvpxP+G+90Ay9zqN92vc4YbgVo4NjpjsDihiNqwDQjWhasGCC3+v4w7bdYqg==}
+
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.27.7':
+ resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.23.6':
+ resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.27.7':
+ resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/eslint-parser@7.23.3':
+ resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==}
+ engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+ peerDependencies:
+ '@babel/core': ^7.11.0
+ eslint: ^7.5.0 || ^8.0.0
+
+ '@babel/generator@7.2.0':
+ resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==}
+
+ '@babel/generator@7.27.5':
+ resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.27.3':
+ resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-simple-access@7.27.1':
+ resolution: {integrity: sha512-OU4zVQrJgFBNXMjrHs1yFSdlTgufO4tefcUZoqNhukVfw0p8x1Asht/gcGZ3bpHbi8gu/76m4JhrlKPqkrs/WQ==}
+ 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.27.1':
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.27.6':
+ resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.27.7':
+ resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-async-generators@7.8.4':
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-bigint@7.8.3':
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-properties@7.12.13':
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-static-block@7.14.5':
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.27.1':
+ resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-meta@7.10.4':
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-json-strings@7.8.3':
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.27.1':
+ resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4':
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3':
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3':
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5':
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-top-level-await@7.14.5':
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.23.3':
+ resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.22.3':
+ resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/runtime@7.23.6':
+ resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/runtime@7.27.6':
+ resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.27.7':
+ resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.27.7':
+ resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==}
+ engines: {node: '>=6.9.0'}
+
+ '@bloomberg/record-tuple-polyfill@0.0.4':
+ resolution: {integrity: sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw==}
+
+ '@commitlint/cli@17.8.1':
+ resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==}
+ engines: {node: '>=v14'}
+ hasBin: true
+
+ '@commitlint/config-conventional@17.8.1':
+ resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/config-validator@17.8.1':
+ resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/ensure@17.8.1':
+ resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/execute-rule@17.8.1':
+ resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/format@17.8.1':
+ resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/is-ignored@17.8.1':
+ resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/lint@17.8.1':
+ resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/load@17.8.1':
+ resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/message@17.8.1':
+ resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/parse@17.8.1':
+ resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/read@17.8.1':
+ resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/resolve-extends@17.8.1':
+ resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/rules@17.8.1':
+ resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/to-lines@17.8.1':
+ resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/top-level@17.8.1':
+ resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==}
+ engines: {node: '>=v14'}
+
+ '@commitlint/types@17.8.1':
+ resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==}
+ engines: {node: '>=v14'}
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
+ '@csstools/postcss-color-function@1.1.1':
+ resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-font-format-keywords@1.0.1':
+ resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-hwb-function@1.0.2':
+ resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-ic-unit@1.0.1':
+ resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-is-pseudo-class@2.0.7':
+ resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-normalize-display-values@1.0.1':
+ resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-oklab-function@1.1.1':
+ resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-progressive-custom-properties@1.3.0':
+ resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.3
+
+ '@csstools/postcss-stepped-value-functions@1.0.1':
+ resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/postcss-unset-value@1.0.2':
+ resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ '@csstools/selector-specificity@2.2.0':
+ resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.10
+
+ '@ctrl/tinycolor@3.6.0':
+ resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==}
+ engines: {node: '>=10'}
+
+ '@emotion/babel-plugin@11.13.5':
+ resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==}
+
+ '@emotion/cache@11.14.0':
+ resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==}
+
+ '@emotion/css@11.11.2':
+ resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==}
+
+ '@emotion/hash@0.8.0':
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
+ '@emotion/is-prop-valid@1.3.1':
+ resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==}
+
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+
+ '@emotion/react@11.11.0':
+ resolution: {integrity: sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@emotion/serialize@1.3.3':
+ resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==}
+
+ '@emotion/server@11.11.0':
+ resolution: {integrity: sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==}
+ peerDependencies:
+ '@emotion/css': ^11.0.0-rc.0
+ peerDependenciesMeta:
+ '@emotion/css':
+ optional: true
+
+ '@emotion/sheet@1.4.0':
+ resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
+
+ '@emotion/stylis@0.8.5':
+ resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==}
+
+ '@emotion/unitless@0.10.0':
+ resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==}
+
+ '@emotion/unitless@0.7.5':
+ resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0':
+ resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@emotion/utils@1.4.2':
+ resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==}
+
+ '@emotion/weak-memoize@0.3.1':
+ resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
+
+ '@emotion/weak-memoize@0.4.0':
+ resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
+
+ '@esbuild-kit/cjs-loader@2.4.4':
+ resolution: {integrity: sha512-NfsJX4PdzhwSkfJukczyUiZGc7zNNWZcEAyqeISpDnn0PTfzMJR1aR8xAIPskBejIxBJbIgCCMzbaYa9SXepIg==}
+ deprecated: 'Merged into tsx: https://tsx.is'
+
+ '@esbuild-kit/core-utils@3.3.2':
+ resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
+ deprecated: 'Merged into tsx: https://tsx.is'
+
+ '@esbuild-kit/esm-loader@2.6.5':
+ resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
+ deprecated: 'Merged into tsx: https://tsx.is'
+
+ '@esbuild/aix-ppc64@0.21.4':
+ resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.17.19':
+ resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.18.20':
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.21.4':
+ resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.17.19':
+ resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.18.20':
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.21.4':
+ resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.17.19':
+ resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.18.20':
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.21.4':
+ resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.17.19':
+ resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.18.20':
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.21.4':
+ resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.17.19':
+ resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.18.20':
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.21.4':
+ resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.17.19':
+ resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.21.4':
+ resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.17.19':
+ resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.18.20':
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.21.4':
+ resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.17.19':
+ resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.18.20':
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.21.4':
+ resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.17.19':
+ resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.18.20':
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.21.4':
+ resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.17.19':
+ resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.18.20':
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.21.4':
+ resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.17.19':
+ resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.18.20':
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.21.4':
+ resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.17.19':
+ resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.18.20':
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.21.4':
+ resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.17.19':
+ resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.18.20':
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.21.4':
+ resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.17.19':
+ resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.18.20':
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.21.4':
+ resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.17.19':
+ resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.18.20':
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.21.4':
+ resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.17.19':
+ resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.18.20':
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.21.4':
+ resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.17.19':
+ resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.18.20':
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.21.4':
+ resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.17.19':
+ resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.18.20':
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.21.4':
+ resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.17.19':
+ resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.18.20':
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.21.4':
+ resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.17.19':
+ resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.18.20':
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.21.4':
+ resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.17.19':
+ resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.18.20':
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.21.4':
+ resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.17.19':
+ resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.18.20':
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.21.4':
+ resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.7.0':
+ resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/eslintrc@2.1.4':
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@eslint/js@8.57.1':
+ resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@floating-ui/core@0.6.2':
+ resolution: {integrity: sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg==}
+
+ '@floating-ui/dom@0.4.5':
+ resolution: {integrity: sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw==}
+
+ '@floating-ui/react-dom-interactions@0.3.1':
+ resolution: {integrity: sha512-tP2KEh7EHJr5hokSBHcPGojb+AorDNUf0NYfZGg/M+FsMvCOOsSEeEF0O1NDfETIzDnpbHnCs0DuvCFhSMSStg==}
+ deprecated: Package renamed to @floating-ui/react
+
+ '@floating-ui/react-dom@0.6.3':
+ resolution: {integrity: sha512-hC+pS5D6AgS2wWjbmSQ6UR6Kpy+drvWGJIri6e1EDGADTPsCaa4KzCgmCczHrQeInx9tqs81EyDmbKJYY2swKg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@formatjs/ecma402-abstract@2.3.4':
+ resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==}
+
+ '@formatjs/fast-memoize@2.2.7':
+ resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
+
+ '@formatjs/icu-messageformat-parser@2.11.2':
+ resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==}
+
+ '@formatjs/icu-skeleton-parser@1.8.14':
+ resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==}
+
+ '@formatjs/intl-localematcher@0.6.1':
+ resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==}
+
+ '@formatjs/intl@3.1.6':
+ resolution: {integrity: sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww==}
+ peerDependencies:
+ typescript: ^5.6.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@humanwhocodes/config-array@0.13.0':
+ resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+ engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/object-schema@2.0.3':
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.1.1':
+ resolution: {integrity: sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
+ '@jest/schemas@29.6.3':
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/transform@29.7.0':
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/types@24.9.0':
+ resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==}
+ engines: {node: '>= 6'}
+
+ '@jest/types@27.5.1':
+ resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+ '@jest/types@29.6.3':
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jridgewell/gen-mapping@0.3.10':
+ resolution: {integrity: sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.8':
+ resolution: {integrity: sha512-3EDAPd0B8X1gsQQgGHU8vyxSp2MB414z3roN67fY7nI0GV3GDthHfaWcbCfrC95tpAzA5xUvAuoO9Dxx/ywwRQ==}
+
+ '@jridgewell/sourcemap-codec@1.5.2':
+ resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==}
+
+ '@jridgewell/trace-mapping@0.3.27':
+ resolution: {integrity: sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg==}
+
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+ '@loadable/component@5.15.2':
+ resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.3.0'
+
+ '@makotot/ghostui@2.0.0':
+ resolution: {integrity: sha512-LD6OeMv+yGjpYZNjh34yDTCIE1NegqOtJq5gm4wX6op3QL7K5psTVzMjkWzseBoYj0XOD4g+UJVIZTprfoOPGg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+
+ '@microsoft/api-extractor-model@7.28.17':
+ resolution: {integrity: sha512-b2AfLP33oEVtWLeNavSBRdyDa8sKlXjN4pdhBnC4HLontOtjILhL1ERAmZObF4PWSyChnnC2vjb47C9WKCFRGg==}
+
+ '@microsoft/api-extractor@7.43.7':
+ resolution: {integrity: sha512-t5M8BdnS+TmroUA/Z9HJXExS9iL4pK9I3yGu9PsXVTXPmcVXlBlA1CVI7TjRa1jwm+vusG/+sbX1/t5UkJhQMg==}
+ hasBin: true
+
+ '@microsoft/tsdoc-config@0.16.2':
+ resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
+
+ '@microsoft/tsdoc@0.14.2':
+ resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
+
+ '@module-federation/error-codes@0.8.12':
+ resolution: {integrity: sha512-K+F4iiV62KY+IpjK6ggn3vI5Yt/T/LUb6xuazY78bhAGwLaHe1DYr7BfSutKMpiB+Dcs6U4dYOBogSMnnl0j4Q==}
+
+ '@module-federation/runtime-core@0.6.20':
+ resolution: {integrity: sha512-rX7sd/i7tpkAbfMD4TtFt/57SWNC/iv7UYS8g+ad7mnCJggWE1YEKsKSFgcvp4zU3thwR+j2y+kOCwd1sQvxEA==}
+
+ '@module-federation/runtime@0.8.12':
+ resolution: {integrity: sha512-eYohRfambj/qzxz6tEakDn459ROcixWO4zL5gmTEOmwG+jCDnxGR14j1guopyrrpjb6EKFNrPVWtYZTPPfGdQQ==}
+
+ '@module-federation/sdk@0.8.12':
+ resolution: {integrity: sha512-zFgXYBHbzwIqlrLfn6ewIRXDZCctDDQT2nFhbsZr29yWQgpmW1fm2kJCxQsG0DENGGN1KpzfDoxjjvSKJS/ZHA==}
+
+ '@module-federation/webpack-bundler-runtime@0.8.12':
+ resolution: {integrity: sha512-zd343RO7/R7Xjh5ym5KdnYQ70z4LBmMxWsa44FS0nyNv04sOq6V1eZSCGKbEhbfqqhbS5Wfj8OzJyedeVvV/OQ==}
+
+ '@napi-rs/nice-android-arm-eabi@1.0.1':
+ resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [android]
+
+ '@napi-rs/nice-android-arm64@1.0.1':
+ resolution: {integrity: sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@napi-rs/nice-darwin-arm64@1.0.1':
+ resolution: {integrity: sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@napi-rs/nice-darwin-x64@1.0.1':
+ resolution: {integrity: sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@napi-rs/nice-freebsd-x64@1.0.1':
+ resolution: {integrity: sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@napi-rs/nice-linux-arm-gnueabihf@1.0.1':
+ resolution: {integrity: sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@napi-rs/nice-linux-arm64-gnu@1.0.1':
+ resolution: {integrity: sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/nice-linux-arm64-musl@1.0.1':
+ resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/nice-linux-ppc64-gnu@1.0.1':
+ resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==}
+ engines: {node: '>= 10'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@napi-rs/nice-linux-riscv64-gnu@1.0.1':
+ resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==}
+ engines: {node: '>= 10'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@napi-rs/nice-linux-s390x-gnu@1.0.1':
+ resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==}
+ engines: {node: '>= 10'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@napi-rs/nice-linux-x64-gnu@1.0.1':
+ resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/nice-linux-x64-musl@1.0.1':
+ resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/nice-win32-arm64-msvc@1.0.1':
+ resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@napi-rs/nice-win32-ia32-msvc@1.0.1':
+ resolution: {integrity: sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@napi-rs/nice-win32-x64-msvc@1.0.1':
+ resolution: {integrity: sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@napi-rs/nice@1.0.1':
+ resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==}
+ engines: {node: '>= 10'}
+
+ '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
+ resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@parcel/watcher-android-arm64@2.5.1':
+ resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.1':
+ resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.1':
+ resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.1':
+ resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
+ resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm-musl@2.5.1':
+ resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
+ resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
+ resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
+ resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-musl@2.5.1':
+ resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-win32-arm64@2.5.1':
+ resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.1':
+ resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.1':
+ resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.1':
+ resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+ engines: {node: '>= 10.0.0'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@pkgr/core@0.2.7':
+ resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@pkgr/utils@2.4.2':
+ resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@rc-component/async-validator@5.0.4':
+ resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==}
+ engines: {node: '>=14.x'}
+
+ '@rc-component/color-picker@2.0.1':
+ resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/context@1.4.0':
+ resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/mini-decimal@1.1.0':
+ resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==}
+ engines: {node: '>=8.x'}
+
+ '@rc-component/mutate-observer@1.1.0':
+ resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/portal@1.1.2':
+ resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/qrcode@1.0.0':
+ resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/tour@1.15.1':
+ resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/trigger@1.18.3':
+ resolution: {integrity: sha512-Ksr25pXreYe1gX6ayZ1jLrOrl9OAUHUqnuhEx6MeHnNa1zVM5Y2Aj3Q35UrER0ns8D2cJYtmJtVli+i+4eKrvA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@rc-component/trigger@2.2.7':
+ resolution: {integrity: sha512-Qggj4Z0AA2i5dJhzlfFSmg1Qrziu8dsdHOihROL5Kl18seO2Eh/ZaTYt2c8a/CyGaTChnFry7BEYew1+/fhSbA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ '@reactflow/background@11.3.14':
+ resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@reactflow/controls@11.2.14':
+ resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@reactflow/core@11.11.4':
+ resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@reactflow/minimap@11.7.14':
+ resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@reactflow/node-resizer@2.2.14':
+ resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@reactflow/node-toolbar@1.3.14':
+ resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ '@rushstack/node-core-library@4.3.0':
+ resolution: {integrity: sha512-JuNZ7lwaYQ4R1TugpryyWBn4lIxK+L7fF+muibFp0by5WklG22nsvH868fuBoZMLo5FqAs6WFOifNos4PJjWSA==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/rig-package@0.5.2':
+ resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==}
+
+ '@rushstack/terminal@0.11.0':
+ resolution: {integrity: sha512-LKz7pv0G9Py5uULahNSixK1pTqIIKd103pAGhDW51YfzPojvmO5wfITe0PEUNAJZjuufN/KgeRW83dJo1gL2rQ==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/ts-command-line@4.21.0':
+ resolution: {integrity: sha512-z38FLUCn8M9FQf19gJ9eltdwkvc47PxvJmVZS6aKwbBAa3Pis3r3A+ZcBCVPNb9h/Tbga+i0tHdzoSGUoji9GQ==}
+
+ '@selderee/plugin-htmlparser2@0.11.0':
+ resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
+
+ '@sinclair/typebox@0.27.8':
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+ '@sketch-hq/sketch-file-format-ts@6.5.0':
+ resolution: {integrity: sha512-shaGl4ttFDpHjYBoMaZpciOtsi/lKvJ3VfcBYk6+PjjbFs6H5GxPAyhbiSqy3Vmx30aos284pd88QzD3rE6iag==}
+
+ '@stackblitz/sdk@1.11.0':
+ resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==}
+
+ '@stylelint/postcss-css-in-js@0.38.0':
+ resolution: {integrity: sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+ peerDependencies:
+ postcss: '>=7.0.0'
+ postcss-syntax: '>=0.36.2'
+
+ '@svgr/babel-plugin-add-jsx-attribute@6.5.1':
+ resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1':
+ resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@6.5.1':
+ resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@6.5.1':
+ resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@6.5.1':
+ resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@6.5.1':
+ resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@6.5.1':
+ resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/core@6.5.1':
+ resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==}
+ engines: {node: '>=10'}
+
+ '@svgr/hast-util-to-babel-ast@6.5.1':
+ resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==}
+ engines: {node: '>=10'}
+
+ '@svgr/plugin-jsx@6.5.1':
+ resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@svgr/core': ^6.0.0
+
+ '@svgr/plugin-svgo@6.5.1':
+ resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@swc/core-darwin-arm64@1.9.2':
+ resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@swc/core-darwin-x64@1.9.2':
+ resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@swc/core-linux-arm-gnueabihf@1.9.2':
+ resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==}
+ engines: {node: '>=10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@swc/core-linux-arm64-gnu@1.9.2':
+ resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-arm64-musl@1.9.2':
+ resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-x64-gnu@1.9.2':
+ resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-linux-x64-musl@1.9.2':
+ resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-win32-arm64-msvc@1.9.2':
+ resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@swc/core-win32-ia32-msvc@1.9.2':
+ resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==}
+ engines: {node: '>=10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@swc/core-win32-x64-msvc@1.9.2':
+ resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@swc/core@1.9.2':
+ resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@swc/helpers': '*'
+ peerDependenciesMeta:
+ '@swc/helpers':
+ optional: true
+
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+ '@swc/helpers@0.5.1':
+ resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
+
+ '@swc/types@0.1.23':
+ resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==}
+
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+
+ '@tsconfig/node10@1.0.11':
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@types/argparse@1.0.38':
+ resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+
+ '@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.20.7':
+ resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
+
+ '@types/d3-array@3.2.1':
+ resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
+
+ '@types/d3-axis@3.0.6':
+ resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
+
+ '@types/d3-brush@3.0.6':
+ resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
+
+ '@types/d3-chord@3.0.6':
+ resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-contour@3.0.6':
+ resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
+
+ '@types/d3-delaunay@6.0.4':
+ resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
+
+ '@types/d3-dispatch@3.0.6':
+ resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==}
+
+ '@types/d3-drag@3.0.7':
+ resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+
+ '@types/d3-dsv@3.0.7':
+ resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-fetch@3.0.7':
+ resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+ '@types/d3-force@3.0.10':
+ resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
+ '@types/d3-format@3.0.4':
+ resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
+
+ '@types/d3-geo@3.1.0':
+ resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+ '@types/d3-hierarchy@3.1.7':
+ resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-polygon@3.0.2':
+ resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
+
+ '@types/d3-quadtree@3.0.6':
+ resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+ '@types/d3-random@3.0.3':
+ resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+ '@types/d3-scale-chromatic@3.1.0':
+ resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-selection@3.0.11':
+ resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
+
+ '@types/d3-shape@3.1.7':
+ resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+
+ '@types/d3-time-format@4.0.3':
+ resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
+ '@types/d3-transition@3.0.9':
+ resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
+
+ '@types/d3-zoom@3.0.8':
+ resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+
+ '@types/d3@7.4.3':
+ resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/fs-extra@11.0.1':
+ resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==}
+
+ '@types/geojson@7946.0.16':
+ resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
+
+ '@types/graceful-fs@4.1.9':
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+ '@types/hapi__joi@17.1.9':
+ resolution: {integrity: sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ==}
+
+ '@types/hast@2.3.10':
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+
+ '@types/hoist-non-react-statics@3.3.6':
+ resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==}
+
+ '@types/html-minifier-terser@6.1.0':
+ resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
+
+ '@types/istanbul-lib-coverage@2.0.6':
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+ '@types/istanbul-lib-report@3.0.3':
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+ '@types/istanbul-reports@1.1.2':
+ resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==}
+
+ '@types/istanbul-reports@3.0.4':
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/jsonfile@6.1.4':
+ resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+
+ '@types/mdast@3.0.15':
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+
+ '@types/minimist@1.2.5':
+ resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/node@17.0.45':
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+
+ '@types/node@20.5.1':
+ resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==}
+
+ '@types/node@24.0.7':
+ resolution: {integrity: sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==}
+
+ '@types/normalize-package-data@2.4.4':
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+ '@types/parse-json@4.0.2':
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+ '@types/parse5@6.0.3':
+ resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
+
+ '@types/prismjs@1.26.5':
+ resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
+
+ '@types/prop-types@15.7.15':
+ resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
+
+ '@types/q@1.5.8':
+ resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==}
+
+ '@types/ramda@0.29.3':
+ resolution: {integrity: sha512-Yh/RHkjN0ru6LVhSQtTkCRo6HXkfL9trot/2elzM/yXLJmbLm2v6kJc8yftTnwv1zvUob6TEtqI2cYjdqG3U0Q==}
+
+ '@types/react-dom@18.3.7':
+ resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ peerDependencies:
+ '@types/react': ^18.0.0
+
+ '@types/react@18.3.23':
+ resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==}
+
+ '@types/resolve@1.20.6':
+ resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==}
+
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+
+ '@types/semver@7.7.0':
+ resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@13.0.12':
+ resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==}
+
+ '@types/yargs@16.0.9':
+ resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==}
+
+ '@types/yargs@17.0.33':
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+
+ '@typescript-eslint/eslint-plugin@5.62.0':
+ resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@5.62.0':
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/type-utils@5.62.0':
+ resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/types@5.62.0':
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/typescript-estree@5.62.0':
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/utils@5.62.0':
+ resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@umijs/ast@4.4.11':
+ resolution: {integrity: sha512-TeOYsiFS4SdKd9MpeeL1C4hD8ht3WV/6F43vqhbS5I1hyoV999euuFECnKevcd9tXI72HOMPKqa3e+AxRTinoA==}
+
+ '@umijs/babel-preset-umi@4.4.11':
+ resolution: {integrity: sha512-hod7QZ9Kx2lDup0W1RrhJkTVUkH8tR3DWiGwzcyVCB1ArGmOzyfVUj2CyxfM3p5e1Iz8sfrc8WiArrdQtw77Jg==}
+
+ '@umijs/bundler-esbuild@4.4.11':
+ resolution: {integrity: sha512-8gNB7hZtA1iRZcHYFwopmrNFrtkzd2yAGxBkdxAXd+Ntcsr6GY/3AF/VInn21mTNFRaQnu5qJKENnIAxKNl8Yg==}
+ hasBin: true
+
+ '@umijs/bundler-mako@0.11.10':
+ resolution: {integrity: sha512-RNop0kmMXJUOLQYp61ZW3NVdD8ikOPW0zoCmgkN+nIUVw+QKcA+9tSPEcT6Rr8id9+Ed3lMjLqktev20guRp1g==}
+
+ '@umijs/bundler-utils@4.4.11':
+ resolution: {integrity: sha512-H9XNvR8d45Zh7efzhRkSkcDcqVJUWji2Df9rXrxQA/VBUQkk87RTQlfpoIzfgfsWFZTQ3NC+ggRAoQUGMeUySA==}
+
+ '@umijs/bundler-vite@4.4.11':
+ resolution: {integrity: sha512-7Qex4G1bWTEsyW9OoWn73MPdmBBRXUo5qDj2e0/HYejSfaT7mSoIpaq9JML5pPW0FSv+trrs8l3cc0fJNM9n1Q==}
+ hasBin: true
+
+ '@umijs/bundler-webpack@4.4.11':
+ resolution: {integrity: sha512-2u2WlR/WtNxeOnjGFUMV0az2ekQVeTbVYnTkvIHGslCUnhZ8YpgiUkMHIdqviPUgCANA+u9vH1mZzELCyod2PA==}
+ hasBin: true
+
+ '@umijs/case-sensitive-paths-webpack-plugin@1.0.1':
+ resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==}
+
+ '@umijs/core@4.4.11':
+ resolution: {integrity: sha512-gND+hLhnvjOKH/vQJ/llPfD4Ogde3TP4fgJUVjHk3kNF3DbBiHqYKhViH5SMamGyPhhrun4A3Mic3YQvmjVtBg==}
+
+ '@umijs/did-you-know@1.0.3':
+ resolution: {integrity: sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw==}
+
+ '@umijs/es-module-parser-darwin-arm64@0.0.7':
+ resolution: {integrity: sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@umijs/es-module-parser-darwin-x64@0.0.7':
+ resolution: {integrity: sha512-FBFmfigmToPc9qBCW7wHiTYpqnLdPbAvoMGOydzAu2NspdPEF7TfILcr8vCPNbNe3vCobS+T/YM1dP+SagERlA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@umijs/es-module-parser-linux-arm-gnueabihf@0.0.7':
+ resolution: {integrity: sha512-AXfmg3htkadLGsXUyiyrTig4omGCWIN4l+HS7Qapqv0wlfFYSpC0KPemjyBQgzXO70tDcT+1FNhGjIy+yr2pIQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@umijs/es-module-parser-linux-arm64-gnu@0.0.7':
+ resolution: {integrity: sha512-2wSdChFc39fPJwvS8tRq+jx8qNlIwrjRk1hb3N5o0rJR+rqt+ceAyNPbYwpNBmUHW7xtmDQvJUeinvr7hIBP+w==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@umijs/es-module-parser-linux-arm64-musl@0.0.7':
+ resolution: {integrity: sha512-cqQffARWkmQ3n1RYNKZR3aD6X8YaP6u1maASjDgPQOpZMAlv/OSDrM/7iGujWTs0PD0haockNG9/DcP6lgPHMw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@umijs/es-module-parser-linux-x64-gnu@0.0.7':
+ resolution: {integrity: sha512-PHrKHtT665Za0Ydjch4ACrNpRU+WIIden12YyF1CtMdhuLDSoU6UfdhF3NoDbgEUcXVDX/ftOqmj0SbH3R1uew==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@umijs/es-module-parser-linux-x64-musl@0.0.7':
+ resolution: {integrity: sha512-cyZvUK5lcECLWzLp/eU1lFlCETcz+LEb+wrdARQSST1dgoIGZsT4cqM1WzYmdZNk3o883tiZizLt58SieEiHBQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@umijs/es-module-parser-win32-arm64-msvc@0.0.7':
+ resolution: {integrity: sha512-V7WxnUI88RboSl0RWLNQeKBT7EDW35fW6Tn92zqtoHHxrhAIL9DtDyvC8REP4qTxeZ6Oej/Ax5I6IjsLx3yTOg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@umijs/es-module-parser-win32-x64-msvc@0.0.7':
+ resolution: {integrity: sha512-X3Pqy0l38hg6wMPquPeMHuoHU+Cx+wzyz32SVYCta+RPJQ7n9PjrEBiIuVAw5+GJZjSABN7LVr8u/n0RZT9EQA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@umijs/es-module-parser@0.0.7':
+ resolution: {integrity: sha512-x47CMi/Hw7Nkz3RXTUqlldH/UM+Tcmw2PziV3k+itJqTFJc8oVx3lzdUgCnG+eL3ZtmLPbOEBhPb30V0NytNDQ==}
+ engines: {node: '>= 10'}
+
+ '@umijs/history@5.3.1':
+ resolution: {integrity: sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA==}
+
+ '@umijs/lint@4.4.11':
+ resolution: {integrity: sha512-vzbladpPXc740mE4Ru+h7PiwDxSSOf0F7Qjd3PggFk7DQ9tfQYJmub0/GMnHm6/hPANt0Oyn4JEDzoA5R5oZdg==}
+
+ '@umijs/mako-darwin-arm64@0.11.10':
+ resolution: {integrity: sha512-kCn0mJx2Hq4RIkMNIzMDOdO4JSWq120auFmSEleHkfrFFFqSWX2qgz5mR5VI7kaPH0GUh0+hwfRkjEVGysJGjA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@umijs/mako-darwin-x64@0.11.10':
+ resolution: {integrity: sha512-SKgadN/mAU8YxrQnsGQ2lFuR8I12EQSsaei41Ke5qBtXhbSxAxt5MMxBKWdB+dUe74dh6dXnllwAk/ts34vCog==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@umijs/mako-linux-arm64-gnu@0.11.10':
+ resolution: {integrity: sha512-h6TEyMe9zIuH6w5to+XeZciWDD99RaMdfwvqdcHHyJaLH9wfGwSsiHuf/z3Evwkxy8xoNAvBOngwUD35RGYa/A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@umijs/mako-linux-arm64-musl@0.11.10':
+ resolution: {integrity: sha512-kqI1Jw6IHtDwrcsqPZrYxsV3pHzZyOR+6fCFnF5MSURnXbUbJb6Rk66VsKKpMqbyfsEO6nt0WT9FrRBlFvRU2A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@umijs/mako-linux-x64-gnu@0.11.10':
+ resolution: {integrity: sha512-jlhXVvWJuumMmiE3z3ViugOMx9ZasNM1anng0PsusCgDwfy0IOfGzfwfwagqtzfsC5MwyRcfnRQyDdbfbroaSA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@umijs/mako-linux-x64-musl@0.11.10':
+ resolution: {integrity: sha512-SLV/PRdL12dFEKlQGenW3OboZXmdYi25y+JblgVJLBhpdxZrHFqpCsTZn4L3hVEhyl0/ksR1iY0wtfK3urR29g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@umijs/mako-win32-ia32-msvc@0.11.10':
+ resolution: {integrity: sha512-quCWpVl7yQjG+ccGhkF81GxO3orXdPW1OZWXWxJgOI0uPk7Hczh2EYMEVqqQGbi/83eJ1e3iE1jRTl/+2eHryQ==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@umijs/mako-win32-x64-msvc@0.11.10':
+ resolution: {integrity: sha512-NjUfV1vwUeDk5IXyleGb+pa/DZkGpjkclY/TJcK/X2OQ0Yh7Cr3sfZykhCoTEN2Y74k5rEKWYNQA0nTb6akj9Q==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@umijs/mako@0.11.10':
+ resolution: {integrity: sha512-qh0DzCtwwYjxey7Hn6B+66KVwDhMa/cIZQYgaeUVs76Ut5WDuUlfkFfJh4VA9k1F9YLBHXMaW2IeKIWTTIPVDg==}
+ engines: {node: '>= 16'}
+ hasBin: true
+
+ '@umijs/mfsu@4.4.11':
+ resolution: {integrity: sha512-FDT2162gdBrDga3obwijuqe+2PC7w/5Al4C+W+vi9tlbK28rrgn0ZYXWK7dvidbcSrzekVqB8b1jkfAAj4KOcQ==}
+
+ '@umijs/plugin-run@4.4.11':
+ resolution: {integrity: sha512-IFHcwX5fQO+/CDhdJv/qVtJECa7WCQi8pmKn81EQ39bmsgitio9WarRu3Mr46rA5FchRRjVVagdjaTXsriEACg==}
+
+ '@umijs/preset-umi@4.4.11':
+ resolution: {integrity: sha512-Ea3IM3ZI0hsIQo9mY7dr2zRTXRzmltJD8OWGuQFVi/sb3g4ViKwEaukvTI91yY7v60qP5kDP9SyHoZsFoMxJ9w==}
+
+ '@umijs/react-refresh-webpack-plugin@0.5.11':
+ resolution: {integrity: sha512-RtFvB+/GmjRhpHcqNgnw8iWZpTlxOnmNxi8eDcecxMmxmSgeDj25LV0jr4Q6rOhv3GTIfVGBhkwz+khGT5tfmg==}
+ engines: {node: '>= 10.13'}
+ peerDependencies:
+ '@types/webpack': 4.x || 5.x
+ react-refresh: '>=0.10.0 <1.0.0'
+ sockjs-client: ^1.4.0
+ type-fest: '>=0.17.0 <5.0.0'
+ webpack: '>=4.43.0 <6.0.0'
+ webpack-dev-server: 3.x || 4.x
+ webpack-hot-middleware: 2.x
+ webpack-plugin-serve: 0.x || 1.x
+ peerDependenciesMeta:
+ '@types/webpack':
+ optional: true
+ sockjs-client:
+ optional: true
+ type-fest:
+ optional: true
+ webpack-dev-server:
+ optional: true
+ webpack-hot-middleware:
+ optional: true
+ webpack-plugin-serve:
+ optional: true
+
+ '@umijs/renderer-react@4.4.11':
+ resolution: {integrity: sha512-+K2wY1LgpSZIs/Vz2tZ2nKkUNCTf+M43yb1bwTirLy+WQ2VZTB+qM0ti2abhXjZvwzq+WJKkCxhn9s3oJRKDpA==}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+
+ '@umijs/server@4.4.11':
+ resolution: {integrity: sha512-W6e7fOWZRMogB46IrIK1bgUvK5+9OVuFiCcwgISmof22anqvvrs9BdgUyMJSyrsDzXoXAUIo8lODOAMDg3mRfQ==}
+
+ '@umijs/test@4.4.11':
+ resolution: {integrity: sha512-RkYsfqPg7VKQwoR/prAV3CQ95VD2PGooGXJ5ZNc00Ej/5iOi8LUAOTuSCRkGd0Zhm3ZoH7xAphPyqxg0/pU00w==}
+
+ '@umijs/ui@3.0.1':
+ resolution: {integrity: sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw==}
+
+ '@umijs/utils@4.4.11':
+ resolution: {integrity: sha512-xhXia0yU8JZzpW75TIKDc0tlzvvDGPuuUUXaN3F6FlSSfR13bCCzX+fOTzjo95M4Sz43Vsgub0MK27hXwpCHlQ==}
+
+ '@umijs/zod2ts@4.4.11':
+ resolution: {integrity: sha512-B4CGKU6N9Qws5zNEu8TJjQgp61xAEdrBEmXGStXLl32f3zz0oUcIq/N4vBYciCDbwjHQKviqGcl3iSy2pbn7BA==}
+
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+ '@vercel/ncc@0.33.3':
+ resolution: {integrity: sha512-JGZ11QV+/ZcfudW2Cz2JVp54/pJNXbsuWRgSh2ZmmZdQBKXqBtIGrwI1Wyx8nlbzAiEFe7FHi4K1zX4//jxTnQ==}
+ hasBin: true
+
+ '@vitejs/plugin-react@4.0.0':
+ resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0
+
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@3.5.2:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ animated-scroll-to@2.3.2:
+ resolution: {integrity: sha512-GBX6+V06anH2rRt1sGmYXvAVpBo0tMmJxVvGuMcd+KV+EzMnYFSYBnccCa5IYWJvEigI+vFLKKLLEeO6SyfjcQ==}
+
+ ansi-escapes@5.0.0:
+ resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==}
+ engines: {node: '>=12'}
+
+ ansi-html-community@0.0.8:
+ resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
+ engines: {'0': node >= 0.8.0}
+ hasBin: true
+
+ ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ 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.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ antd-token-previewer@2.0.0-alpha.6:
+ resolution: {integrity: sha512-I2C+c5g6irJO6XGnkVaF5uKxPwThXz1OxESPDjHc26OFLaJ894YkjK8N+7/jKEohuTUZfKLdauJF79Z0PgOmZA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ antd@5.26.3:
+ resolution: {integrity: sha512-M/s9Q39h/+G7AWnS6fbNxmAI9waTH4ti022GVEXBLq2j810V1wJ3UOQps13nEilzDNcyxnFN/EIbqIgS7wSYaA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
+ engines: {node: '>=10'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+
+ array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.reduce@1.0.8:
+ resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ arrify@1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+
+ asn1.js@4.10.1:
+ resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
+
+ assert-okam@1.5.0:
+ resolution: {integrity: sha512-pchhPo40i8GsTj/7h6P8LSSzwRErnh2nCEiwXNTxy4VYw6lSesSac4rTKqwsA+fOZdj6FT81Mb9U1vIZEua1EQ==}
+
+ assert@1.5.1:
+ resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==}
+
+ astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
+ autoprefixer@10.4.21:
+ resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ babel-jest@29.7.0:
+ resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+
+ babel-plugin-dynamic-import-node@2.3.3:
+ resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
+
+ babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+
+ babel-plugin-jest-hoist@29.6.3:
+ resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+
+ babel-plugin-module-resolver@4.1.0:
+ resolution: {integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==}
+ engines: {node: '>= 8.0.0'}
+
+ babel-plugin-react-compiler@0.0.0-experimental-c23de8d-20240515:
+ resolution: {integrity: sha512-0XN2gmpT55QtAz5n7d5g91y1AuO9tRhWBaLgCRyc4ExHrlr7+LfxW+YTb3mOwxngkkiggwM8HyYsaEK9MqhnlQ==}
+
+ babel-plugin-styled-components@2.1.4:
+ resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==}
+ peerDependencies:
+ styled-components: '>= 2'
+
+ babel-plugin-transform-define@2.0.1:
+ resolution: {integrity: sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw==}
+ engines: {node: '>= 8.x.x'}
+
+ babel-preset-current-node-syntax@1.1.0:
+ resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ babel-preset-jest@29.6.3:
+ resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@2.0.0:
+ resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ big-integer@1.6.52:
+ resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+ engines: {node: '>=0.6'}
+
+ big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ binaryextensions@2.3.0:
+ resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==}
+ engines: {node: '>=0.8'}
+
+ bn.js@4.12.2:
+ resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==}
+
+ bn.js@5.2.2:
+ resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ bplist-parser@0.2.0:
+ resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+ engines: {node: '>= 5.10.0'}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ brorand@1.1.0:
+ resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+
+ browserify-aes@1.2.0:
+ resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+
+ browserify-cipher@1.0.1:
+ resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+
+ browserify-des@1.0.2:
+ resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+
+ browserify-rsa@4.1.1:
+ resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==}
+ engines: {node: '>= 0.10'}
+
+ browserify-sign@4.2.3:
+ resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==}
+ engines: {node: '>= 0.12'}
+
+ browserify-zlib@0.2.0:
+ resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
+
+ browserslist@4.25.1:
+ resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+ buffer-from@0.1.2:
+ resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer-okam@4.9.2:
+ resolution: {integrity: sha512-t+vozme+an7flUs6GXHGMiP3PdodTse1NgRHSDWioIFJAtmMlj3pj7qD20Mkr9hZy0+9HA4R0xcumpMewrRdZQ==}
+
+ buffer-xor@1.0.3:
+ resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+
+ buffer@4.9.2:
+ resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==}
+
+ builtin-status-codes@3.0.0:
+ resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
+
+ bundle-name@3.0.0:
+ resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+ engines: {node: '>=12'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
+ camelcase-keys@6.2.2:
+ resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+ engines: {node: '>=8'}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
+ caniuse-lite@1.0.30001726:
+ resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ 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'}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+
+ cipher-base@1.0.6:
+ resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==}
+ engines: {node: '>= 0.10'}
+
+ classcat@5.0.5:
+ resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
+
+ classnames@2.3.2:
+ resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+
+ classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
+ clean-css@5.3.3:
+ resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
+ engines: {node: '>= 10.0'}
+
+ cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ cli-truncate@3.1.0:
+ resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ click-to-react-component@1.1.0:
+ resolution: {integrity: sha512-/DjZemufS1BkxyRgZL3r7HXVVOFRWVQi5Xd4EBnjxZMwrHEh0OlUVA2N9CjXkZ0x8zMf8dL1cKnnx+xUWUg4VA==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ coa@2.0.2:
+ resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==}
+ engines: {node: '>= 4.0'}
+
+ codesandbox-import-util-types@2.2.3:
+ resolution: {integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==}
+
+ codesandbox-import-utils@2.2.3:
+ resolution: {integrity: sha512-ymtmcgZKU27U+nM2qUb21aO8Ut/u2S9s6KorOgG81weP+NA0UZkaHKlaRqbLJ9h4i/4FLvwmEXYAnTjNmp6ogg==}
+
+ 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==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@3.2.1:
+ resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
+
+ colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ comlink@4.4.2:
+ resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.0.0:
+ resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==}
+ engines: {node: '>=16'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
+ commander@9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
+
+ common-path-prefix@3.0.0:
+ resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+ compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+
+ compression@1.8.0:
+ resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==}
+ engines: {node: '>= 0.8.0'}
+
+ compute-scroll-into-view@3.1.1:
+ resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ connect-history-api-fallback@2.0.0:
+ resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
+ engines: {node: '>=0.8'}
+
+ console-browserify@1.2.0:
+ resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
+
+ constants-browserify@1.0.0:
+ resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ conventional-changelog-angular@6.0.0:
+ resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==}
+ engines: {node: '>=14'}
+
+ conventional-changelog-conventionalcommits@6.1.0:
+ resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==}
+ engines: {node: '>=14'}
+
+ conventional-commits-parser@4.0.0:
+ resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ copy-anything@2.0.6:
+ resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+
+ copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+
+ core-js-pure@3.43.0:
+ resolution: {integrity: sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==}
+
+ core-js@3.34.0:
+ resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig-typescript-loader@4.4.0:
+ resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==}
+ engines: {node: '>=v14.21.3'}
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=7'
+ ts-node: '>=10'
+ typescript: '>=4'
+
+ cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ create-ecdh@4.0.4:
+ resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+
+ create-hash@1.1.3:
+ resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==}
+
+ create-hash@1.2.0:
+ resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+
+ create-hmac@1.1.7:
+ resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crypto-browserify@3.12.1:
+ resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
+ engines: {node: '>= 0.10'}
+
+ css-blank-pseudo@3.0.3:
+ resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.4
+
+ css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
+ css-functions-list@3.2.3:
+ resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
+ engines: {node: '>=12 || >=16'}
+
+ css-has-pseudo@3.0.4:
+ resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==}
+ engines: {node: ^12 || ^14 || >=16}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.4
+
+ css-loader@6.7.1:
+ resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==}
+ engines: {node: '>= 12.13.0'}
+ peerDependencies:
+ webpack: ^5.0.0
+
+ css-prefers-color-scheme@6.0.3:
+ resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==}
+ engines: {node: ^12 || ^14 || >=16}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.4
+
+ css-select-base-adapter@0.1.1:
+ resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==}
+
+ css-select@2.1.0:
+ resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==}
+
+ css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
+ css-tree@1.0.0-alpha.37:
+ resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==}
+ engines: {node: '>=8.0.0'}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+
+ css-what@3.4.2:
+ resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==}
+ engines: {node: '>= 6'}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ css@3.0.0:
+ resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==}
+
+ cssdb@6.6.3:
+ resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@4.2.0:
+ resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+ engines: {node: '>=8.0.0'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ current-script-polyfill@1.0.0:
+ resolution: {integrity: sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+
+ d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
+ d3-transition@3.0.1:
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+
+ d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+
+ dargs@7.0.0:
+ resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
+ engines: {node: '>=8'}
+
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+ dayjs@1.11.7:
+ resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.1:
+ resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize-keys@1.1.1:
+ resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+ engines: {node: '>=0.10.0'}
+
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
+ decimal.js@10.5.0:
+ resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==}
+
+ decode-named-character-reference@1.2.0:
+ resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
+
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deep-rename-keys@0.2.1:
+ resolution: {integrity: sha512-RHd9ABw4Fvk+gYDWqwOftG849x0bYOySl/RgX0tLI9i27ZIeSO91mLZJEp7oPHOMFqHvpgu21YptmDt0FYD/0A==}
+ engines: {node: '>=0.10.0'}
+
+ deepmerge@1.5.2:
+ resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==}
+ engines: {node: '>=0.10.0'}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ default-browser-id@3.0.0:
+ resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+ engines: {node: '>=12'}
+
+ default-browser@4.0.0:
+ resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+ engines: {node: '>=14.16'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ des.js@1.1.0:
+ resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ detect-indent@7.0.1:
+ resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==}
+ engines: {node: '>=12.20'}
+
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ detect-newline@4.0.1:
+ resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
+ diffie-hellman@5.0.3:
+ resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dom-converter@0.2.0:
+ resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
+
+ dom-serializer@0.2.2:
+ resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+
+ dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domain-browser@1.2.0:
+ resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==}
+ engines: {node: '>=0.4', npm: '>=1.2'}
+
+ domelementtype@1.3.1:
+ resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@1.7.0:
+ resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+
+ domutils@2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ dumi-afx-deps@1.0.0-alpha.20:
+ resolution: {integrity: sha512-PRSJlHuJkyHDET7Hukykx/hLULkgUBX5q2CutMG5EDI3eJLzJlX634wNll10m3at1uomcDAVudL7Dgh5UOJ7IQ==}
+
+ dumi-assets-types@2.4.14:
+ resolution: {integrity: sha512-k2Z3z7/IcHOYASP/nDjocShdzXatmOuhkAwgYw/4KNiq36gpAKjn5MlrPkzdGH70TbcHGLGEul9b/4sYJLoS9A==}
+
+ dumi-theme-antd@0.4.4:
+ resolution: {integrity: sha512-d1zPPBi/na6ErYfVx2Syk0nrmz9s5wLhiiDkzN8kxrgdiSst7GLQdjohlpH40q+XmnLj9RjHesjkBAaA3pTkow==}
+ peerDependencies:
+ antd: ^5.17.0
+ dumi: ^2.4.18
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ dumi@2.4.21:
+ resolution: {integrity: sha512-UM6M8B9pRxPbS4CT5DZpIOtQ8j+xH1d28PL1QNxzzK3SdbI7Ww+B+fSS/10KXLi9mPt+9/xlW7eUGCTRAwfjcg==}
+ hasBin: true
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexer2@0.1.4:
+ resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
+
+ duplexify@4.1.3:
+ resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ editions@2.3.1:
+ resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==}
+ engines: {node: '>=0.8'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ electron-to-chromium@1.5.177:
+ resolution: {integrity: sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==}
+
+ elliptic@6.6.1:
+ resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ enhanced-resolve@5.18.2:
+ resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==}
+ engines: {node: '>=10.13.0'}
+
+ enhanced-resolve@5.9.3:
+ resolution: {integrity: sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==}
+ engines: {node: '>=10.13.0'}
+
+ entities@2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ errlop@2.2.0:
+ resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==}
+ engines: {node: '>=0.8'}
+
+ errno@0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ error-stack-parser@2.1.4:
+ resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+
+ es-abstract@1.24.0:
+ resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ engines: {node: '>= 0.4'}
+
+ es-array-method-boxes-properly@1.0.0:
+ resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-get-iterator@1.1.3:
+ resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+
+ es-iterator-helpers@1.2.1:
+ resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ es5-imcompatible-versions@0.1.90:
+ resolution: {integrity: sha512-2MPI0t/VV4j/oz1qbMekb4gCW81dewTpM2XJHKnPpZiPGu+1rVWmhTnwcq1vt8AFwWrkNF4RE7OZ9ibnKFYKwg==}
+
+ es6-promise@4.2.8:
+ resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+
+ esbuild@0.17.19:
+ resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.21.4:
+ resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-plugin-jest@27.2.3:
+ resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0
+ eslint: ^7.0.0 || ^8.0.0
+ jest: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ jest:
+ optional: true
+
+ eslint-plugin-react-hooks@4.6.0:
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+
+ eslint-plugin-react@7.33.2:
+ resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint@8.57.1:
+ resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+ hasBin: true
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-attach-comments@2.1.1:
+ resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==}
+
+ estree-util-is-identifier-name@2.1.0:
+ resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==}
+
+ estree-util-to-js@1.2.0:
+ resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==}
+
+ estree-util-visit@1.2.1:
+ resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventemitter3@2.0.3:
+ resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ events-okam@3.3.0:
+ resolution: {integrity: sha512-6iR7z9hAJEwrT+D2Ywg6Fx62HSmN86OlcvPdrnq1JBeFr30dMF6l+j7M3VabjHfIi2KMtF8rO0J1rIZEfwMAwg==}
+ engines: {node: '>=0.8.x'}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ evp_bytestokey@1.0.3:
+ resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+
+ express-http-proxy@2.1.1:
+ resolution: {integrity: sha512-4aRQRqDQU7qNPV5av0/hLcyc0guB9UP71nCYrQEYml7YphTo8tmWf3nDZWdTJMMjFikyz9xKXaURor7Chygdwg==}
+ engines: {node: '>=6.0.0'}
+
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.2.12:
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+ engines: {node: '>=8.6.0'}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-redact@3.5.0:
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
+ engines: {node: '>=6'}
+
+ fast-uri@3.0.6:
+ resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
+
+ fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ father@4.5.6:
+ resolution: {integrity: sha512-o/GRqxKrnd8b/BHvqqqCTq9ZN+9caO56EX1RvSoDSHlSgV5JiDdE+Uyu1GYaNSK0409yMgHsXjZlnJeFIwYzCg==}
+ hasBin: true
+
+ fault@2.0.1:
+ resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
+
+ fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+ fdir@6.4.6:
+ resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
+ file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ file-system-cache@2.0.0:
+ resolution: {integrity: sha512-QlYut2ZtxRgdW/dboSmiKZWM8FsnpLaLI549hN/RWgwn3FawSil7Jc2n7nFHheclvYxa4LJqwEOvNUYv9VsCXg==}
+
+ file-system-cache@2.4.4:
+ resolution: {integrity: sha512-vCYhn8pb5nlC3Gs2FFCOkmf4NEg2Ym3ulJwkmS9o6p9oRShGj6CwTMFvpgZihBlsh373NaM0XgAgDHXQIlS4LQ==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ filter-obj@1.1.0:
+ resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
+ engines: {node: '>=0.10.0'}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ find-babel-config@1.2.2:
+ resolution: {integrity: sha512-oK59njMyw2y3yxto1BCfVK7MQp/OYf4FleHu0RgosH3riFJ1aOuo/7naLDLAObfrgn3ueFhw5sAT/cp0QuJI3Q==}
+ engines: {node: '>=4.0.0'}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
+ fork-ts-checker-webpack-plugin@8.0.0:
+ resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==}
+ engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
+ peerDependencies:
+ typescript: '>3.6.0'
+ webpack: ^5.11.0
+
+ format@0.2.2:
+ resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+ engines: {node: '>=0.4.x'}
+
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-extra@11.1.1:
+ resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
+ engines: {node: '>=14.14'}
+
+ fs-extra@11.3.0:
+ resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
+ engines: {node: '>=14.14'}
+
+ fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+
+ fs-monkey@1.0.6:
+ resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==}
+
+ 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]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ 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-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.10.1:
+ resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
+
+ get-tsconfig@4.7.5:
+ resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==}
+
+ get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+
+ git-hooks-list@3.2.0:
+ resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==}
+
+ git-hooks-list@4.1.1:
+ resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==}
+
+ git-raw-commits@2.0.11:
+ resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ github-slugger@1.5.0:
+ resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ global-dirs@0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+
+ global-modules@2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+
+ global-prefix@3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ globjoin@0.1.4:
+ resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ handle-thing@2.0.1:
+ resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
+
+ hard-rejection@2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+
+ harmony-reflect@1.6.2:
+ resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ 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'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+
+ hash-base@2.0.2:
+ resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==}
+
+ hash-base@3.0.5:
+ resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==}
+ engines: {node: '>= 0.10'}
+
+ hash.js@1.1.7:
+ resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-from-parse5@7.1.2:
+ resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==}
+
+ hast-util-has-property@2.0.1:
+ resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==}
+
+ hast-util-heading-rank@2.1.1:
+ resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==}
+
+ hast-util-is-conditional-comment@2.0.0:
+ resolution: {integrity: sha512-U66gW8ZWQdxP4ZjTEZ3xZT72y6rIKJqV4At5QmC1ItBbQyZyVkuTp8QkQwhxsbkHdzpifiZdQWrDipc9ByqhRg==}
+
+ hast-util-is-element@2.1.3:
+ resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==}
+
+ hast-util-parse-selector@3.1.1:
+ resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
+
+ hast-util-raw@7.2.3:
+ resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==}
+
+ hast-util-raw@8.0.0:
+ resolution: {integrity: sha512-bKbaUxMNLjZMMowgcrc4l3aQSPiMLiceZD+mp+AKF8Si0mtyR2DYVdxzS2XBxXYDeW/VvfZy40lNxHRiY6MMTg==}
+
+ hast-util-to-estree@2.3.3:
+ resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==}
+
+ hast-util-to-html@8.0.4:
+ resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==}
+
+ hast-util-to-parse5@7.1.0:
+ resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
+
+ hast-util-to-string@2.0.0:
+ resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==}
+
+ hast-util-whitespace@2.0.1:
+ resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+
+ hastscript@7.2.0:
+ resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ heti-findandreplacedomtext@0.5.0:
+ resolution: {integrity: sha512-GFZjqU8LAdu1uR72GqrReI+lzNLMlcWtvdz1TKNJiofyo1mfTecFYSZEoEbcLcRMl+KwEldnNQoS4BwO8wtg0A==}
+
+ heti@0.9.5:
+ resolution: {integrity: sha512-oVWQiQ8nvtfU9vc64ftAv+ylSwoeIJGOSm+LRpZz/XMlhFOtzybcpplmRTHxpz8X9vINlWVlniKCvF0LRo7s0Q==}
+
+ history@5.3.0:
+ resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
+
+ hmac-drbg@1.0.1:
+ resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
+ hosted-git-info@4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+
+ hosted-git-info@6.1.3:
+ resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ hpack.js@2.1.6:
+ resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+
+ htm@3.1.1:
+ resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==}
+
+ html-entities@2.6.0:
+ resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+ html-minifier-terser@6.1.0:
+ resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+
+ html-to-text@9.0.5:
+ resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==}
+ engines: {node: '>=14'}
+
+ html-tokenize@2.0.1:
+ resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==}
+ hasBin: true
+
+ html-void-elements@2.0.1:
+ resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+
+ html-webpack-plugin@5.5.0:
+ resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ webpack: ^5.20.0
+
+ html2sketch@1.0.2:
+ resolution: {integrity: sha512-/P9NcVH9yBhrOkcnaFkAbWJifDO8Ii+CTIxy9gE6trSQvo2OH++TKQIP5MICEoWvgXpVhZ6botj7P63Krl1/gg==}
+ engines: {node: '>=14.0.0'}
+
+ htmlparser2@6.1.0:
+ resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+
+ htmlparser2@8.0.2:
+ resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+
+ http-deceiver@1.2.7:
+ resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ https-browserify@1.0.0:
+ resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+
+ husky@8.0.3:
+ resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ icss-utils@5.1.0:
+ resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ identity-obj-proxy@3.0.0:
+ resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==}
+ engines: {node: '>=4'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ immutable@5.1.3:
+ resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+
+ 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.1:
+ resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==}
+
+ inherits@2.0.3:
+ resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ intl-messageformat@10.7.16:
+ resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-arrow-function@2.0.3:
+ resolution: {integrity: sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==}
+ engines: {node: '>= 0.4'}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+ is-buffer@2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+ engines: {node: '>=4'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-equal@1.7.0:
+ resolution: {integrity: sha512-hErktGR9jmoYXNWlbrwGjc8eHh09mbY6TWSTTFtnMcKaCuSMN8z+Ni5ma/8mkbVpe4CbB7V6kN1MkCg9bCx5bA==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+
+ is-generator-function@1.1.0:
+ resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ 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-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-text-path@1.0.1:
+ resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==}
+ engines: {node: '>=0.10.0'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ is-what@3.14.1:
+ resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ isarray@0.0.1:
+ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ isomorphic-rslog@0.0.7:
+ resolution: {integrity: sha512-n6/XnKnZ5eLEj6VllG4XmamXG7/F69nls8dcynHyhcTpsPUYgcgx4ifEaCo4lQJ2uzwfmIT+F0KBGwBcMKmt5g==}
+ engines: {node: '>=14.17.6'}
+
+ isomorphic-unfetch@4.0.2:
+ resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+
+ istextorbinary@2.6.0:
+ resolution: {integrity: sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==}
+ engines: {node: '>=0.12'}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ javascript-stringify@2.1.0:
+ resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
+
+ jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ jest-worker@29.4.3:
+ resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ hasBin: true
+
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json2mq@0.2.0:
+ resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ known-css-properties@0.26.0:
+ resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ leac@0.6.0:
+ resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==}
+
+ less-loader@12.3.0:
+ resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ less: ^3.5.0 || ^4.0.0
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+
+ less-plugin-resolve@1.0.2:
+ resolution: {integrity: sha512-e1AHq0XNTU8S3d9JCc8CFYajoUBr0EK3pcuLT5PogyBBeE0knzZJL105kKKSZWfq2lQLq3/uEDrMK3JPq+fHaA==}
+
+ less@4.1.3:
+ resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ less@4.3.0:
+ resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-darwin-arm64@1.22.1:
+ resolution: {integrity: sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.22.1:
+ resolution: {integrity: sha512-5p2rnlVTv6Gpw4PlTLq925nTVh+HFh4MpegX8dPDYJae+NFVjQ67gY7O6iHIzQjLipDiYejFF0yHrhjU3XgLBQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.22.1:
+ resolution: {integrity: sha512-1FaBtcFrZqB2hkFbAxY//Pnp8koThvyB6AhjbdVqKD4/pu13Rl91fKt2N9qyeQPUt3xy7ORUvSO+dPk3J6EjXg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.22.1:
+ resolution: {integrity: sha512-6rub98tYGfE5I5j0BP8t/2d4BZyu1S7Iz9vUkm0H26snAFHYxLfj3RbQn0xHHIePSetjLnhcg3QlfwUAkD/FYg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.22.1:
+ resolution: {integrity: sha512-nYO5qGtb/1kkTZu3FeTiM+2B2TAb7m2DkLCTgQIs2bk2o9aEs7I96fwySKcoHWQAiQDGR9sMux9vkV4KQXqPaQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.22.1:
+ resolution: {integrity: sha512-MCV6RuRpzXbunvzwY644iz8cw4oQxvW7oer9xPkdadYqlEyiJJ6wl7FyJOH7Q6ZYH4yjGAUCvxDBxPbnDu9ZVg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.22.1:
+ resolution: {integrity: sha512-RjNgpdM20VUXgV7us/VmlO3Vn2ZRiDnc3/bUxCVvySZWPiVPprpqW/QDWuzkGa+NCUf6saAM5CLsZLSxncXJwg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.22.1:
+ resolution: {integrity: sha512-ZgO4C7Rd6Hv/5MnyY2KxOYmIlzk4rplVolDt3NbkNR8DndnyX0Q5IR4acJWNTBICQ21j3zySzKbcJaiJpk/4YA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-x64-msvc@1.22.1:
+ resolution: {integrity: sha512-4pozV4eyD0MDET41ZLHAeBo+H04Nm2UEYIk5w/ts40231dRFV7E0cjwbnZvSoc1DXFgecAhiC0L16ruv/ZDCpg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.22.1:
+ resolution: {integrity: sha512-Fy45PhibiNXkm0cK5FJCbfO8Y6jUpD/YcHf/BtuI+jvYYqSXKF4muk61jjE8YxCR9y+hDYIWSzHTc+bwhDE6rQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ lint-staged@13.3.0:
+ resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ hasBin: true
+
+ listr2@6.6.1:
+ resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ enquirer: '>= 2.3.0 < 3'
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+
+ loader-runner@4.2.0:
+ resolution: {integrity: sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==}
+ engines: {node: '>=6.11.5'}
+
+ loader-runner@4.3.0:
+ resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+ engines: {node: '>=6.11.5'}
+
+ loader-utils@2.0.4:
+ resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+ engines: {node: '>=8.9.0'}
+
+ loader-utils@3.3.1:
+ resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+ engines: {node: '>= 12.13.0'}
+
+ local-pkg@0.4.3:
+ resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+ engines: {node: '>=14'}
+
+ locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.get@4.4.2:
+ resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
+ deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
+
+ lodash.isequal@4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+
+ lodash.isfunction@3.0.9:
+ resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ 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.throttle@4.1.1:
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+
+ lodash.truncate@4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+
+ lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+ lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-update@5.0.1:
+ resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
+ lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+
+ make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+ map-obj@1.0.1:
+ resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+ engines: {node: '>=0.10.0'}
+
+ map-obj@4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mathml-tag-names@2.1.3:
+ resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+
+ md5.js@1.3.5:
+ resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+
+ mdast-util-definitions@5.1.2:
+ resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+
+ mdast-util-directive@2.2.4:
+ resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==}
+
+ mdast-util-find-and-replace@2.2.2:
+ resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==}
+
+ mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+
+ mdast-util-frontmatter@1.0.1:
+ resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==}
+
+ mdast-util-gfm-autolink-literal@1.0.3:
+ resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==}
+
+ mdast-util-gfm-footnote@1.0.2:
+ resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==}
+
+ mdast-util-gfm-strikethrough@1.0.3:
+ resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==}
+
+ mdast-util-gfm-table@1.0.7:
+ resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==}
+
+ mdast-util-gfm-task-list-item@1.0.2:
+ resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==}
+
+ mdast-util-gfm@2.0.2:
+ resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==}
+
+ mdast-util-mdx-expression@1.3.2:
+ resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==}
+
+ mdast-util-mdxjs-esm@1.3.1:
+ resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==}
+
+ mdast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==}
+
+ mdast-util-to-hast@12.3.0:
+ resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+
+ mdast-util-to-markdown@1.5.0:
+ resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
+
+ mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+
+ mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+ mdn-data@2.0.4:
+ resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ memfs@3.5.3:
+ resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+ engines: {node: '>= 4.0.0'}
+
+ meow@8.1.2:
+ resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
+ engines: {node: '>=10'}
+
+ meow@9.0.0:
+ resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==}
+ engines: {node: '>=10'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+
+ micromark-extension-directive@2.2.1:
+ resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==}
+
+ micromark-extension-frontmatter@1.1.1:
+ resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==}
+
+ micromark-extension-gfm-autolink-literal@1.0.5:
+ resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==}
+
+ micromark-extension-gfm-footnote@1.1.2:
+ resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==}
+
+ micromark-extension-gfm-strikethrough@1.0.7:
+ resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==}
+
+ micromark-extension-gfm-table@1.0.7:
+ resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==}
+
+ micromark-extension-gfm-tagfilter@1.0.2:
+ resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==}
+
+ micromark-extension-gfm-task-list-item@1.0.5:
+ resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==}
+
+ micromark-extension-gfm@2.0.3:
+ resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==}
+
+ micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+
+ micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+
+ micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+
+ micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+
+ micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+
+ micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+
+ micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+
+ micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+
+ micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+
+ micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+
+ micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+
+ micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+
+ micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+
+ micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+
+ micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+
+ micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+
+ micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+
+ micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+
+ micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+
+ micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+
+ micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ miller-rabin@4.0.1:
+ resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+ hasBin: true
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimalistic-assert@1.0.1:
+ resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
+ minimalistic-crypto-utils@1.0.1:
+ resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+
+ minimatch@3.0.8:
+ resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist-options@4.1.0:
+ resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+ engines: {node: '>= 6'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ multipipe@1.0.2:
+ resolution: {integrity: sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ needle@3.3.1:
+ resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ negotiator@0.6.4:
+ resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
+
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ node-libs-browser-okam@2.2.5:
+ resolution: {integrity: sha512-kD+WXACEThc6C5DA146KoCNbubjpXeYzXDrukvtXWr6MRzV3uvHCI0eb/GuugWVYnMoD4g3/uaIzvDYOpC4QWw==}
+
+ node-libs-browser@2.2.1:
+ resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==}
+
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+ normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+
+ normalize-package-data@3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+ nth-check@1.0.2:
+ resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@0.4.0:
+ resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.getownpropertydescriptors@2.1.8:
+ resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==}
+ engines: {node: '>= 0.8'}
+
+ object.getprototypeof@1.0.7:
+ resolution: {integrity: sha512-AS2h2hzryA95Z5SCy8DykYpdv82hHysDeMTBV5uWII4ljKiS0y2TC5aBQ+tHpCj0PfOy2/IPPY/O86F8uxx2gg==}
+ engines: {node: '>= 0.4'}
+
+ object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ obuf@1.1.2:
+ resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+
+ omit-deep@0.3.0:
+ resolution: {integrity: sha512-Lbl/Ma59sss2b15DpnWnGmECBRL8cRl/PjPbPMVW+Y8zIQzRrwMaI65Oy6HvxyhYeILVKBJb2LWeG81bj5zbMg==}
+ engines: {node: '>=0.10.0'}
+
+ on-exit-leak-free@0.2.0:
+ resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ on-headers@1.0.2:
+ resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+ engines: {node: '>= 0.8'}
+
+ 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@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ open@9.1.0:
+ resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+ engines: {node: '>=14.16'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ os-browserify@0.3.0:
+ resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ pako@1.0.11:
+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+ param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-asn1@5.1.7:
+ resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==}
+ engines: {node: '>= 0.10'}
+
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-node-version@1.0.1:
+ resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+ engines: {node: '>= 0.10'}
+
+ parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ parseley@0.12.1:
+ resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+ path-browserify@0.0.1:
+ resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==}
+
+ path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ path-to-regexp@1.7.0:
+ resolution: {integrity: sha512-nifX1uj4S9IrK/w3Xe7kKvNEepXivANs9ng60Iq7PU/BlouV3yL/VUhFqTuTq33ykwUqoNcTeGo5vdOBP4jS/Q==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pbkdf2@3.1.3:
+ resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==}
+ engines: {node: '>=0.12'}
+
+ peberminta@0.9.0:
+ resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ pino-abstract-transport@0.5.0:
+ resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==}
+
+ pino-std-serializers@4.0.0:
+ resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==}
+
+ pino@7.11.0:
+ resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==}
+ hasBin: true
+
+ pirates@4.0.7:
+ resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
+ engines: {node: '>= 6'}
+
+ piscina@4.9.2:
+ resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==}
+
+ pkg-up@3.1.0:
+ resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+ engines: {node: '>=8'}
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ pnpm@10.12.4:
+ resolution: {integrity: sha512-Xqiw3u2U7WhpHJutTJVUknBcXuuKh++GvGLHSiawN7CP+VcPEIsuTb0d0akYb+qSXlJ/FBxkjoWvRWMQdGgBhA==}
+ engines: {node: '>=18.12'}
+ hasBin: true
+
+ point-in-polygon@1.1.0:
+ resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss-attribute-case-insensitive@5.0.2:
+ resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-clamp@4.1.0:
+ resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==}
+ engines: {node: '>=7.6.0'}
+ peerDependencies:
+ postcss: ^8.4.6
+
+ postcss-color-functional-notation@4.2.4:
+ resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-color-hex-alpha@8.0.4:
+ resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-color-rebeccapurple@7.1.1:
+ resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-custom-media@8.0.2:
+ resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.3
+
+ postcss-custom-properties@12.1.11:
+ resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-custom-selectors@6.0.3:
+ resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.3
+
+ postcss-dir-pseudo-class@6.0.5:
+ resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-double-position-gradients@3.1.2:
+ resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-env-function@4.0.6:
+ resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-flexbugs-fixes@5.0.2:
+ resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==}
+ peerDependencies:
+ postcss: ^8.1.4
+
+ postcss-focus-visible@6.0.4:
+ resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-focus-within@5.0.4:
+ resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-font-variant@5.0.0:
+ resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-gap-properties@3.0.5:
+ resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-image-set-function@4.0.7:
+ resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-initial@4.0.1:
+ resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-lab-function@4.2.1:
+ resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-loader@8.1.1:
+ resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ postcss: ^7.0.0 || ^8.0.1
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+
+ postcss-logical@5.0.4:
+ resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-media-minmax@5.0.0:
+ resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-media-query-parser@0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+
+ postcss-modules-extract-imports@3.1.0:
+ resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-local-by-default@4.2.0:
+ resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-scope@3.2.1:
+ resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-modules-values@4.0.0:
+ resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-nesting@10.2.0:
+ resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-opacity-percentage@1.1.3:
+ resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-overflow-shorthand@3.0.4:
+ resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-page-break@3.0.4:
+ resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==}
+ peerDependencies:
+ postcss: ^8
+
+ postcss-place@7.0.5:
+ resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-prefix-selector@1.16.0:
+ resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==}
+ peerDependencies:
+ postcss: '>4 <9'
+
+ postcss-preset-env@7.5.0:
+ resolution: {integrity: sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.4
+
+ postcss-pseudo-class-any-link@7.1.6:
+ resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.2
+
+ postcss-replace-overflow-wrap@4.0.0:
+ resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==}
+ peerDependencies:
+ postcss: ^8.0.3
+
+ postcss-resolve-nested-selector@0.1.6:
+ resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+
+ postcss-safe-parser@6.0.0:
+ resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+
+ postcss-selector-not@5.0.0:
+ resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==}
+ peerDependencies:
+ postcss: ^8.1.0
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@7.1.0:
+ resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
+ engines: {node: '>=4'}
+
+ postcss-syntax@0.36.2:
+ resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==}
+ peerDependencies:
+ postcss: '>=5.0.0'
+ postcss-html: '*'
+ postcss-jsx: '*'
+ postcss-less: '*'
+ postcss-markdown: '*'
+ postcss-scss: '*'
+ peerDependenciesMeta:
+ postcss-html:
+ optional: true
+ postcss-jsx:
+ optional: true
+ postcss-less:
+ optional: true
+ postcss-markdown:
+ optional: true
+ postcss-scss:
+ optional: true
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-plugin-organize-imports@3.2.4:
+ resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==}
+ peerDependencies:
+ '@volar/vue-language-plugin-pug': ^1.0.4
+ '@volar/vue-typescript': ^1.0.4
+ prettier: '>=2.0'
+ typescript: '>=2.9'
+ peerDependenciesMeta:
+ '@volar/vue-language-plugin-pug':
+ optional: true
+ '@volar/vue-typescript':
+ optional: true
+
+ prettier-plugin-packagejson@2.4.3:
+ resolution: {integrity: sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+
+ prettier-plugin-packagejson@2.5.17:
+ resolution: {integrity: sha512-1WYvhTix+4EMYZQYSjAxb6+KTCULINuHUTBcxYa2ipoUS9Y2zJVjE3kuZ5I7ZWIFqyK8xpwYIunXqN5eiT7Hew==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ pretty-error@4.0.0:
+ resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
+
+ pretty-format@24.9.0:
+ resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==}
+ engines: {node: '>= 6'}
+
+ prism-react-renderer@1.3.5:
+ resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==}
+ peerDependencies:
+ react: '>=0.14.9'
+
+ prism-react-renderer@2.3.1:
+ resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==}
+ peerDependencies:
+ react: '>=16.0.0'
+
+ prism-themes@1.9.0:
+ resolution: {integrity: sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==}
+
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process-okam@0.11.10:
+ resolution: {integrity: sha512-p8e5nl6/OCeMalVb9dSojND5B9m/nq64WsyUfRmrTdLMKcNYcDN++/2I8WV1mTQDqrh2PQ6tIIb2A7/A38eSvw==}
+ engines: {node: '>= 0.6.0'}
+
+ process-warning@1.0.0:
+ resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ prr@1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
+ public-encrypt@4.0.3:
+ resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+
+ punycode-okam@1.4.1:
+ resolution: {integrity: sha512-e4mSfzGfrVBJmhjp+8PHjXIz5WrvEEWB2FT+RJ6YS/ozGttTcnocuj0CtMo3dujWYe2708bTd79zeIrKBtRzCg==}
+
+ punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ q@1.5.1:
+ resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==}
+ engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
+ deprecated: |-
+ You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
+
+ (For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ qs@6.14.0:
+ resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+ engines: {node: '>=0.6'}
+
+ query-string@6.14.1:
+ resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==}
+ engines: {node: '>=6'}
+
+ querystring-es3@0.2.1:
+ resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+ engines: {node: '>=0.4.x'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
+ quick-lru@4.0.1:
+ resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+ engines: {node: '>=8'}
+
+ ramda@0.28.0:
+ resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==}
+
+ ramda@0.29.0:
+ resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ randomfill@1.0.4:
+ resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ raw-loader@4.0.2:
+ resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ webpack: ^4.0.0 || ^5.0.0
+
+ rc-cascader@3.34.0:
+ resolution: {integrity: sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-checkbox@3.5.0:
+ resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-collapse@3.9.0:
+ resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-dialog@9.6.0:
+ resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-drawer@6.2.0:
+ resolution: {integrity: sha512-spPkZ3WvP0U0vy5dyzSwlUJ/+vLFtjP/cTwSwejhQRoDBaexSZHsBhELoCZcEggI7LQ7typmtG30lAue2HEhvA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-drawer@7.3.0:
+ resolution: {integrity: sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-dropdown@4.1.0:
+ resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+
+ rc-dropdown@4.2.1:
+ resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+
+ rc-field-form@2.7.0:
+ resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-footer@0.6.8:
+ resolution: {integrity: sha512-JBZ+xcb6kkex8XnBd4VHw1ZxjV6kmcwUumSHaIFdka2qzMCo7Klcy4sI6G0XtUpG/vtpislQCc+S9Bc+NLHYMg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ rc-image@7.12.0:
+ resolution: {integrity: sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-input-number@9.5.0:
+ resolution: {integrity: sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-input@1.8.0:
+ resolution: {integrity: sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ rc-mentions@2.20.0:
+ resolution: {integrity: sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-menu@9.12.4:
+ resolution: {integrity: sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-menu@9.16.1:
+ resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-motion@2.9.5:
+ resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-notification@5.6.4:
+ resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-overflow@1.4.1:
+ resolution: {integrity: sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-pagination@5.1.0:
+ resolution: {integrity: sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-picker@4.11.3:
+ resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ date-fns: '>= 2.x'
+ dayjs: '>= 1.x'
+ luxon: '>= 3.x'
+ moment: '>= 2.x'
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ peerDependenciesMeta:
+ date-fns:
+ optional: true
+ dayjs:
+ optional: true
+ luxon:
+ optional: true
+ moment:
+ optional: true
+
+ rc-progress@4.0.0:
+ resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-rate@2.13.1:
+ resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-resize-observer@1.4.3:
+ resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-segmented@2.7.0:
+ resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+
+ rc-select@14.16.8:
+ resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ rc-slider@11.1.8:
+ resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-steps@6.0.1:
+ resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-switch@4.1.0:
+ resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-table@7.51.1:
+ resolution: {integrity: sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-tabs@12.15.0:
+ resolution: {integrity: sha512-aXFLRo7jo531Jed1LgRqrF0VmRnzM/Qki25PknM3S04gqyxpDaHNFpPba05pHhn+d1N+54qIi0IcY1odrCrF2A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-tabs@15.6.1:
+ resolution: {integrity: sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-textarea@1.10.0:
+ resolution: {integrity: sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-tooltip@6.4.0:
+ resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-tree-select@5.27.0:
+ resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ rc-tree@5.13.1:
+ resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==}
+ engines: {node: '>=10.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ rc-upload@4.9.2:
+ resolution: {integrity: sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-util@5.41.0:
+ resolution: {integrity: sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-util@5.44.4:
+ resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ rc-virtual-list@3.19.1:
+ resolution: {integrity: sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+
+ react-colorful@5.6.1:
+ resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ react-copy-to-clipboard@5.1.0:
+ resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==}
+ peerDependencies:
+ react: ^15.3.0 || 16 || 17 || 18
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-error-boundary@4.1.2:
+ resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==}
+ peerDependencies:
+ react: '>=16.13.1'
+
+ react-error-overlay@6.0.9:
+ resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==}
+
+ react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+ react-helmet-async@1.3.0:
+ resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
+ peerDependencies:
+ react: ^16.6.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
+
+ react-intersection-observer@9.8.2:
+ resolution: {integrity: sha512-901naEiiZmse3p+AmtbQ3NL9xx+gQ8TXLiGDc+8GiE3JKJkNV3vP737aGuWTAXBA+1QqxPrDDE+fIEgYpGDlrQ==}
+ peerDependencies:
+ react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ react-intl@7.1.11:
+ resolution: {integrity: sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ==}
+ peerDependencies:
+ react: 16 || 17 || 18 || 19
+ typescript: ^5.6.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-loading-skeleton@3.5.0:
+ resolution: {integrity: sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ react-merge-refs@1.1.0:
+ resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==}
+
+ react-refresh@0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+
+ react-refresh@0.14.2:
+ resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+ engines: {node: '>=0.10.0'}
+
+ react-router-dom@6.3.0:
+ resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+
+ react-router@6.3.0:
+ resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==}
+ peerDependencies:
+ react: '>=16.8'
+
+ react-simple-code-editor@0.13.1:
+ resolution: {integrity: sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ reactflow@11.11.4:
+ resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==}
+ peerDependencies:
+ react: '>=17'
+ react-dom: '>=17'
+
+ read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+
+ read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+
+ readable-stream@1.0.34:
+ resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==}
+
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ 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'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ real-require@0.1.0:
+ resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==}
+ engines: {node: '>= 12.13.0'}
+
+ redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regenerate-unicode-properties@10.1.1:
+ resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+ regenerator-runtime@0.13.11:
+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ rehype-autolink-headings@6.1.1:
+ resolution: {integrity: sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==}
+
+ rehype-remove-comments@5.0.0:
+ resolution: {integrity: sha512-sfiVT+u1in19sxo9vv/SDQVbHE2mADScNrpeVsUxBFl14zOMZnfPb6l4hR+lXqe10G13UFVqv5pt8zDbCR4JYQ==}
+
+ rehype-stringify@9.0.4:
+ resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==}
+
+ relateurl@0.2.7:
+ resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+ engines: {node: '>= 0.10'}
+
+ remark-directive@2.0.1:
+ resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==}
+
+ remark-frontmatter@4.0.1:
+ resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==}
+
+ remark-gfm@3.0.1:
+ resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
+
+ remark-parse@10.0.2:
+ resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==}
+
+ remark-rehype@10.1.0:
+ resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+
+ rename-keys@1.2.0:
+ resolution: {integrity: sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==}
+ engines: {node: '>= 0.8.0'}
+
+ renderkid@3.0.0:
+ resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
+
+ 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'}
+
+ reselect@4.1.8:
+ resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==}
+
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+ 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-global@1.0.0:
+ resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.19.0:
+ resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+
+ restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rimraf@5.0.1:
+ resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ ripemd160@2.0.1:
+ resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==}
+
+ ripemd160@2.0.2:
+ resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+
+ rollup-plugin-visualizer@5.9.0:
+ resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==}
+ engines: {node: '>=14'}
+ hasBin: true
+ peerDependencies:
+ rollup: 2.x || 3.x
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ rollup@3.29.5:
+ resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-applescript@5.0.0:
+ resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+ engines: {node: '>=12'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sass-loader@16.0.5:
+ resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==}
+ engines: {node: '>= 18.12.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+ sass: ^1.3.0
+ sass-embedded: '*'
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ node-sass:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ webpack:
+ optional: true
+
+ sass@1.89.2:
+ resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ sax@1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+
+ sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ schema-utils@3.3.0:
+ resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+ engines: {node: '>= 10.13.0'}
+
+ schema-utils@4.3.2:
+ resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==}
+ engines: {node: '>= 10.13.0'}
+
+ scroll-into-view-if-needed@3.1.0:
+ resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
+
+ selderee@0.11.0:
+ resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==}
+
+ select-hose@2.0.0:
+ resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ setimmediate@1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ sha.js@2.4.11:
+ resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+ hasBin: true
+
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ 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'}
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sitemap@7.1.2:
+ resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==}
+ engines: {node: '>=12.0.0', npm: '>=5.6.0'}
+ hasBin: true
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+
+ slice-ansi@4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+
+ sonic-boom@2.8.0:
+ resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
+
+ sort-object-keys@1.1.3:
+ resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
+
+ sort-package-json@2.4.1:
+ resolution: {integrity: sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ==}
+ hasBin: true
+
+ sort-package-json@3.3.1:
+ resolution: {integrity: sha512-awjhQR2Iy5UN3NuguAK5+RezcEuUg9Ra4O8y2Aj+DlJa7MywyHaipAPf9bu4qqFj0hsYHHoT9sS3aV7Ucu728g==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-resolve@0.6.0:
+ resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-license-ids@3.0.21:
+ resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
+
+ spdy-transport@3.0.0:
+ resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
+
+ spdy@4.0.2:
+ resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
+ engines: {node: '>=6.0.0'}
+
+ split-on-first@1.1.0:
+ resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
+ engines: {node: '>=6'}
+
+ split2@3.2.2:
+ resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stable@0.1.8:
+ resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+ deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+
+ stackframe@1.3.4:
+ resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ stream-browserify@2.0.2:
+ resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==}
+
+ stream-http@2.8.3:
+ resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==}
+
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+ strict-uri-encode@2.0.0:
+ resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
+ engines: {node: '>=4'}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-convert@0.2.1:
+ resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder-okam@1.3.0:
+ resolution: {integrity: sha512-N5lJgLJ02sIs9xNyqPgIywlGaLUW6s5cYRpnmM3gbfhGA3sggW0+E2go26D7oZgEH7jHpXDe+ArDrBXeCaP9QA==}
+
+ string_decoder@0.10.31:
+ resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ 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==}
+ engines: {node: '>=8'}
+
+ style-search@0.1.0:
+ resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+
+ style-to-object@0.4.4:
+ resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+
+ styled-components@5.3.11:
+ resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ react-is: '>= 16.8.0'
+
+ stylelint-config-recommended@7.0.0:
+ resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==}
+ peerDependencies:
+ stylelint: ^14.4.0
+
+ stylelint-config-standard@25.0.0:
+ resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==}
+ peerDependencies:
+ stylelint: ^14.4.0
+
+ stylelint@14.16.1:
+ resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+ stylis@4.3.6:
+ resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ 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'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ supports-hyperlinks@2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ svg-pathdata@5.0.5:
+ resolution: {integrity: sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==}
+ engines: {node: '>=6.9.5'}
+
+ svg-tags@1.0.0:
+ resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+
+ svgo-browser@1.3.8:
+ resolution: {integrity: sha512-yOgDNIcewFZN3+jXdWeh/rQzbWJjCq1dTHphLz2r4T4AfTm+nqCxZ5B89v9bjQbFKA/s/k7TUc7J90+pP2HTyw==}
+ engines: {node: '>=4.0.0'}
+ hasBin: true
+
+ svgo@2.8.0:
+ resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ svgson@4.1.0:
+ resolution: {integrity: sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ==}
+
+ synckit@0.11.8:
+ resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ synckit@0.8.5:
+ resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ systemjs@6.15.1:
+ resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
+
+ table@6.9.0:
+ resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+ engines: {node: '>=10.0.0'}
+
+ tapable@2.2.2:
+ resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==}
+ engines: {node: '>=6'}
+
+ terser-webpack-plugin@5.3.14:
+ resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.43.1:
+ resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+
+ text-extensions@1.9.0:
+ resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
+ engines: {node: '>=0.10'}
+
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ textextensions@2.6.0:
+ resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==}
+ engines: {node: '>=0.8'}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ thread-stream@0.15.2:
+ resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==}
+
+ throttle-debounce@5.0.2:
+ resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+ engines: {node: '>=12.22'}
+
+ through2@0.4.2:
+ resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==}
+
+ through2@4.0.2:
+ resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ timers-browserify@2.0.12:
+ resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
+ engines: {node: '>=0.6.0'}
+
+ tinyglobby@0.2.14:
+ resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
+ engines: {node: '>=12.0.0'}
+
+ titleize@3.0.0:
+ resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+ engines: {node: '>=12'}
+
+ tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+ to-arraybuffer@1.0.1:
+ resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
+
+ to-buffer@1.2.1:
+ resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==}
+ engines: {node: '>= 0.4'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ transformation-matrix@2.16.1:
+ resolution: {integrity: sha512-tdtC3wxVEuzU7X/ydL131Q3JU5cPMEn37oqVLITjRDSDsnSHVFzW2JiCLfZLIQEgWzZHdSy3J6bZzvKEN24jGA==}
+
+ traverse@0.6.6:
+ resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trim-newlines@3.0.1:
+ resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+ engines: {node: '>=8'}
+
+ trim-right@1.0.1:
+ resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==}
+ engines: {node: '>=0.10.0'}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
+ ts-toolbelt@9.6.0:
+ resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+
+ tsconfig-paths@4.0.0:
+ resolution: {integrity: sha512-SLBg2GBKlR6bVtMgJJlud/o3waplKtL7skmLkExomIiaAtLGtVsoXIqP3SYdjbcH9lq/KVv7pMZeCBpLYOit6Q==}
+
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsutils@3.21.0:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+
+ tsx@3.12.2:
+ resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==}
+ hasBin: true
+
+ tty-browserify@0.0.0:
+ resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.18.1:
+ resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+ engines: {node: '>=10'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+
+ type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+
+ type-fest@1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ types-ramda@0.29.10:
+ resolution: {integrity: sha512-5PJiW/eiTPyXXBYGZOYGezMl6qj7keBiZheRwfjJZY26QPHsNrjfJnz0mru6oeqqoTHOni893Jfd6zyUXfQRWg==}
+
+ typescript-transform-paths@3.4.7:
+ resolution: {integrity: sha512-1Us1kdkdfKd2unbkBAOV2HHRmbRBYpSuk9nJ7cLD2hP4QmfToiM/VpxNlhJc1eezVwVqSKSBjNSzZsK/fWR/9A==}
+ peerDependencies:
+ typescript: '>=3.6.5'
+
+ typescript@5.4.2:
+ resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.8.3:
+ resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ umi@4.4.11:
+ resolution: {integrity: sha512-KWPe91DJOyuNurSjzFTbEUypxrFjV0wVEdEXFid6m2IhM2iOepvkfeqk37GpvE9rMoLwo+i/1MIZm2xKhZATbQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@7.8.0:
+ resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
+
+ unfetch@5.0.0:
+ resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==}
+
+ unified@10.1.2:
+ resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+
+ unist-util-filter@4.0.1:
+ resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==}
+
+ unist-util-generated@2.0.1:
+ resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
+
+ unist-util-is@5.2.1:
+ resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+
+ unist-util-position@4.0.4:
+ resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+
+ unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+
+ unist-util-visit-parents@5.1.3:
+ resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+
+ unist-util-visit@4.1.2:
+ resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ unquote@1.1.1:
+ resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==}
+
+ unset-value@0.1.2:
+ resolution: {integrity: sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg==}
+ engines: {node: '>=0.10.0'}
+
+ untildify@4.0.0:
+ resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+ engines: {node: '>=8'}
+
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ url-okam@0.11.1:
+ resolution: {integrity: sha512-AM6OVeZNwKiirK3IwKxHuopgjX1jB0F8srK9OlCXN+wdmTNg6vgnN9xyQ5abhxq8Oj/kTleLU8OCfZ1FaEW37w==}
+
+ url@0.11.4:
+ resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+ engines: {node: '>= 0.4'}
+
+ use-debouncy@4.6.0:
+ resolution: {integrity: sha512-5N3n/oQYMuU3QKLXDa9p/xtdPKBcNbGQdLqJJPrkT164IMpHdke5xqoehDZCmgDciy+wJC+iqyE3g8c+k03lGg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ use-isomorphic-layout-effect@1.2.1:
+ resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sync-external-store@1.5.0:
+ resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ util-okam@0.11.1:
+ resolution: {integrity: sha512-e2bG47F03vYx2MbA6znK6t6dwffnXGsVzh8BLpi0pcQ7dDRQf0zSAQ9IR7M+aoozALNibw8eCY53gEK8bBpSjg==}
+
+ util.promisify@1.0.1:
+ resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==}
+
+ util@0.10.3:
+ resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==}
+
+ util@0.10.4:
+ resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==}
+
+ util@0.11.1:
+ resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==}
+
+ utila@0.4.0:
+ resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ v8-compile-cache@2.3.0:
+ resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
+
+ v8-compile-cache@2.4.0:
+ resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==}
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ validator@13.15.15:
+ resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==}
+ engines: {node: '>= 0.10'}
+
+ vanilla-jsoneditor@0.16.1:
+ resolution: {integrity: sha512-Wirg6DoCrJpYwMHxkwyvgQ16gr4kgH9zzueHSSSovzQDvlg/XSqpY/stVsI5lz1vqJW1RAtr0Ilyyg1AbokRXA==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vfile-location@4.1.0:
+ resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==}
+
+ vfile-message@3.1.4:
+ resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+
+ vfile@5.3.7:
+ resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+
+ vite@4.5.2:
+ resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vm-browserify@1.1.2:
+ resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+
+ walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+ watchpack@2.4.4:
+ resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==}
+ engines: {node: '>=10.13.0'}
+
+ wbuf@1.7.3:
+ resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ webpack-5-chain@8.0.1:
+ resolution: {integrity: sha512-Tu1w80WA2Z+X6e7KzGy+cc0A0z+npVJA/fh55q2azMJ030gqz343Kx+yNAstDCeugsepmtDWY2J2IBRW/O+DEA==}
+ engines: {node: '>=10'}
+
+ webpack-sources@3.3.3:
+ resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==}
+ engines: {node: '>=10.13.0'}
+
+ webpack@5.99.9:
+ resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.19:
+ resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+ engines: {node: '>= 0.4'}
+
+ which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ 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@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ xml-lexer@0.2.2:
+ resolution: {integrity: sha512-G0i98epIwiUEiKmMcavmVdhtymW+pCAohMRgybyIME9ygfVu8QheIi+YoQh3ngiThsT0SQzJT4R0sKDEv8Ou0w==}
+
+ xml-reader@2.4.3:
+ resolution: {integrity: sha512-xWldrIxjeAMAu6+HSf9t50ot1uL5M+BtOidRCWHXIeewvSeIpscWCsp4Zxjk8kHHhdqFBrfK8U0EJeCcnyQ/gA==}
+
+ xtend@2.1.2:
+ resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==}
+ engines: {node: '>=0.4'}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
+ yaml@2.3.1:
+ resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
+ engines: {node: '>= 14'}
+
+ yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+
+ 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'}
+
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ z-schema@5.0.5:
+ resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==}
+ engines: {node: '>=8.0.0'}
+ hasBin: true
+
+ zod-validation-error@2.1.0:
+ resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.18.0
+
+ zod@3.25.67:
+ resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==}
+
+ zustand@4.5.7:
+ resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
+ engines: {node: '>=12.7.0'}
+ peerDependencies:
+ '@types/react': '>=16.8'
+ immer: '>=9.0.6'
+ react: '>=16.8'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.10
+ '@jridgewell/trace-mapping': 0.3.27
+
+ '@ant-design/colors@6.0.0':
+ dependencies:
+ '@ctrl/tinycolor': 3.6.0
+
+ '@ant-design/colors@7.2.1':
+ dependencies:
+ '@ant-design/fast-color': 2.0.6
+
+ '@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@babel/runtime': 7.27.6
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@ant-design/cssinjs@1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.22.3
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.3.2
+ csstype: 3.1.3
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ stylis: 4.3.6
+
+ '@ant-design/cssinjs@1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.5.1
+ csstype: 3.1.3
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ stylis: 4.3.6
+
+ '@ant-design/fast-color@2.0.6':
+ dependencies:
+ '@babel/runtime': 7.27.6
+
+ '@ant-design/icons-svg@4.4.2': {}
+
+ '@ant-design/icons@4.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.22.3
+ classnames: 2.3.2
+ lodash: 4.17.21
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@ant-design/icons@5.3.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ant-design/colors': 7.2.1
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.22.3
+ classnames: 2.3.2
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@ant-design/icons@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ant-design/colors': 7.2.1
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@ant-design/react-slick@1.1.2(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ json2mq: 0.2.0
+ react: 18.3.1
+ resize-observer-polyfill: 1.5.1
+ throttle-debounce: 5.0.2
+
+ '@antfu/install-pkg@0.1.1':
+ dependencies:
+ execa: 5.1.1
+ find-up: 5.0.0
+
+ '@antfu/utils@0.7.10': {}
+
+ '@arvinxu/layout-kit@1.4.0(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)':
+ dependencies:
+ styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - react
+ - react-dom
+ - react-is
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.27.1
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.27.7': {}
+
+ '@babel/core@7.23.6':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.27.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.27.3(@babel/core@7.23.6)
+ '@babel/helpers': 7.27.6
+ '@babel/parser': 7.27.7
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ '@babel/types': 7.27.7
+ convert-source-map: 2.0.0
+ debug: 4.4.1(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.27.7':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.27.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7)
+ '@babel/helpers': 7.27.6
+ '@babel/parser': 7.27.7
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ '@babel/types': 7.27.7
+ convert-source-map: 2.0.0
+ debug: 4.4.1(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/eslint-parser@7.23.3(@babel/core@7.23.6)(eslint@8.57.1)':
+ dependencies:
+ '@babel/core': 7.23.6
+ '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+ eslint: 8.57.1
+ eslint-visitor-keys: 2.1.0
+ semver: 6.3.1
+
+ '@babel/generator@7.2.0':
+ dependencies:
+ '@babel/types': 7.27.7
+ jsesc: 2.5.2
+ lodash: 4.17.21
+ source-map: 0.5.7
+ trim-right: 1.0.1
+
+ '@babel/generator@7.27.5':
+ dependencies:
+ '@babel/parser': 7.27.7
+ '@babel/types': 7.27.7
+ '@jridgewell/gen-mapping': 0.3.10
+ '@jridgewell/trace-mapping': 0.3.27
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.27.7
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.27.7
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.25.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-module-imports@7.27.1(supports-color@5.5.0)':
+ dependencies:
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ '@babel/types': 7.27.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.27.3(@babel/core@7.23.6)':
+ dependencies:
+ '@babel/core': 7.23.6
+ '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.27.1': {}
+
+ '@babel/helper-simple-access@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ '@babel/types': 7.27.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.27.1': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.27.6':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.27.7
+
+ '@babel/parser@7.27.7':
+ dependencies:
+ '@babel/types': 7.27.7
+
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-simple-access': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/runtime@7.22.3':
+ dependencies:
+ regenerator-runtime: 0.13.11
+
+ '@babel/runtime@7.23.6':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/runtime@7.27.6': {}
+
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.27.7
+ '@babel/types': 7.27.7
+
+ '@babel/traverse@7.27.7(supports-color@5.5.0)':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.27.5
+ '@babel/parser': 7.27.7
+ '@babel/template': 7.27.2
+ '@babel/types': 7.27.7
+ debug: 4.4.1(supports-color@5.5.0)
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.27.7':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+
+ '@bloomberg/record-tuple-polyfill@0.0.4': {}
+
+ '@commitlint/cli@17.8.1(@swc/core@1.9.2(@swc/helpers@0.5.1))':
+ dependencies:
+ '@commitlint/format': 17.8.1
+ '@commitlint/lint': 17.8.1
+ '@commitlint/load': 17.8.1(@swc/core@1.9.2(@swc/helpers@0.5.1))
+ '@commitlint/read': 17.8.1
+ '@commitlint/types': 17.8.1
+ execa: 5.1.1
+ lodash.isfunction: 3.0.9
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+
+ '@commitlint/config-conventional@17.8.1':
+ dependencies:
+ conventional-changelog-conventionalcommits: 6.1.0
+
+ '@commitlint/config-validator@17.8.1':
+ dependencies:
+ '@commitlint/types': 17.8.1
+ ajv: 8.17.1
+
+ '@commitlint/ensure@17.8.1':
+ dependencies:
+ '@commitlint/types': 17.8.1
+ 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@17.8.1': {}
+
+ '@commitlint/format@17.8.1':
+ dependencies:
+ '@commitlint/types': 17.8.1
+ chalk: 4.1.2
+
+ '@commitlint/is-ignored@17.8.1':
+ dependencies:
+ '@commitlint/types': 17.8.1
+ semver: 7.5.4
+
+ '@commitlint/lint@17.8.1':
+ dependencies:
+ '@commitlint/is-ignored': 17.8.1
+ '@commitlint/parse': 17.8.1
+ '@commitlint/rules': 17.8.1
+ '@commitlint/types': 17.8.1
+
+ '@commitlint/load@17.8.1(@swc/core@1.9.2(@swc/helpers@0.5.1))':
+ dependencies:
+ '@commitlint/config-validator': 17.8.1
+ '@commitlint/execute-rule': 17.8.1
+ '@commitlint/resolve-extends': 17.8.1
+ '@commitlint/types': 17.8.1
+ '@types/node': 20.5.1
+ chalk: 4.1.2
+ cosmiconfig: 8.3.6(typescript@5.4.2)
+ cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.8.3))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@20.5.1)(typescript@5.8.3))(typescript@5.8.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ resolve-from: 5.0.0
+ ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@20.5.1)(typescript@5.4.2)
+ typescript: 5.8.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+
+ '@commitlint/message@17.8.1': {}
+
+ '@commitlint/parse@17.8.1':
+ dependencies:
+ '@commitlint/types': 17.8.1
+ conventional-changelog-angular: 6.0.0
+ conventional-commits-parser: 4.0.0
+
+ '@commitlint/read@17.8.1':
+ dependencies:
+ '@commitlint/top-level': 17.8.1
+ '@commitlint/types': 17.8.1
+ fs-extra: 11.3.0
+ git-raw-commits: 2.0.11
+ minimist: 1.2.8
+
+ '@commitlint/resolve-extends@17.8.1':
+ dependencies:
+ '@commitlint/config-validator': 17.8.1
+ '@commitlint/types': 17.8.1
+ import-fresh: 3.3.1
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+
+ '@commitlint/rules@17.8.1':
+ dependencies:
+ '@commitlint/ensure': 17.8.1
+ '@commitlint/message': 17.8.1
+ '@commitlint/to-lines': 17.8.1
+ '@commitlint/types': 17.8.1
+ execa: 5.1.1
+
+ '@commitlint/to-lines@17.8.1': {}
+
+ '@commitlint/top-level@17.8.1':
+ dependencies:
+ find-up: 5.0.0
+
+ '@commitlint/types@17.8.1':
+ dependencies:
+ chalk: 4.1.2
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@csstools/postcss-color-function@1.1.1(postcss@8.5.6)':
+ dependencies:
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-font-format-keywords@1.0.1(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-hwb-function@1.0.2(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-ic-unit@1.0.1(postcss@8.5.6)':
+ dependencies:
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.6)':
+ dependencies:
+ '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ '@csstools/postcss-normalize-display-values@1.0.1(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-oklab-function@1.1.1(postcss@8.5.6)':
+ dependencies:
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ '@csstools/postcss-unset-value@1.0.2(postcss@8.5.6)':
+ dependencies:
+ postcss: 8.5.6
+
+ '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)':
+ dependencies:
+ postcss-selector-parser: 6.1.2
+
+ '@ctrl/tinycolor@3.6.0': {}
+
+ '@emotion/babel-plugin@11.13.5':
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+ '@babel/runtime': 7.22.3
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/serialize': 1.3.3
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/cache@11.14.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ stylis: 4.2.0
+
+ '@emotion/css@11.11.2':
+ dependencies:
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/hash@0.8.0': {}
+
+ '@emotion/hash@0.9.2': {}
+
+ '@emotion/is-prop-valid@1.3.1':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+
+ '@emotion/memoize@0.9.0': {}
+
+ '@emotion/react@11.11.0(@types/react@18.3.23)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.22.3
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1)
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.3.1
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.23
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/serialize@1.3.3':
+ dependencies:
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/unitless': 0.10.0
+ '@emotion/utils': 1.4.2
+ csstype: 3.1.3
+
+ '@emotion/server@11.11.0(@emotion/css@11.11.2)':
+ dependencies:
+ '@emotion/utils': 1.4.2
+ html-tokenize: 2.0.1
+ multipipe: 1.0.2
+ through: 2.3.8
+ optionalDependencies:
+ '@emotion/css': 11.11.2
+
+ '@emotion/sheet@1.4.0': {}
+
+ '@emotion/stylis@0.8.5': {}
+
+ '@emotion/unitless@0.10.0': {}
+
+ '@emotion/unitless@0.7.5': {}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@emotion/utils@1.4.2': {}
+
+ '@emotion/weak-memoize@0.3.1': {}
+
+ '@emotion/weak-memoize@0.4.0': {}
+
+ '@esbuild-kit/cjs-loader@2.4.4':
+ dependencies:
+ '@esbuild-kit/core-utils': 3.3.2
+ get-tsconfig: 4.10.1
+
+ '@esbuild-kit/core-utils@3.3.2':
+ dependencies:
+ esbuild: 0.18.20
+ source-map-support: 0.5.21
+
+ '@esbuild-kit/esm-loader@2.6.5':
+ dependencies:
+ '@esbuild-kit/core-utils': 3.3.2
+ get-tsconfig: 4.10.1
+
+ '@esbuild/aix-ppc64@0.21.4':
+ optional: true
+
+ '@esbuild/android-arm64@0.17.19':
+ optional: true
+
+ '@esbuild/android-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/android-arm64@0.21.4':
+ optional: true
+
+ '@esbuild/android-arm@0.17.19':
+ optional: true
+
+ '@esbuild/android-arm@0.18.20':
+ optional: true
+
+ '@esbuild/android-arm@0.21.4':
+ optional: true
+
+ '@esbuild/android-x64@0.17.19':
+ optional: true
+
+ '@esbuild/android-x64@0.18.20':
+ optional: true
+
+ '@esbuild/android-x64@0.21.4':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.17.19':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.21.4':
+ optional: true
+
+ '@esbuild/darwin-x64@0.17.19':
+ optional: true
+
+ '@esbuild/darwin-x64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-x64@0.21.4':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.17.19':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.21.4':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.17.19':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.21.4':
+ optional: true
+
+ '@esbuild/linux-arm64@0.17.19':
+ optional: true
+
+ '@esbuild/linux-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm64@0.21.4':
+ optional: true
+
+ '@esbuild/linux-arm@0.17.19':
+ optional: true
+
+ '@esbuild/linux-arm@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm@0.21.4':
+ optional: true
+
+ '@esbuild/linux-ia32@0.17.19':
+ optional: true
+
+ '@esbuild/linux-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ia32@0.21.4':
+ optional: true
+
+ '@esbuild/linux-loong64@0.17.19':
+ optional: true
+
+ '@esbuild/linux-loong64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-loong64@0.21.4':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.17.19':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.18.20':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.21.4':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.17.19':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.21.4':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.17.19':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.21.4':
+ optional: true
+
+ '@esbuild/linux-s390x@0.17.19':
+ optional: true
+
+ '@esbuild/linux-s390x@0.18.20':
+ optional: true
+
+ '@esbuild/linux-s390x@0.21.4':
+ optional: true
+
+ '@esbuild/linux-x64@0.17.19':
+ optional: true
+
+ '@esbuild/linux-x64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-x64@0.21.4':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.17.19':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.21.4':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.17.19':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.21.4':
+ optional: true
+
+ '@esbuild/sunos-x64@0.17.19':
+ optional: true
+
+ '@esbuild/sunos-x64@0.18.20':
+ optional: true
+
+ '@esbuild/sunos-x64@0.21.4':
+ optional: true
+
+ '@esbuild/win32-arm64@0.17.19':
+ optional: true
+
+ '@esbuild/win32-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-arm64@0.21.4':
+ optional: true
+
+ '@esbuild/win32-ia32@0.17.19':
+ optional: true
+
+ '@esbuild/win32-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/win32-ia32@0.21.4':
+ optional: true
+
+ '@esbuild/win32-x64@0.17.19':
+ optional: true
+
+ '@esbuild/win32-x64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-x64@0.21.4':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)':
+ dependencies:
+ eslint: 8.57.1
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/eslintrc@2.1.4':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.1(supports-color@5.5.0)
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@8.57.1': {}
+
+ '@floating-ui/core@0.6.2': {}
+
+ '@floating-ui/dom@0.4.5':
+ dependencies:
+ '@floating-ui/core': 0.6.2
+
+ '@floating-ui/react-dom-interactions@0.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 0.6.3(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ aria-hidden: 1.2.6
+ point-in-polygon: 1.1.0
+ use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - react
+ - react-dom
+
+ '@floating-ui/react-dom@0.6.3(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 0.4.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+
+ '@formatjs/ecma402-abstract@2.3.4':
+ dependencies:
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/intl-localematcher': 0.6.1
+ decimal.js: 10.5.0
+ tslib: 2.8.1
+
+ '@formatjs/fast-memoize@2.2.7':
+ dependencies:
+ tslib: 2.8.1
+
+ '@formatjs/icu-messageformat-parser@2.11.2':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.4
+ '@formatjs/icu-skeleton-parser': 1.8.14
+ tslib: 2.8.1
+
+ '@formatjs/icu-skeleton-parser@1.8.14':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.4
+ tslib: 2.8.1
+
+ '@formatjs/intl-localematcher@0.6.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@formatjs/intl@3.1.6(typescript@5.4.2)':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.4
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/icu-messageformat-parser': 2.11.2
+ intl-messageformat: 10.7.16
+ tslib: 2.8.1
+ optionalDependencies:
+ typescript: 5.4.2
+
+ '@humanwhocodes/config-array@0.13.0':
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.4.1(supports-color@5.5.0)
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/object-schema@2.0.3': {}
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.1.1':
+ dependencies:
+ '@antfu/install-pkg': 0.1.1
+ '@antfu/utils': 0.7.10
+ '@iconify/types': 2.0.0
+ debug: 4.4.1(supports-color@5.5.0)
+ kolorist: 1.8.0
+ local-pkg: 0.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jest/schemas@29.6.3':
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+
+ '@jest/transform@29.7.0':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.27
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.7
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/types@24.9.0':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 1.1.2
+ '@types/yargs': 13.0.12
+
+ '@jest/types@27.5.1':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 24.0.7
+ '@types/yargs': 16.0.9
+ chalk: 4.1.2
+
+ '@jest/types@29.6.3':
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 24.0.7
+ '@types/yargs': 17.0.33
+ chalk: 4.1.2
+
+ '@jridgewell/gen-mapping@0.3.10':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.2
+ '@jridgewell/trace-mapping': 0.3.27
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.8':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.10
+ '@jridgewell/trace-mapping': 0.3.27
+
+ '@jridgewell/sourcemap-codec@1.5.2': {}
+
+ '@jridgewell/trace-mapping@0.3.27':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.2
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.2
+
+ '@loadable/component@5.15.2(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.23.6
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ react-is: 16.13.1
+
+ '@makotot/ghostui@2.0.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@microsoft/api-extractor-model@7.28.17(@types/node@20.5.1)':
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ '@microsoft/tsdoc-config': 0.16.2
+ '@rushstack/node-core-library': 4.3.0(@types/node@20.5.1)
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/api-extractor@7.43.7(@types/node@20.5.1)':
+ dependencies:
+ '@microsoft/api-extractor-model': 7.28.17(@types/node@20.5.1)
+ '@microsoft/tsdoc': 0.14.2
+ '@microsoft/tsdoc-config': 0.16.2
+ '@rushstack/node-core-library': 4.3.0(@types/node@20.5.1)
+ '@rushstack/rig-package': 0.5.2
+ '@rushstack/terminal': 0.11.0(@types/node@20.5.1)
+ '@rushstack/ts-command-line': 4.21.0(@types/node@20.5.1)
+ lodash: 4.17.21
+ minimatch: 3.0.8
+ resolve: 1.22.10
+ semver: 7.5.4
+ source-map: 0.6.1
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/tsdoc-config@0.16.2':
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ ajv: 6.12.6
+ jju: 1.4.0
+ resolve: 1.19.0
+
+ '@microsoft/tsdoc@0.14.2': {}
+
+ '@module-federation/error-codes@0.8.12': {}
+
+ '@module-federation/runtime-core@0.6.20':
+ dependencies:
+ '@module-federation/error-codes': 0.8.12
+ '@module-federation/sdk': 0.8.12
+
+ '@module-federation/runtime@0.8.12':
+ dependencies:
+ '@module-federation/error-codes': 0.8.12
+ '@module-federation/runtime-core': 0.6.20
+ '@module-federation/sdk': 0.8.12
+
+ '@module-federation/sdk@0.8.12':
+ dependencies:
+ isomorphic-rslog: 0.0.7
+
+ '@module-federation/webpack-bundler-runtime@0.8.12':
+ dependencies:
+ '@module-federation/runtime': 0.8.12
+ '@module-federation/sdk': 0.8.12
+
+ '@napi-rs/nice-android-arm-eabi@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-android-arm64@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-darwin-arm64@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-darwin-x64@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-freebsd-x64@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-arm-gnueabihf@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-arm64-gnu@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-arm64-musl@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-ppc64-gnu@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-riscv64-gnu@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-s390x-gnu@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-x64-gnu@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-linux-x64-musl@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-win32-arm64-msvc@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-win32-ia32-msvc@1.0.1':
+ optional: true
+
+ '@napi-rs/nice-win32-x64-msvc@1.0.1':
+ optional: true
+
+ '@napi-rs/nice@1.0.1':
+ optionalDependencies:
+ '@napi-rs/nice-android-arm-eabi': 1.0.1
+ '@napi-rs/nice-android-arm64': 1.0.1
+ '@napi-rs/nice-darwin-arm64': 1.0.1
+ '@napi-rs/nice-darwin-x64': 1.0.1
+ '@napi-rs/nice-freebsd-x64': 1.0.1
+ '@napi-rs/nice-linux-arm-gnueabihf': 1.0.1
+ '@napi-rs/nice-linux-arm64-gnu': 1.0.1
+ '@napi-rs/nice-linux-arm64-musl': 1.0.1
+ '@napi-rs/nice-linux-ppc64-gnu': 1.0.1
+ '@napi-rs/nice-linux-riscv64-gnu': 1.0.1
+ '@napi-rs/nice-linux-s390x-gnu': 1.0.1
+ '@napi-rs/nice-linux-x64-gnu': 1.0.1
+ '@napi-rs/nice-linux-x64-musl': 1.0.1
+ '@napi-rs/nice-win32-arm64-msvc': 1.0.1
+ '@napi-rs/nice-win32-ia32-msvc': 1.0.1
+ '@napi-rs/nice-win32-x64-msvc': 1.0.1
+ optional: true
+
+ '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
+ dependencies:
+ eslint-scope: 5.1.1
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@parcel/watcher-android-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher@2.5.1':
+ dependencies:
+ detect-libc: 1.0.3
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ node-addon-api: 7.1.1
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.1
+ '@parcel/watcher-darwin-arm64': 2.5.1
+ '@parcel/watcher-darwin-x64': 2.5.1
+ '@parcel/watcher-freebsd-x64': 2.5.1
+ '@parcel/watcher-linux-arm-glibc': 2.5.1
+ '@parcel/watcher-linux-arm-musl': 2.5.1
+ '@parcel/watcher-linux-arm64-glibc': 2.5.1
+ '@parcel/watcher-linux-arm64-musl': 2.5.1
+ '@parcel/watcher-linux-x64-glibc': 2.5.1
+ '@parcel/watcher-linux-x64-musl': 2.5.1
+ '@parcel/watcher-win32-arm64': 2.5.1
+ '@parcel/watcher-win32-ia32': 2.5.1
+ '@parcel/watcher-win32-x64': 2.5.1
+ optional: true
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@pkgr/core@0.2.7': {}
+
+ '@pkgr/utils@2.4.2':
+ dependencies:
+ cross-spawn: 7.0.6
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ open: 9.1.0
+ picocolors: 1.1.1
+ tslib: 2.8.1
+
+ '@rc-component/async-validator@5.0.4':
+ dependencies:
+ '@babel/runtime': 7.27.6
+
+ '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ant-design/fast-color': 2.0.6
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/mini-decimal@1.1.0':
+ dependencies:
+ '@babel/runtime': 7.27.6
+
+ '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.22.3
+ classnames: 2.3.2
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/trigger@1.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@rc-component/trigger@2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@reactflow/background@11.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classcat: 5.0.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@reactflow/controls@11.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classcat: 5.0.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@reactflow/core@11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@types/d3': 7.4.3
+ '@types/d3-drag': 3.0.7
+ '@types/d3-selection': 3.0.11
+ '@types/d3-zoom': 3.0.8
+ classcat: 5.0.5
+ d3-drag: 3.0.0
+ d3-selection: 3.0.0
+ d3-zoom: 3.0.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@reactflow/minimap@11.7.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/d3-selection': 3.0.11
+ '@types/d3-zoom': 3.0.8
+ classcat: 5.0.5
+ d3-selection: 3.0.0
+ d3-zoom: 3.0.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@reactflow/node-resizer@2.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classcat: 5.0.5
+ d3-drag: 3.0.0
+ d3-selection: 3.0.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@reactflow/node-toolbar@1.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classcat: 5.0.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ '@rushstack/node-core-library@4.3.0(@types/node@20.5.1)':
+ dependencies:
+ fs-extra: 7.0.1
+ import-lazy: 4.0.0
+ jju: 1.4.0
+ resolve: 1.22.10
+ semver: 7.5.4
+ z-schema: 5.0.5
+ optionalDependencies:
+ '@types/node': 20.5.1
+
+ '@rushstack/rig-package@0.5.2':
+ dependencies:
+ resolve: 1.22.10
+ strip-json-comments: 3.1.1
+
+ '@rushstack/terminal@0.11.0(@types/node@20.5.1)':
+ dependencies:
+ '@rushstack/node-core-library': 4.3.0(@types/node@20.5.1)
+ supports-color: 8.1.1
+ optionalDependencies:
+ '@types/node': 20.5.1
+
+ '@rushstack/ts-command-line@4.21.0(@types/node@20.5.1)':
+ dependencies:
+ '@rushstack/terminal': 0.11.0(@types/node@20.5.1)
+ '@types/argparse': 1.0.38
+ argparse: 1.0.10
+ string-argv: 0.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@selderee/plugin-htmlparser2@0.11.0':
+ dependencies:
+ domhandler: 5.0.3
+ selderee: 0.11.0
+
+ '@sinclair/typebox@0.27.8': {}
+
+ '@sketch-hq/sketch-file-format-ts@6.5.0': {}
+
+ '@stackblitz/sdk@1.11.0': {}
+
+ '@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@8.5.6)':
+ dependencies:
+ '@babel/core': 7.23.6
+ postcss: 8.5.6
+ postcss-syntax: 0.36.2(postcss@8.5.6)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+
+ '@svgr/babel-preset@6.5.1(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.27.7)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.27.7)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.27.7)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.27.7)
+ '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.27.7)
+ '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.27.7)
+ '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.27.7)
+ '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.27.7)
+
+ '@svgr/core@6.5.1':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@svgr/babel-preset': 6.5.1(@babel/core@7.27.7)
+ '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1)
+ camelcase: 6.3.0
+ cosmiconfig: 7.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@svgr/hast-util-to-babel-ast@6.5.1':
+ dependencies:
+ '@babel/types': 7.27.7
+ entities: 4.5.0
+
+ '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@svgr/babel-preset': 6.5.1(@babel/core@7.27.7)
+ '@svgr/core': 6.5.1
+ '@svgr/hast-util-to-babel-ast': 6.5.1
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1)':
+ dependencies:
+ '@svgr/core': 6.5.1
+ cosmiconfig: 7.1.0
+ deepmerge: 4.3.1
+ svgo: 2.8.0
+
+ '@swc/core-darwin-arm64@1.9.2':
+ optional: true
+
+ '@swc/core-darwin-x64@1.9.2':
+ optional: true
+
+ '@swc/core-linux-arm-gnueabihf@1.9.2':
+ optional: true
+
+ '@swc/core-linux-arm64-gnu@1.9.2':
+ optional: true
+
+ '@swc/core-linux-arm64-musl@1.9.2':
+ optional: true
+
+ '@swc/core-linux-x64-gnu@1.9.2':
+ optional: true
+
+ '@swc/core-linux-x64-musl@1.9.2':
+ optional: true
+
+ '@swc/core-win32-arm64-msvc@1.9.2':
+ optional: true
+
+ '@swc/core-win32-ia32-msvc@1.9.2':
+ optional: true
+
+ '@swc/core-win32-x64-msvc@1.9.2':
+ optional: true
+
+ '@swc/core@1.9.2(@swc/helpers@0.5.1)':
+ dependencies:
+ '@swc/counter': 0.1.3
+ '@swc/types': 0.1.23
+ optionalDependencies:
+ '@swc/core-darwin-arm64': 1.9.2
+ '@swc/core-darwin-x64': 1.9.2
+ '@swc/core-linux-arm-gnueabihf': 1.9.2
+ '@swc/core-linux-arm64-gnu': 1.9.2
+ '@swc/core-linux-arm64-musl': 1.9.2
+ '@swc/core-linux-x64-gnu': 1.9.2
+ '@swc/core-linux-x64-musl': 1.9.2
+ '@swc/core-win32-arm64-msvc': 1.9.2
+ '@swc/core-win32-ia32-msvc': 1.9.2
+ '@swc/core-win32-x64-msvc': 1.9.2
+ '@swc/helpers': 0.5.1
+
+ '@swc/counter@0.1.3': {}
+
+ '@swc/helpers@0.5.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@swc/types@0.1.23':
+ dependencies:
+ '@swc/counter': 0.1.3
+
+ '@trysound/sax@0.2.0': {}
+
+ '@tsconfig/node10@1.0.11': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/argparse@1.0.38': {}
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.27.7
+ '@babel/types': 7.27.7
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.7
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.27.7
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.27.7
+ '@babel/types': 7.27.7
+
+ '@types/babel__traverse@7.20.7':
+ dependencies:
+ '@babel/types': 7.27.7
+
+ '@types/d3-array@3.2.1': {}
+
+ '@types/d3-axis@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-brush@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-chord@3.0.6': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-contour@3.0.6':
+ dependencies:
+ '@types/d3-array': 3.2.1
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-delaunay@6.0.4': {}
+
+ '@types/d3-dispatch@3.0.6': {}
+
+ '@types/d3-drag@3.0.7':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-dsv@3.0.7': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-fetch@3.0.7':
+ dependencies:
+ '@types/d3-dsv': 3.0.7
+
+ '@types/d3-force@3.0.10': {}
+
+ '@types/d3-format@3.0.4': {}
+
+ '@types/d3-geo@3.1.0':
+ dependencies:
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-hierarchy@3.1.7': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-polygon@3.0.2': {}
+
+ '@types/d3-quadtree@3.0.6': {}
+
+ '@types/d3-random@3.0.3': {}
+
+ '@types/d3-scale-chromatic@3.1.0': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-selection@3.0.11': {}
+
+ '@types/d3-shape@3.1.7':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time-format@4.0.3': {}
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
+ '@types/d3-transition@3.0.9':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-zoom@3.0.8':
+ dependencies:
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3@7.4.3':
+ dependencies:
+ '@types/d3-array': 3.2.1
+ '@types/d3-axis': 3.0.6
+ '@types/d3-brush': 3.0.6
+ '@types/d3-chord': 3.0.6
+ '@types/d3-color': 3.1.3
+ '@types/d3-contour': 3.0.6
+ '@types/d3-delaunay': 6.0.4
+ '@types/d3-dispatch': 3.0.6
+ '@types/d3-drag': 3.0.7
+ '@types/d3-dsv': 3.0.7
+ '@types/d3-ease': 3.0.2
+ '@types/d3-fetch': 3.0.7
+ '@types/d3-force': 3.0.10
+ '@types/d3-format': 3.0.4
+ '@types/d3-geo': 3.1.0
+ '@types/d3-hierarchy': 3.1.7
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-path': 3.1.1
+ '@types/d3-polygon': 3.0.2
+ '@types/d3-quadtree': 3.0.6
+ '@types/d3-random': 3.0.3
+ '@types/d3-scale': 4.0.9
+ '@types/d3-scale-chromatic': 3.1.0
+ '@types/d3-selection': 3.0.11
+ '@types/d3-shape': 3.1.7
+ '@types/d3-time': 3.0.4
+ '@types/d3-time-format': 4.0.3
+ '@types/d3-timer': 3.0.2
+ '@types/d3-transition': 3.0.9
+ '@types/d3-zoom': 3.0.8
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.8
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.8
+
+ '@types/estree@1.0.8': {}
+
+ '@types/fs-extra@11.0.1':
+ dependencies:
+ '@types/jsonfile': 6.1.4
+ '@types/node': 24.0.7
+
+ '@types/geojson@7946.0.16': {}
+
+ '@types/graceful-fs@4.1.9':
+ dependencies:
+ '@types/node': 24.0.7
+
+ '@types/hapi__joi@17.1.9': {}
+
+ '@types/hast@2.3.10':
+ dependencies:
+ '@types/unist': 2.0.11
+
+ '@types/hoist-non-react-statics@3.3.6':
+ dependencies:
+ '@types/react': 18.3.23
+ hoist-non-react-statics: 3.3.2
+
+ '@types/html-minifier-terser@6.1.0': {}
+
+ '@types/istanbul-lib-coverage@2.0.6': {}
+
+ '@types/istanbul-lib-report@3.0.3':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+
+ '@types/istanbul-reports@1.1.2':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-lib-report': 3.0.3
+
+ '@types/istanbul-reports@3.0.4':
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/jsonfile@6.1.4':
+ dependencies:
+ '@types/node': 24.0.7
+
+ '@types/mdast@3.0.15':
+ dependencies:
+ '@types/unist': 2.0.11
+
+ '@types/minimist@1.2.5': {}
+
+ '@types/ms@2.1.0': {}
+
+ '@types/node@17.0.45': {}
+
+ '@types/node@20.5.1': {}
+
+ '@types/node@24.0.7':
+ dependencies:
+ undici-types: 7.8.0
+
+ '@types/normalize-package-data@2.4.4': {}
+
+ '@types/parse-json@4.0.2': {}
+
+ '@types/parse5@6.0.3': {}
+
+ '@types/prismjs@1.26.5': {}
+
+ '@types/prop-types@15.7.15': {}
+
+ '@types/q@1.5.8': {}
+
+ '@types/ramda@0.29.3':
+ dependencies:
+ types-ramda: 0.29.10
+
+ '@types/react-dom@18.3.7(@types/react@18.3.23)':
+ dependencies:
+ '@types/react': 18.3.23
+
+ '@types/react@18.3.23':
+ dependencies:
+ '@types/prop-types': 15.7.15
+ csstype: 3.1.3
+
+ '@types/resolve@1.20.6': {}
+
+ '@types/sax@1.2.7':
+ dependencies:
+ '@types/node': 17.0.45
+
+ '@types/semver@7.7.0': {}
+
+ '@types/unist@2.0.11': {}
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@13.0.12':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@types/yargs@16.0.9':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@types/yargs@17.0.33':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ debug: 4.4.1(supports-color@5.5.0)
+ eslint: 8.57.1
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare-lite: 1.4.0
+ semver: 7.7.2
+ tsutils: 3.21.0(typescript@5.4.2)
+ optionalDependencies:
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
+ debug: 4.4.1(supports-color@5.5.0)
+ eslint: 8.57.1
+ optionalDependencies:
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+
+ '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.4.2)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ debug: 4.4.1(supports-color@5.5.0)
+ eslint: 8.57.1
+ tsutils: 3.21.0(typescript@5.4.2)
+ optionalDependencies:
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@5.62.0': {}
+
+ '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2)':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.4.1(supports-color@5.5.0)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.7.2
+ tsutils: 3.21.0(typescript@5.4.2)
+ optionalDependencies:
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.4.2)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.7.0
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
+ eslint: 8.57.1
+ eslint-scope: 5.1.1
+ semver: 7.7.2
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+
+ '@umijs/ast@4.4.11':
+ dependencies:
+ '@umijs/bundler-utils': 4.4.11
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/babel-preset-umi@4.4.11':
+ dependencies:
+ '@babel/runtime': 7.23.6
+ '@bloomberg/record-tuple-polyfill': 0.0.4
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ core-js: 3.34.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/bundler-esbuild@4.4.11':
+ dependencies:
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ enhanced-resolve: 5.9.3
+ postcss: 8.5.6
+ postcss-flexbugs-fixes: 5.0.2(postcss@8.5.6)
+ postcss-preset-env: 7.5.0(postcss@8.5.6)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/bundler-mako@0.11.10(postcss@8.5.6)(sass@1.89.2)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))':
+ dependencies:
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/mako': 0.11.10(postcss@8.5.6)(sass@1.89.2)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ chalk: 4.1.2
+ compression: 1.8.0
+ connect-history-api-fallback: 2.0.0
+ cors: 2.8.5
+ express: 4.21.2
+ express-http-proxy: 2.1.1
+ get-tsconfig: 4.7.5
+ lodash: 4.17.21
+ rimraf: 5.0.1
+ webpack-5-chain: 8.0.1
+ transitivePeerDependencies:
+ - '@rspack/core'
+ - node-sass
+ - postcss
+ - sass
+ - sass-embedded
+ - supports-color
+ - typescript
+ - webpack
+
+ '@umijs/bundler-utils@4.4.11':
+ dependencies:
+ '@umijs/utils': 4.4.11
+ esbuild: 0.21.4
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.1.1
+ spdy: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/bundler-vite@4.4.11(@types/node@20.5.1)(lightningcss@1.22.1)(postcss@8.5.6)(rollup@3.29.5)(sass@1.89.2)(terser@5.43.1)':
+ dependencies:
+ '@svgr/core': 6.5.1
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ '@vitejs/plugin-react': 4.0.0(vite@4.5.2(@types/node@20.5.1)(less@4.1.3)(lightningcss@1.22.1)(sass@1.89.2)(terser@5.43.1))
+ core-js: 3.34.0
+ less: 4.1.3
+ postcss-preset-env: 7.5.0(postcss@8.5.6)
+ rollup-plugin-visualizer: 5.9.0(rollup@3.29.5)
+ systemjs: 6.15.1
+ vite: 4.5.2(@types/node@20.5.1)(less@4.1.3)(lightningcss@1.22.1)(sass@1.89.2)(terser@5.43.1)
+ transitivePeerDependencies:
+ - '@types/node'
+ - lightningcss
+ - postcss
+ - rollup
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ '@umijs/bundler-webpack@4.4.11(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))':
+ dependencies:
+ '@svgr/core': 6.5.1
+ '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1)
+ '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1)
+ '@types/hapi__joi': 17.1.9
+ '@umijs/babel-preset-umi': 4.4.11
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
+ '@umijs/mfsu': 4.4.11
+ '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/utils': 4.4.11
+ cors: 2.8.5
+ css-loader: 6.7.1(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ es5-imcompatible-versions: 0.1.90
+ fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ jest-worker: 29.4.3
+ lightningcss: 1.22.1
+ node-libs-browser: 2.2.1
+ postcss: 8.5.6
+ postcss-preset-env: 7.5.0(postcss@8.5.6)
+ react-error-overlay: 6.0.9
+ react-refresh: 0.14.0
+ transitivePeerDependencies:
+ - '@types/webpack'
+ - sockjs-client
+ - supports-color
+ - type-fest
+ - typescript
+ - webpack
+ - webpack-dev-server
+ - webpack-hot-middleware
+ - webpack-plugin-serve
+
+ '@umijs/case-sensitive-paths-webpack-plugin@1.0.1': {}
+
+ '@umijs/core@4.4.11':
+ dependencies:
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/did-you-know@1.0.3': {}
+
+ '@umijs/es-module-parser-darwin-arm64@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-darwin-x64@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-linux-arm-gnueabihf@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-linux-arm64-gnu@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-linux-arm64-musl@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-linux-x64-gnu@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-linux-x64-musl@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-win32-arm64-msvc@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser-win32-x64-msvc@0.0.7':
+ optional: true
+
+ '@umijs/es-module-parser@0.0.7':
+ optionalDependencies:
+ '@umijs/es-module-parser-darwin-arm64': 0.0.7
+ '@umijs/es-module-parser-darwin-x64': 0.0.7
+ '@umijs/es-module-parser-linux-arm-gnueabihf': 0.0.7
+ '@umijs/es-module-parser-linux-arm64-gnu': 0.0.7
+ '@umijs/es-module-parser-linux-arm64-musl': 0.0.7
+ '@umijs/es-module-parser-linux-x64-gnu': 0.0.7
+ '@umijs/es-module-parser-linux-x64-musl': 0.0.7
+ '@umijs/es-module-parser-win32-arm64-msvc': 0.0.7
+ '@umijs/es-module-parser-win32-x64-msvc': 0.0.7
+
+ '@umijs/history@5.3.1':
+ dependencies:
+ '@babel/runtime': 7.23.6
+ query-string: 6.14.1
+
+ '@umijs/lint@4.4.11(eslint@8.57.1)(stylelint@14.16.1)(typescript@5.4.2)':
+ dependencies:
+ '@babel/core': 7.23.6
+ '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@8.57.1)
+ '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss@8.5.6))(postcss@8.5.6)
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ '@umijs/babel-preset-umi': 4.4.11
+ eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2)
+ eslint-plugin-react: 7.33.2(eslint@8.57.1)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.57.1)
+ postcss: 8.5.6
+ postcss-syntax: 0.36.2(postcss@8.5.6)
+ stylelint-config-standard: 25.0.0(stylelint@14.16.1)
+ transitivePeerDependencies:
+ - eslint
+ - jest
+ - postcss-html
+ - postcss-jsx
+ - postcss-less
+ - postcss-markdown
+ - postcss-scss
+ - stylelint
+ - supports-color
+ - typescript
+
+ '@umijs/mako-darwin-arm64@0.11.10':
+ optional: true
+
+ '@umijs/mako-darwin-x64@0.11.10':
+ optional: true
+
+ '@umijs/mako-linux-arm64-gnu@0.11.10':
+ optional: true
+
+ '@umijs/mako-linux-arm64-musl@0.11.10':
+ optional: true
+
+ '@umijs/mako-linux-x64-gnu@0.11.10':
+ optional: true
+
+ '@umijs/mako-linux-x64-musl@0.11.10':
+ optional: true
+
+ '@umijs/mako-win32-ia32-msvc@0.11.10':
+ optional: true
+
+ '@umijs/mako-win32-x64-msvc@0.11.10':
+ optional: true
+
+ '@umijs/mako@0.11.10(postcss@8.5.6)(sass@1.89.2)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))':
+ dependencies:
+ '@module-federation/webpack-bundler-runtime': 0.8.12
+ '@swc/helpers': 0.5.1
+ '@types/resolve': 1.20.6
+ chalk: 4.1.2
+ enhanced-resolve: 5.18.2
+ less: 4.3.0
+ less-loader: 12.3.0(less@4.3.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ loader-runner: 4.3.0
+ loader-utils: 3.3.1
+ lodash: 4.17.21
+ node-libs-browser-okam: 2.2.5
+ piscina: 4.9.2
+ postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ react-error-overlay: 6.0.9
+ react-refresh: 0.14.2
+ resolve: 1.22.10
+ sass-loader: 16.0.5(sass@1.89.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ semver: 7.7.2
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@umijs/mako-darwin-arm64': 0.11.10
+ '@umijs/mako-darwin-x64': 0.11.10
+ '@umijs/mako-linux-arm64-gnu': 0.11.10
+ '@umijs/mako-linux-arm64-musl': 0.11.10
+ '@umijs/mako-linux-x64-gnu': 0.11.10
+ '@umijs/mako-linux-x64-musl': 0.11.10
+ '@umijs/mako-win32-ia32-msvc': 0.11.10
+ '@umijs/mako-win32-x64-msvc': 0.11.10
+ transitivePeerDependencies:
+ - '@rspack/core'
+ - node-sass
+ - postcss
+ - sass
+ - sass-embedded
+ - typescript
+ - webpack
+
+ '@umijs/mfsu@4.4.11':
+ dependencies:
+ '@umijs/bundler-esbuild': 4.4.11
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ enhanced-resolve: 5.9.3
+ is-equal: 1.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/plugin-run@4.4.11':
+ dependencies:
+ tsx: 3.12.2
+
+ '@umijs/preset-umi@4.4.11(@types/node@20.5.1)(@types/react@18.3.23)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.89.2)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))':
+ dependencies:
+ '@iconify/utils': 2.1.1
+ '@svgr/core': 6.5.1
+ '@umijs/ast': 4.4.11
+ '@umijs/babel-preset-umi': 4.4.11
+ '@umijs/bundler-esbuild': 4.4.11
+ '@umijs/bundler-mako': 0.11.10(postcss@8.5.6)(sass@1.89.2)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/bundler-vite': 4.4.11(@types/node@20.5.1)(lightningcss@1.22.1)(postcss@8.5.6)(rollup@3.29.5)(sass@1.89.2)(terser@5.43.1)
+ '@umijs/bundler-webpack': 4.4.11(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/core': 4.4.11
+ '@umijs/did-you-know': 1.0.3
+ '@umijs/es-module-parser': 0.0.7
+ '@umijs/history': 5.3.1
+ '@umijs/mfsu': 4.4.11
+ '@umijs/plugin-run': 4.4.11
+ '@umijs/renderer-react': 4.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@umijs/server': 4.4.11
+ '@umijs/ui': 3.0.1
+ '@umijs/utils': 4.4.11
+ '@umijs/zod2ts': 4.4.11
+ babel-plugin-dynamic-import-node: 2.3.3
+ babel-plugin-react-compiler: 0.0.0-experimental-c23de8d-20240515
+ click-to-react-component: 1.1.0(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ core-js: 3.34.0
+ current-script-polyfill: 1.0.0
+ enhanced-resolve: 5.9.3
+ fast-glob: 3.2.12
+ html-webpack-plugin: 5.5.0(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ less-plugin-resolve: 1.0.2
+ path-to-regexp: 1.7.0
+ postcss: 8.5.6
+ postcss-prefix-selector: 1.16.0(postcss@8.5.6)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router: 6.3.0(react@18.3.1)
+ react-router-dom: 6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ regenerator-runtime: 0.13.11
+ transitivePeerDependencies:
+ - '@rspack/core'
+ - '@types/node'
+ - '@types/react'
+ - '@types/webpack'
+ - lightningcss
+ - node-sass
+ - rollup
+ - sass
+ - sass-embedded
+ - sockjs-client
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - type-fest
+ - typescript
+ - webpack
+ - webpack-dev-server
+ - webpack-hot-middleware
+ - webpack-plugin-serve
+
+ '@umijs/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))':
+ dependencies:
+ ansi-html-community: 0.0.8
+ common-path-prefix: 3.0.0
+ core-js-pure: 3.43.0
+ error-stack-parser: 2.1.4
+ find-up: 5.0.0
+ html-entities: 2.6.0
+ loader-utils: 2.0.4
+ react-refresh: 0.14.0
+ schema-utils: 3.3.0
+ source-map: 0.7.4
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+ optionalDependencies:
+ type-fest: 1.4.0
+
+ '@umijs/renderer-react@4.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.23.6
+ '@loadable/component': 5.15.2(react@18.3.1)
+ history: 5.3.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-router-dom: 6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ '@umijs/server@4.4.11':
+ dependencies:
+ '@umijs/bundler-utils': 4.4.11
+ history: 5.3.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router-dom: 6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@umijs/test@4.4.11(@babel/core@7.27.7)':
+ dependencies:
+ '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.27.7)
+ '@jest/types': 27.5.1
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/utils': 4.4.11
+ babel-jest: 29.7.0(@babel/core@7.27.7)
+ esbuild: 0.21.4
+ identity-obj-proxy: 3.0.0
+ isomorphic-unfetch: 4.0.2
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
+ '@umijs/ui@3.0.1': {}
+
+ '@umijs/utils@4.4.11':
+ dependencies:
+ chokidar: 3.5.3
+ pino: 7.11.0
+
+ '@umijs/zod2ts@4.4.11': {}
+
+ '@ungap/structured-clone@1.3.0': {}
+
+ '@vercel/ncc@0.33.3': {}
+
+ '@vitejs/plugin-react@4.0.0(vite@4.5.2(@types/node@20.5.1)(less@4.1.3)(lightningcss@1.22.1)(sass@1.89.2)(terser@5.43.1))':
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.7)
+ react-refresh: 0.14.2
+ vite: 4.5.2(@types/node@20.5.1)(less@4.1.3)(lightningcss@1.22.1)(sass@1.89.2)(terser@5.43.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-jsx@5.3.2(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv-keywords@3.5.2(ajv@6.12.6):
+ dependencies:
+ ajv: 6.12.6
+
+ ajv-keywords@5.1.0(ajv@8.17.1):
+ dependencies:
+ ajv: 8.17.1
+ fast-deep-equal: 3.1.3
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.6
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ animated-scroll-to@2.3.2: {}
+
+ ansi-escapes@5.0.0:
+ dependencies:
+ type-fest: 1.4.0
+
+ ansi-html-community@0.0.8: {}
+
+ ansi-regex@4.1.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ 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.1: {}
+
+ antd-token-previewer@2.0.0-alpha.6(@babel/core@7.27.7)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1):
+ dependencies:
+ '@ant-design/colors': 6.0.0
+ '@ant-design/cssinjs': 1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@ant-design/icons': 4.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@arvinxu/layout-kit': 1.4.0(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ '@babel/runtime': 7.22.3
+ '@ctrl/tinycolor': 3.6.0
+ antd: 5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-dom: 18.3.1(react@18.3.1)
+ reactflow: 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ use-debouncy: 4.6.0(react@18.3.1)
+ vanilla-jsoneditor: 0.16.1
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@types/react'
+ - date-fns
+ - immer
+ - luxon
+ - moment
+ - react-is
+
+ antd@5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@ant-design/colors': 7.2.1
+ '@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@ant-design/fast-color': 2.0.6
+ '@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@ant-design/react-slick': 1.1.2(react@18.3.1)
+ '@babel/runtime': 7.27.6
+ '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ copy-to-clipboard: 3.3.3
+ dayjs: 1.11.13
+ rc-cascader: 3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-checkbox: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-collapse: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-drawer: 7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-field-form: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-image: 7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-input-number: 9.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-mentions: 2.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-notification: 5.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-pagination: 5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-picker: 4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-rate: 2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-segmented: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-slider: 11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-table: 7.51.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tabs: 15.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-textarea: 1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tooltip: 6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tree-select: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-upload: 4.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ scroll-into-view-if-needed: 3.1.0
+ throttle-debounce: 5.0.2
+ transitivePeerDependencies:
+ - date-fns
+ - luxon
+ - moment
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@4.1.3: {}
+
+ arg@5.0.2: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.6:
+ dependencies:
+ tslib: 2.8.1
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-flatten@1.1.1: {}
+
+ array-ify@1.0.0: {}
+
+ array-includes@3.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array-union@2.1.0: {}
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.reduce@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-array-method-boxes-properly: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ is-string: 1.1.1
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ arrify@1.0.1: {}
+
+ asn1.js@4.10.1:
+ dependencies:
+ bn.js: 4.12.2
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
+ assert-okam@1.5.0:
+ dependencies:
+ object-assign: 4.1.1
+ util: 0.10.3
+
+ assert@1.5.1:
+ dependencies:
+ object.assign: 4.1.7
+ util: 0.10.4
+
+ astral-regex@2.0.0: {}
+
+ astring@1.9.0: {}
+
+ async-function@1.0.0: {}
+
+ atob@2.1.2: {}
+
+ atomic-sleep@1.0.0: {}
+
+ autoprefixer@10.4.21(postcss@8.5.6):
+ dependencies:
+ browserslist: 4.25.1
+ caniuse-lite: 1.0.30001726
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ babel-jest@29.7.0(@babel/core@7.27.7):
+ dependencies:
+ '@babel/core': 7.27.7
+ '@jest/transform': 29.7.0
+ '@types/babel__core': 7.20.5
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 29.6.3(@babel/core@7.27.7)
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-dynamic-import-node@2.3.3:
+ dependencies:
+ object.assign: 4.1.7
+
+ babel-plugin-istanbul@6.1.1:
+ dependencies:
+ '@babel/helper-plugin-utils': 7.27.1
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-jest-hoist@29.6.3:
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.27.7
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.20.7
+
+ babel-plugin-macros@3.1.0:
+ dependencies:
+ '@babel/runtime': 7.22.3
+ cosmiconfig: 7.1.0
+ resolve: 1.22.10
+
+ babel-plugin-module-resolver@4.1.0:
+ dependencies:
+ find-babel-config: 1.2.2
+ glob: 7.2.3
+ pkg-up: 3.1.0
+ reselect: 4.1.8
+ resolve: 1.22.10
+
+ babel-plugin-react-compiler@0.0.0-experimental-c23de8d-20240515:
+ dependencies:
+ '@babel/generator': 7.2.0
+ '@babel/types': 7.27.7
+ chalk: 4.1.2
+ invariant: 2.2.4
+ pretty-format: 24.9.0
+ zod: 3.25.67
+ zod-validation-error: 2.1.0(zod@3.25.67)
+
+ babel-plugin-styled-components@2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0):
+ dependencies:
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7)
+ lodash: 4.17.21
+ picomatch: 2.3.1
+ styled-components: 5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
+ babel-plugin-transform-define@2.0.1:
+ dependencies:
+ lodash: 4.17.21
+ traverse: 0.6.6
+
+ babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.7):
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.7)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.7)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.7)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.7)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.7)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.7)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.7)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.7)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.7)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.7)
+
+ babel-preset-jest@29.6.3(@babel/core@7.27.7):
+ dependencies:
+ '@babel/core': 7.27.7
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.7)
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@2.0.0: {}
+
+ base64-js@1.5.1: {}
+
+ big-integer@1.6.52: {}
+
+ big.js@5.2.2: {}
+
+ binary-extensions@2.3.0: {}
+
+ binaryextensions@2.3.0: {}
+
+ bn.js@4.12.2: {}
+
+ bn.js@5.2.2: {}
+
+ body-parser@1.20.3:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ boolbase@1.0.0: {}
+
+ bplist-parser@0.2.0:
+ dependencies:
+ big-integer: 1.6.52
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ brorand@1.1.0: {}
+
+ browserify-aes@1.2.0:
+ dependencies:
+ buffer-xor: 1.0.3
+ cipher-base: 1.0.6
+ create-hash: 1.2.0
+ evp_bytestokey: 1.0.3
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ browserify-cipher@1.0.1:
+ dependencies:
+ browserify-aes: 1.2.0
+ browserify-des: 1.0.2
+ evp_bytestokey: 1.0.3
+
+ browserify-des@1.0.2:
+ dependencies:
+ cipher-base: 1.0.6
+ des.js: 1.1.0
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ browserify-rsa@4.1.1:
+ dependencies:
+ bn.js: 5.2.2
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
+ browserify-sign@4.2.3:
+ dependencies:
+ bn.js: 5.2.2
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ elliptic: 6.6.1
+ hash-base: 3.0.5
+ inherits: 2.0.4
+ parse-asn1: 5.1.7
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+
+ browserify-zlib@0.2.0:
+ dependencies:
+ pako: 1.0.11
+
+ browserslist@4.25.1:
+ dependencies:
+ caniuse-lite: 1.0.30001726
+ electron-to-chromium: 1.5.177
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.3(browserslist@4.25.1)
+
+ bser@2.1.1:
+ dependencies:
+ node-int64: 0.4.0
+
+ buffer-from@0.1.2: {}
+
+ buffer-from@1.1.2: {}
+
+ buffer-okam@4.9.2:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ isarray: 1.0.0
+
+ buffer-xor@1.0.3: {}
+
+ buffer@4.9.2:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ isarray: 1.0.0
+
+ builtin-status-codes@3.0.0: {}
+
+ bundle-name@3.0.0:
+ dependencies:
+ run-applescript: 5.0.0
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.8.1
+
+ camelcase-keys@6.2.2:
+ dependencies:
+ camelcase: 5.3.1
+ map-obj: 4.3.0
+ quick-lru: 4.0.1
+
+ camelcase@5.3.1: {}
+
+ camelcase@6.3.0: {}
+
+ camelize@1.0.1: {}
+
+ caniuse-lite@1.0.30001726: {}
+
+ ccount@2.0.1: {}
+
+ 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
+
+ chalk@5.3.0: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ chokidar@3.5.3:
+ 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
+
+ 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
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chrome-trace-event@1.0.4: {}
+
+ ci-info@3.9.0: {}
+
+ cipher-base@1.0.6:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ classcat@5.0.5: {}
+
+ classnames@2.3.2: {}
+
+ classnames@2.5.1: {}
+
+ clean-css@5.3.3:
+ dependencies:
+ source-map: 0.6.1
+
+ cli-cursor@4.0.0:
+ dependencies:
+ restore-cursor: 4.0.0
+
+ cli-truncate@3.1.0:
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 5.1.2
+
+ click-to-react-component@1.1.0(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@floating-ui/react-dom-interactions': 0.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ htm: 3.1.1
+ react: 18.3.1
+ react-merge-refs: 1.1.0
+ transitivePeerDependencies:
+ - '@types/react'
+ - react-dom
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clsx@2.1.1: {}
+
+ coa@2.0.2:
+ dependencies:
+ '@types/q': 1.5.8
+ chalk: 2.4.2
+ q: 1.5.1
+
+ codesandbox-import-util-types@2.2.3: {}
+
+ codesandbox-import-utils@2.2.3:
+ dependencies:
+ codesandbox-import-util-types: 2.2.3
+ istextorbinary: 2.6.0
+ lz-string: 1.5.0
+
+ 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: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+ color-string: 1.9.1
+
+ colord@2.9.3: {}
+
+ colorette@2.0.20: {}
+
+ comlink@4.4.2: {}
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@11.0.0: {}
+
+ commander@2.20.3: {}
+
+ commander@4.1.1: {}
+
+ commander@7.2.0: {}
+
+ commander@8.3.0: {}
+
+ commander@9.5.0:
+ optional: true
+
+ common-path-prefix@3.0.0: {}
+
+ compare-func@2.0.0:
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+
+ compressible@2.0.18:
+ dependencies:
+ mime-db: 1.54.0
+
+ compression@1.8.0:
+ dependencies:
+ bytes: 3.1.2
+ compressible: 2.0.18
+ debug: 2.6.9
+ negotiator: 0.6.4
+ on-headers: 1.0.2
+ safe-buffer: 5.2.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ compute-scroll-into-view@3.1.1: {}
+
+ concat-map@0.0.1: {}
+
+ connect-history-api-fallback@2.0.0: {}
+
+ console-browserify@1.2.0: {}
+
+ constants-browserify@1.0.0: {}
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ conventional-changelog-angular@6.0.0:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-changelog-conventionalcommits@6.1.0:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-commits-parser@4.0.0:
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 1.0.1
+ meow: 8.1.2
+ split2: 3.2.2
+
+ convert-source-map@1.9.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie-signature@1.0.6: {}
+
+ cookie@0.7.1: {}
+
+ copy-anything@2.0.6:
+ dependencies:
+ is-what: 3.14.1
+
+ copy-to-clipboard@3.3.3:
+ dependencies:
+ toggle-selection: 1.0.6
+
+ core-js-pure@3.43.0: {}
+
+ core-js@3.34.0: {}
+
+ core-util-is@1.0.3: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.8.3))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@20.5.1)(typescript@5.8.3))(typescript@5.8.3):
+ dependencies:
+ '@types/node': 20.5.1
+ cosmiconfig: 8.3.6(typescript@5.4.2)
+ ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@20.5.1)(typescript@5.4.2)
+ typescript: 5.8.3
+
+ cosmiconfig@7.1.0:
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+
+ cosmiconfig@8.3.6(typescript@5.4.2):
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.4.2
+
+ cosmiconfig@9.0.0(typescript@5.4.2):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.4.2
+
+ create-ecdh@4.0.4:
+ dependencies:
+ bn.js: 4.12.2
+ elliptic: 6.6.1
+
+ create-hash@1.1.3:
+ dependencies:
+ cipher-base: 1.0.6
+ inherits: 2.0.4
+ ripemd160: 2.0.1
+ sha.js: 2.4.11
+
+ create-hash@1.2.0:
+ dependencies:
+ cipher-base: 1.0.6
+ inherits: 2.0.4
+ md5.js: 1.3.5
+ ripemd160: 2.0.2
+ sha.js: 2.4.11
+
+ create-hmac@1.1.7:
+ dependencies:
+ cipher-base: 1.0.6
+ create-hash: 1.2.0
+ inherits: 2.0.4
+ ripemd160: 2.0.2
+ safe-buffer: 5.2.1
+ sha.js: 2.4.11
+
+ create-require@1.1.1: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crypto-browserify@3.12.1:
+ dependencies:
+ browserify-cipher: 1.0.1
+ browserify-sign: 4.2.3
+ create-ecdh: 4.0.4
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ diffie-hellman: 5.0.3
+ hash-base: 3.0.5
+ inherits: 2.0.4
+ pbkdf2: 3.1.3
+ public-encrypt: 4.0.3
+ randombytes: 2.1.0
+ randomfill: 1.0.4
+
+ css-blank-pseudo@3.0.3(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ css-color-keywords@1.0.0: {}
+
+ css-functions-list@3.2.3: {}
+
+ css-has-pseudo@3.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ css-loader@6.7.1(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-modules-extract-imports: 3.1.0(postcss@8.5.6)
+ postcss-modules-local-by-default: 4.2.0(postcss@8.5.6)
+ postcss-modules-scope: 3.2.1(postcss@8.5.6)
+ postcss-modules-values: 4.0.0(postcss@8.5.6)
+ postcss-value-parser: 4.2.0
+ semver: 7.7.2
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ css-prefers-color-scheme@6.0.3(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ css-select-base-adapter@0.1.1: {}
+
+ css-select@2.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 3.4.2
+ domutils: 1.7.0
+ nth-check: 1.0.2
+
+ css-select@4.3.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
+
+ css-to-react-native@3.2.0:
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+
+ css-tree@1.0.0-alpha.37:
+ dependencies:
+ mdn-data: 2.0.4
+ source-map: 0.6.1
+
+ css-tree@1.1.3:
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+
+ css-what@3.4.2: {}
+
+ css-what@6.2.2: {}
+
+ css@3.0.0:
+ dependencies:
+ inherits: 2.0.4
+ source-map: 0.6.1
+ source-map-resolve: 0.6.0
+
+ cssdb@6.6.3: {}
+
+ cssesc@3.0.0: {}
+
+ csso@4.2.0:
+ dependencies:
+ css-tree: 1.1.3
+
+ csstype@3.1.3: {}
+
+ current-script-polyfill@1.0.0: {}
+
+ d3-color@3.1.0: {}
+
+ d3-dispatch@3.0.1: {}
+
+ d3-drag@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+
+ d3-ease@3.0.1: {}
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-selection@3.0.0: {}
+
+ d3-timer@3.0.1: {}
+
+ d3-transition@3.0.1(d3-selection@3.0.0):
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+
+ d3-zoom@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ dargs@7.0.0: {}
+
+ data-uri-to-buffer@4.0.1: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ dayjs@1.11.13: {}
+
+ dayjs@1.11.7: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.3.4:
+ dependencies:
+ ms: 2.1.2
+
+ debug@4.4.1(supports-color@5.5.0):
+ dependencies:
+ ms: 2.1.3
+ optionalDependencies:
+ supports-color: 5.5.0
+
+ decamelize-keys@1.1.1:
+ dependencies:
+ decamelize: 1.2.0
+ map-obj: 1.0.1
+
+ decamelize@1.2.0: {}
+
+ decimal.js@10.5.0: {}
+
+ decode-named-character-reference@1.2.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ decode-uri-component@0.2.2: {}
+
+ deep-is@0.1.4: {}
+
+ deep-rename-keys@0.2.1:
+ dependencies:
+ kind-of: 3.2.2
+ rename-keys: 1.2.0
+
+ deepmerge@1.5.2: {}
+
+ deepmerge@4.3.1: {}
+
+ default-browser-id@3.0.0:
+ dependencies:
+ bplist-parser: 0.2.0
+ untildify: 4.0.0
+
+ default-browser@4.0.0:
+ dependencies:
+ bundle-name: 3.0.0
+ default-browser-id: 3.0.0
+ execa: 7.2.0
+ titleize: 3.0.0
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-lazy-prop@2.0.0: {}
+
+ define-lazy-prop@3.0.0: {}
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ depd@2.0.0: {}
+
+ dequal@2.0.3: {}
+
+ des.js@1.1.0:
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
+ destroy@1.2.0: {}
+
+ detect-indent@7.0.1: {}
+
+ detect-libc@1.0.3: {}
+
+ detect-newline@4.0.1: {}
+
+ detect-node@2.1.0: {}
+
+ diff@4.0.2: {}
+
+ diff@5.2.0: {}
+
+ diffie-hellman@5.0.3:
+ dependencies:
+ bn.js: 4.12.2
+ miller-rabin: 4.0.1
+ randombytes: 2.1.0
+
+ dir-glob@3.0.1:
+ dependencies:
+ path-type: 4.0.0
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dom-converter@0.2.0:
+ dependencies:
+ utila: 0.4.0
+
+ dom-serializer@0.2.2:
+ dependencies:
+ domelementtype: 2.3.0
+ entities: 2.2.0
+
+ dom-serializer@1.4.1:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domain-browser@1.2.0: {}
+
+ domelementtype@1.3.1: {}
+
+ domelementtype@2.3.0: {}
+
+ domhandler@4.3.1:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@1.7.0:
+ dependencies:
+ dom-serializer: 0.2.2
+ domelementtype: 1.3.1
+
+ domutils@2.8.0:
+ dependencies:
+ dom-serializer: 1.4.1
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
+ dumi-afx-deps@1.0.0-alpha.20: {}
+
+ dumi-assets-types@2.4.14: {}
+
+ dumi-theme-antd@0.4.4(@babel/core@7.27.7)(@types/react@18.3.23)(antd@5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(dumi@2.4.21(@babel/core@7.27.7)(@swc/helpers@0.5.1)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1):
+ dependencies:
+ '@ant-design/cssinjs': 1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@ant-design/icons': 5.3.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@babel/runtime': 7.22.3
+ '@ctrl/tinycolor': 3.6.0
+ '@emotion/css': 11.11.2
+ '@emotion/react': 11.11.0(@types/react@18.3.23)(react@18.3.1)
+ '@emotion/server': 11.11.0(@emotion/css@11.11.2)
+ antd: 5.26.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ antd-token-previewer: 2.0.0-alpha.6(@babel/core@7.27.7)(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ classnames: 2.3.2
+ dayjs: 1.11.7
+ dumi: 2.4.21(@babel/core@7.27.7)(@swc/helpers@0.5.1)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ lodash.clonedeep: 4.5.0
+ prism-react-renderer: 2.3.1(react@18.3.1)
+ rc-drawer: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-footer: 0.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-intersection-observer: 9.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@types/react'
+ - date-fns
+ - immer
+ - luxon
+ - moment
+ - react-is
+ - supports-color
+
+ dumi@2.4.21(@babel/core@7.27.7)(@swc/helpers@0.5.1)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@ant-design/icons-svg': 4.4.2
+ '@makotot/ghostui': 2.0.0(react@18.3.1)
+ '@stackblitz/sdk': 1.11.0
+ '@swc/core': 1.9.2(@swc/helpers@0.5.1)
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/core': 4.4.11
+ '@umijs/utils': 4.4.11
+ animated-scroll-to: 2.3.2
+ classnames: 2.3.2
+ codesandbox-import-utils: 2.2.3
+ comlink: 4.4.2
+ copy-to-clipboard: 3.3.3
+ deepmerge: 4.3.1
+ dumi-afx-deps: 1.0.0-alpha.20
+ dumi-assets-types: 2.4.14
+ enhanced-resolve: 5.18.2
+ estree-util-to-js: 1.2.0
+ estree-util-visit: 1.2.1
+ file-system-cache: 2.4.4
+ github-slugger: 1.5.0
+ hast-util-is-element: 2.1.3
+ hast-util-raw: 8.0.0
+ hast-util-to-estree: 2.3.3
+ hast-util-to-string: 2.0.0
+ heti: 0.9.5
+ hosted-git-info: 6.1.3
+ html-to-text: 9.0.5
+ html2sketch: 1.0.2
+ js-yaml: 4.1.0
+ lodash.throttle: 4.1.1
+ mdast-util-find-and-replace: 2.2.2
+ mdast-util-to-string: 3.2.0
+ nprogress: 0.2.0
+ pluralize: 8.0.0
+ prism-react-renderer: 1.3.5(react@18.3.1)
+ prism-themes: 1.9.0
+ prismjs: 1.30.0
+ raw-loader: 4.0.2(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tabs: 12.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tooltip: 6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-copy-to-clipboard: 5.1.0(react@18.3.1)
+ react-dom: 18.3.1(react@18.3.1)
+ react-error-boundary: 4.1.2(react@18.3.1)
+ react-intl: 7.1.11(react@18.3.1)(typescript@5.4.2)
+ react-loading-skeleton: 3.5.0(react@18.3.1)
+ react-simple-code-editor: 0.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rehype-autolink-headings: 6.1.1
+ rehype-remove-comments: 5.0.0
+ rehype-stringify: 9.0.4
+ remark-directive: 2.0.1
+ remark-frontmatter: 4.0.1
+ remark-gfm: 3.0.1
+ remark-parse: 10.0.2
+ remark-rehype: 10.1.0
+ sass: 1.89.2
+ sitemap: 7.1.2
+ sucrase: 3.35.0
+ umi: 4.4.11(@babel/core@7.27.7)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(sass@1.89.2)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ unified: 10.1.2
+ unist-util-visit: 4.1.2
+ unist-util-visit-parents: 5.1.3
+ url: 0.11.4
+ v8-compile-cache: 2.3.0
+ vfile: 5.3.7
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@rspack/core'
+ - '@swc/helpers'
+ - '@types/node'
+ - '@types/react'
+ - '@types/webpack'
+ - '@volar/vue-language-plugin-pug'
+ - '@volar/vue-typescript'
+ - eslint
+ - jest
+ - lightningcss
+ - node-sass
+ - postcss-html
+ - postcss-jsx
+ - postcss-less
+ - postcss-markdown
+ - postcss-scss
+ - prettier
+ - rollup
+ - sass-embedded
+ - sockjs-client
+ - stylelint
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - type-fest
+ - typescript
+ - webpack
+ - webpack-dev-server
+ - webpack-hot-middleware
+ - webpack-plugin-serve
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexer2@0.1.4:
+ dependencies:
+ readable-stream: 2.3.8
+
+ duplexify@4.1.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ stream-shift: 1.0.3
+
+ eastasianwidth@0.2.0: {}
+
+ editions@2.3.1:
+ dependencies:
+ errlop: 2.2.0
+ semver: 6.3.1
+
+ ee-first@1.1.1: {}
+
+ electron-to-chromium@1.5.177: {}
+
+ elliptic@6.6.1:
+ dependencies:
+ bn.js: 4.12.2
+ brorand: 1.1.0
+ hash.js: 1.1.7
+ hmac-drbg: 1.0.1
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ emojis-list@3.0.0: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
+ enhanced-resolve@5.18.2:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.2
+
+ enhanced-resolve@5.9.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.2
+
+ entities@2.2.0: {}
+
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
+ env-paths@2.2.1: {}
+
+ errlop@2.2.0: {}
+
+ errno@0.1.8:
+ dependencies:
+ prr: 1.0.1
+ optional: true
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ error-stack-parser@2.1.4:
+ dependencies:
+ stackframe: 1.3.4
+
+ es-abstract@1.24.0:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.19
+
+ es-array-method-boxes-properly@1.0.0: {}
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-get-iterator@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ is-arguments: 1.2.0
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-string: 1.1.1
+ isarray: 2.0.5
+ stop-iteration-iterator: 1.1.0
+
+ es-iterator-helpers@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ safe-array-concat: 1.1.3
+
+ es-module-lexer@1.7.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.1.0:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ es5-imcompatible-versions@0.1.90: {}
+
+ es6-promise@4.2.8: {}
+
+ esbuild@0.17.19:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.17.19
+ '@esbuild/android-arm64': 0.17.19
+ '@esbuild/android-x64': 0.17.19
+ '@esbuild/darwin-arm64': 0.17.19
+ '@esbuild/darwin-x64': 0.17.19
+ '@esbuild/freebsd-arm64': 0.17.19
+ '@esbuild/freebsd-x64': 0.17.19
+ '@esbuild/linux-arm': 0.17.19
+ '@esbuild/linux-arm64': 0.17.19
+ '@esbuild/linux-ia32': 0.17.19
+ '@esbuild/linux-loong64': 0.17.19
+ '@esbuild/linux-mips64el': 0.17.19
+ '@esbuild/linux-ppc64': 0.17.19
+ '@esbuild/linux-riscv64': 0.17.19
+ '@esbuild/linux-s390x': 0.17.19
+ '@esbuild/linux-x64': 0.17.19
+ '@esbuild/netbsd-x64': 0.17.19
+ '@esbuild/openbsd-x64': 0.17.19
+ '@esbuild/sunos-x64': 0.17.19
+ '@esbuild/win32-arm64': 0.17.19
+ '@esbuild/win32-ia32': 0.17.19
+ '@esbuild/win32-x64': 0.17.19
+
+ esbuild@0.18.20:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+
+ esbuild@0.21.4:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.4
+ '@esbuild/android-arm': 0.21.4
+ '@esbuild/android-arm64': 0.21.4
+ '@esbuild/android-x64': 0.21.4
+ '@esbuild/darwin-arm64': 0.21.4
+ '@esbuild/darwin-x64': 0.21.4
+ '@esbuild/freebsd-arm64': 0.21.4
+ '@esbuild/freebsd-x64': 0.21.4
+ '@esbuild/linux-arm': 0.21.4
+ '@esbuild/linux-arm64': 0.21.4
+ '@esbuild/linux-ia32': 0.21.4
+ '@esbuild/linux-loong64': 0.21.4
+ '@esbuild/linux-mips64el': 0.21.4
+ '@esbuild/linux-ppc64': 0.21.4
+ '@esbuild/linux-riscv64': 0.21.4
+ '@esbuild/linux-s390x': 0.21.4
+ '@esbuild/linux-x64': 0.21.4
+ '@esbuild/netbsd-x64': 0.21.4
+ '@esbuild/openbsd-x64': 0.21.4
+ '@esbuild/sunos-x64': 0.21.4
+ '@esbuild/win32-arm64': 0.21.4
+ '@esbuild/win32-ia32': 0.21.4
+ '@esbuild/win32-x64': 0.21.4
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2):
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.4.2)
+ eslint: 8.57.1
+ optionalDependencies:
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.2))(eslint@8.57.1)(typescript@5.4.2)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-react-hooks@4.6.0(eslint@8.57.1):
+ dependencies:
+ eslint: 8.57.1
+
+ eslint-plugin-react@7.33.2(eslint@8.57.1):
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.2.1
+ eslint: 8.57.1
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.hasown: 1.1.4
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ eslint-scope@7.2.2:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@2.1.0: {}
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint@8.57.1:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.1
+ '@humanwhocodes/config-array': 0.13.0
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.3.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.1(supports-color@5.5.0)
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 3.4.3
+
+ esprima@4.0.1: {}
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ estree-util-attach-comments@2.1.1:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ estree-util-is-identifier-name@2.1.0: {}
+
+ estree-util-to-js@1.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.4
+
+ estree-util-visit@1.2.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 2.0.11
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ eventemitter3@2.0.3: {}
+
+ eventemitter3@5.0.1: {}
+
+ events-okam@3.3.0: {}
+
+ events@3.3.0: {}
+
+ evp_bytestokey@1.0.3:
+ dependencies:
+ md5.js: 1.3.5
+ safe-buffer: 5.2.1
+
+ execa@5.1.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ execa@7.2.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+
+ express-http-proxy@2.1.1:
+ dependencies:
+ debug: 3.2.7
+ es6-promise: 4.2.8
+ raw-body: 2.5.2
+ transitivePeerDependencies:
+ - supports-color
+
+ express@4.21.2:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend@3.0.2: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.2.12:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-redact@3.5.0: {}
+
+ fast-uri@3.0.6: {}
+
+ fastest-levenshtein@1.0.16: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ father@4.5.6(@babel/core@7.27.7)(@types/node@20.5.1)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(type-fest@1.4.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@microsoft/api-extractor': 7.43.7(@types/node@20.5.1)
+ '@umijs/babel-preset-umi': 4.4.11
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/bundler-webpack': 4.4.11(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
+ '@umijs/core': 4.4.11
+ '@umijs/utils': 4.4.11
+ '@vercel/ncc': 0.33.3
+ babel-plugin-dynamic-import-node: 2.3.3
+ babel-plugin-module-resolver: 4.1.0
+ babel-plugin-styled-components: 2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0)
+ babel-plugin-transform-define: 2.0.1
+ enhanced-resolve: 5.9.3
+ esbuild: 0.17.19
+ fast-glob: 3.2.12
+ file-system-cache: 2.0.0
+ loader-runner: 4.2.0
+ minimatch: 3.1.2
+ piscina: 4.9.2
+ tsconfig-paths: 4.0.0
+ typescript: 5.4.2
+ typescript-transform-paths: 3.4.7(typescript@5.4.2)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@types/node'
+ - '@types/webpack'
+ - sockjs-client
+ - styled-components
+ - supports-color
+ - type-fest
+ - webpack
+ - webpack-dev-server
+ - webpack-hot-middleware
+ - webpack-plugin-serve
+
+ fault@2.0.1:
+ dependencies:
+ format: 0.2.2
+
+ fb-watchman@2.0.2:
+ dependencies:
+ bser: 2.1.1
+
+ fdir@6.4.6(picomatch@4.0.2):
+ optionalDependencies:
+ picomatch: 4.0.2
+
+ fetch-blob@3.2.0:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
+ file-entry-cache@6.0.1:
+ dependencies:
+ flat-cache: 3.2.0
+
+ file-system-cache@2.0.0:
+ dependencies:
+ fs-extra: 10.1.0
+ ramda: 0.28.0
+
+ file-system-cache@2.4.4:
+ dependencies:
+ '@types/fs-extra': 11.0.1
+ '@types/ramda': 0.29.3
+ fs-extra: 11.1.1
+ ramda: 0.29.0
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ filter-obj@1.1.0: {}
+
+ finalhandler@1.3.1:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ find-babel-config@1.2.2:
+ dependencies:
+ json5: 1.0.2
+ path-exists: 3.0.0
+
+ find-root@1.1.0: {}
+
+ find-up@3.0.0:
+ dependencies:
+ locate-path: 3.0.0
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@3.2.0:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+ rimraf: 3.0.2
+
+ flatted@3.3.3: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ fork-ts-checker-webpack-plugin@8.0.0(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cosmiconfig: 7.1.0
+ deepmerge: 4.3.1
+ fs-extra: 10.1.0
+ memfs: 3.5.3
+ minimatch: 3.1.2
+ node-abort-controller: 3.1.1
+ schema-utils: 3.3.0
+ semver: 7.7.2
+ tapable: 2.2.2
+ typescript: 5.4.2
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ format@0.2.2: {}
+
+ formdata-polyfill@4.0.10:
+ dependencies:
+ fetch-blob: 3.2.0
+
+ forwarded@0.2.0: {}
+
+ fraction.js@4.3.7: {}
+
+ fresh@0.5.2: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-extra@11.1.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-extra@11.3.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-extra@7.0.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+
+ fs-monkey@1.0.6: {}
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-package-type@0.1.0: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-stream@6.0.1: {}
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-tsconfig@4.10.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ get-tsconfig@4.7.5:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ get-value@2.0.6: {}
+
+ git-hooks-list@3.2.0: {}
+
+ git-hooks-list@4.1.1: {}
+
+ git-raw-commits@2.0.11:
+ dependencies:
+ dargs: 7.0.0
+ lodash: 4.17.21
+ meow: 8.1.2
+ split2: 3.2.2
+ through2: 4.0.2
+
+ github-slugger@1.5.0: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-to-regexp@0.4.1: {}
+
+ glob@10.4.5:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ global-dirs@0.1.1:
+ dependencies:
+ ini: 1.3.8
+
+ global-modules@2.0.0:
+ dependencies:
+ global-prefix: 3.0.0
+
+ global-prefix@3.0.0:
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.1
+
+ globals@11.12.0: {}
+
+ globals@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ globby@11.1.0:
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+
+ globby@13.2.2:
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 4.0.0
+
+ globjoin@0.1.4: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ handle-thing@2.0.1: {}
+
+ hard-rejection@2.1.0: {}
+
+ harmony-reflect@1.6.2: {}
+
+ has-bigints@1.1.0: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ has-value@0.3.1:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+
+ has-values@0.1.4: {}
+
+ hash-base@2.0.2:
+ dependencies:
+ inherits: 2.0.4
+
+ hash-base@3.0.5:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ hash.js@1.1.7:
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hast-util-from-parse5@7.1.2:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ hastscript: 7.2.0
+ property-information: 6.5.0
+ vfile: 5.3.7
+ vfile-location: 4.1.0
+ web-namespaces: 2.0.1
+
+ hast-util-has-property@2.0.1: {}
+
+ hast-util-heading-rank@2.1.1:
+ dependencies:
+ '@types/hast': 2.3.10
+
+ hast-util-is-conditional-comment@2.0.0:
+ dependencies:
+ '@types/hast': 2.3.10
+
+ hast-util-is-element@2.1.3:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+
+ hast-util-parse-selector@3.1.1:
+ dependencies:
+ '@types/hast': 2.3.10
+
+ hast-util-raw@7.2.3:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/parse5': 6.0.3
+ hast-util-from-parse5: 7.1.2
+ hast-util-to-parse5: 7.1.0
+ html-void-elements: 2.0.1
+ parse5: 6.0.1
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+ vfile: 5.3.7
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-raw@8.0.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ extend: 3.0.2
+ hast-util-from-parse5: 7.1.2
+ hast-util-to-parse5: 7.1.0
+ html-void-elements: 2.0.1
+ mdast-util-to-hast: 12.3.0
+ parse5: 7.3.0
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+ vfile: 5.3.7
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-estree@2.3.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ comma-separated-tokens: 2.0.3
+ estree-util-attach-comments: 2.1.1
+ estree-util-is-identifier-name: 2.1.0
+ hast-util-whitespace: 2.0.1
+ mdast-util-mdx-expression: 1.3.2
+ mdast-util-mdxjs-esm: 1.3.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.4
+ unist-util-position: 4.0.4
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-html@8.0.4:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-raw: 7.2.3
+ hast-util-whitespace: 2.0.1
+ html-void-elements: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-parse5@7.1.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 2.0.3
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-string@2.0.0:
+ dependencies:
+ '@types/hast': 2.3.10
+
+ hast-util-whitespace@2.0.1: {}
+
+ hastscript@7.2.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 3.1.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ he@1.2.0: {}
+
+ heti-findandreplacedomtext@0.5.0: {}
+
+ heti@0.9.5:
+ dependencies:
+ heti-findandreplacedomtext: 0.5.0
+
+ history@5.3.0:
+ dependencies:
+ '@babel/runtime': 7.23.6
+
+ hmac-drbg@1.0.1:
+ dependencies:
+ hash.js: 1.1.7
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+
+ hoist-non-react-statics@3.3.2:
+ dependencies:
+ react-is: 16.13.1
+
+ hosted-git-info@2.8.9: {}
+
+ hosted-git-info@4.1.0:
+ dependencies:
+ lru-cache: 6.0.0
+
+ hosted-git-info@6.1.3:
+ dependencies:
+ lru-cache: 7.18.3
+
+ hpack.js@2.1.6:
+ dependencies:
+ inherits: 2.0.4
+ obuf: 1.1.2
+ readable-stream: 2.3.8
+ wbuf: 1.7.3
+
+ htm@3.1.1: {}
+
+ html-entities@2.6.0: {}
+
+ html-minifier-terser@6.1.0:
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.3.3
+ commander: 8.3.0
+ he: 1.2.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.43.1
+
+ html-tags@3.3.1: {}
+
+ html-to-text@9.0.5:
+ dependencies:
+ '@selderee/plugin-htmlparser2': 0.11.0
+ deepmerge: 4.3.1
+ dom-serializer: 2.0.0
+ htmlparser2: 8.0.2
+ selderee: 0.11.0
+
+ html-tokenize@2.0.1:
+ dependencies:
+ buffer-from: 0.1.2
+ inherits: 2.0.4
+ minimist: 1.2.8
+ readable-stream: 1.0.34
+ through2: 0.4.2
+
+ html-void-elements@2.0.1: {}
+
+ html-webpack-plugin@5.5.0(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@types/html-minifier-terser': 6.1.0
+ html-minifier-terser: 6.1.0
+ lodash: 4.17.21
+ pretty-error: 4.0.0
+ tapable: 2.2.2
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ html2sketch@1.0.2:
+ dependencies:
+ '@sketch-hq/sketch-file-format-ts': 6.5.0
+ color: 3.2.1
+ css: 3.0.0
+ svg-pathdata: 5.0.5
+ svgo-browser: 1.3.8
+ svgson: 4.1.0
+ transformation-matrix: 2.16.1
+ uuid: 8.3.2
+
+ htmlparser2@6.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ entities: 2.2.0
+
+ htmlparser2@8.0.2:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ entities: 4.5.0
+
+ http-deceiver@1.2.7: {}
+
+ http-errors@2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+
+ https-browserify@1.0.0: {}
+
+ human-signals@2.1.0: {}
+
+ human-signals@4.3.1: {}
+
+ husky@8.0.3: {}
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+ optional: true
+
+ icss-utils@5.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ identity-obj-proxy@3.0.0:
+ dependencies:
+ harmony-reflect: 1.6.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ image-size@0.5.5:
+ optional: true
+
+ immutable@5.1.3: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-lazy@4.0.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.1: {}
+
+ inherits@2.0.3: {}
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ inline-style-parser@0.1.1: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ intl-messageformat@10.7.16:
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.4
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/icu-messageformat-parser': 2.11.2
+ tslib: 2.8.1
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ ipaddr.js@1.9.1: {}
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-arguments@1.2.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-arrayish@0.2.1: {}
+
+ is-arrayish@0.3.2: {}
+
+ is-arrow-function@2.0.3:
+ dependencies:
+ is-callable: 1.2.7
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-buffer@1.1.6: {}
+
+ is-buffer@2.0.5: {}
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-decimal@2.0.1: {}
+
+ is-docker@2.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-equal@1.7.0:
+ dependencies:
+ es-get-iterator: 1.1.3
+ es-to-primitive: 1.3.0
+ functions-have-names: 1.2.3
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ is-arrow-function: 2.0.3
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-generator-function: 1.1.0
+ is-number-object: 1.1.1
+ is-regex: 1.2.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+ isarray: 2.0.5
+ object-inspect: 1.13.4
+ object.entries: 1.1.9
+ object.getprototypeof: 1.0.7
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-generator-function@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@2.0.1: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-path-inside@3.0.3: {}
+
+ is-plain-obj@1.1.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-plain-object@5.0.0: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-stream@2.0.1: {}
+
+ is-stream@3.0.0: {}
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-text-path@1.0.1:
+ dependencies:
+ text-extensions: 1.9.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.19
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-what@3.14.1: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ isarray@0.0.1: {}
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ isobject@2.1.0:
+ dependencies:
+ isarray: 1.0.0
+
+ isobject@3.0.1: {}
+
+ isomorphic-rslog@0.0.7: {}
+
+ isomorphic-unfetch@4.0.2:
+ dependencies:
+ node-fetch: 3.3.2
+ unfetch: 5.0.0
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-instrument@5.2.1:
+ dependencies:
+ '@babel/core': 7.27.7
+ '@babel/parser': 7.27.7
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ istextorbinary@2.6.0:
+ dependencies:
+ binaryextensions: 2.3.0
+ editions: 2.3.1
+ textextensions: 2.6.0
+
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ javascript-stringify@2.1.0: {}
+
+ jest-haste-map@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 24.0.7
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ jest-regex-util@29.6.3: {}
+
+ jest-util@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 24.0.7
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 24.0.7
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jest-worker@29.4.3:
+ dependencies:
+ '@types/node': 24.0.7
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jest-worker@29.7.0:
+ dependencies:
+ '@types/node': 24.0.7
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jiti@1.21.7: {}
+
+ jju@1.4.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@2.5.2: {}
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json2mq@0.2.0:
+ dependencies:
+ string-convert: 0.2.1
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonparse@1.3.1: {}
+
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kind-of@3.2.2:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@6.0.3: {}
+
+ kleur@4.1.5: {}
+
+ known-css-properties@0.26.0: {}
+
+ kolorist@1.8.0: {}
+
+ leac@0.6.0: {}
+
+ less-loader@12.3.0(less@4.3.0)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ less: 4.3.0
+ optionalDependencies:
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ less-plugin-resolve@1.0.2:
+ dependencies:
+ enhanced-resolve: 5.18.2
+
+ less@4.1.3:
+ dependencies:
+ copy-anything: 2.0.6
+ parse-node-version: 1.0.1
+ tslib: 2.8.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.3.1
+ source-map: 0.6.1
+
+ less@4.3.0:
+ dependencies:
+ copy-anything: 2.0.6
+ parse-node-version: 1.0.1
+ tslib: 2.8.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.3.1
+ source-map: 0.6.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lightningcss-darwin-arm64@1.22.1:
+ optional: true
+
+ lightningcss-darwin-x64@1.22.1:
+ optional: true
+
+ lightningcss-freebsd-x64@1.22.1:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.22.1:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.22.1:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.22.1:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.22.1:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.22.1:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.22.1:
+ optional: true
+
+ lightningcss@1.22.1:
+ dependencies:
+ detect-libc: 1.0.3
+ optionalDependencies:
+ lightningcss-darwin-arm64: 1.22.1
+ lightningcss-darwin-x64: 1.22.1
+ lightningcss-freebsd-x64: 1.22.1
+ lightningcss-linux-arm-gnueabihf: 1.22.1
+ lightningcss-linux-arm64-gnu: 1.22.1
+ lightningcss-linux-arm64-musl: 1.22.1
+ lightningcss-linux-x64-gnu: 1.22.1
+ lightningcss-linux-x64-musl: 1.22.1
+ lightningcss-win32-x64-msvc: 1.22.1
+
+ lilconfig@2.1.0: {}
+
+ lines-and-columns@1.2.4: {}
+
+ lint-staged@13.3.0:
+ dependencies:
+ chalk: 5.3.0
+ commander: 11.0.0
+ debug: 4.3.4
+ execa: 7.2.0
+ lilconfig: 2.1.0
+ listr2: 6.6.1
+ micromatch: 4.0.5
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.3.1
+ transitivePeerDependencies:
+ - enquirer
+ - supports-color
+
+ listr2@6.6.1:
+ dependencies:
+ cli-truncate: 3.1.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 5.0.1
+ rfdc: 1.4.1
+ wrap-ansi: 8.1.0
+
+ loader-runner@4.2.0: {}
+
+ loader-runner@4.3.0: {}
+
+ loader-utils@2.0.4:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 2.2.3
+
+ loader-utils@3.3.1: {}
+
+ local-pkg@0.4.3: {}
+
+ locate-path@3.0.0:
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.clonedeep@4.5.0: {}
+
+ lodash.get@4.4.2: {}
+
+ lodash.isequal@4.5.0: {}
+
+ lodash.isfunction@3.0.9: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.kebabcase@4.1.1: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.mergewith@4.6.2: {}
+
+ lodash.snakecase@4.1.1: {}
+
+ lodash.startcase@4.4.0: {}
+
+ lodash.throttle@4.1.1: {}
+
+ lodash.truncate@4.4.2: {}
+
+ lodash.uniq@4.5.0: {}
+
+ lodash.upperfirst@4.3.1: {}
+
+ lodash@4.17.21: {}
+
+ log-update@5.0.1:
+ dependencies:
+ ansi-escapes: 5.0.0
+ cli-cursor: 4.0.0
+ slice-ansi: 5.0.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 8.1.0
+
+ longest-streak@3.1.0: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ lru-cache@7.18.3: {}
+
+ lz-string@1.5.0: {}
+
+ make-dir@2.1.0:
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ optional: true
+
+ make-error@1.3.6: {}
+
+ makeerror@1.0.12:
+ dependencies:
+ tmpl: 1.0.5
+
+ map-obj@1.0.1: {}
+
+ map-obj@4.3.0: {}
+
+ markdown-table@3.0.4: {}
+
+ math-intrinsics@1.1.0: {}
+
+ mathml-tag-names@2.1.3: {}
+
+ md5.js@1.3.5:
+ dependencies:
+ hash-base: 3.0.5
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ mdast-util-definitions@5.1.2:
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ unist-util-visit: 4.1.2
+
+ mdast-util-directive@2.2.4:
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-to-markdown: 1.5.0
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 5.1.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@2.2.2:
+ dependencies:
+ '@types/mdast': 3.0.15
+ escape-string-regexp: 5.0.0
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+
+ mdast-util-from-markdown@1.3.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ decode-named-character-reference: 1.2.0
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ unist-util-stringify-position: 3.0.3
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-frontmatter@1.0.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+ micromark-extension-frontmatter: 1.1.1
+
+ mdast-util-gfm-autolink-literal@1.0.3:
+ dependencies:
+ '@types/mdast': 3.0.15
+ ccount: 2.0.1
+ mdast-util-find-and-replace: 2.2.2
+ micromark-util-character: 1.2.0
+
+ mdast-util-gfm-footnote@1.0.2:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+ micromark-util-normalize-identifier: 1.1.0
+
+ mdast-util-gfm-strikethrough@1.0.3:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+
+ mdast-util-gfm-table@1.0.7:
+ dependencies:
+ '@types/mdast': 3.0.15
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@1.0.2:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+
+ mdast-util-gfm@2.0.2:
+ dependencies:
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-gfm-autolink-literal: 1.0.3
+ mdast-util-gfm-footnote: 1.0.2
+ mdast-util-gfm-strikethrough: 1.0.3
+ mdast-util-gfm-table: 1.0.7
+ mdast-util-gfm-task-list-item: 1.0.2
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@1.3.2:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@1.3.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ unist-util-is: 5.2.1
+
+ mdast-util-to-hast@12.3.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-definitions: 5.1.2
+ micromark-util-sanitize-uri: 1.2.0
+ trim-lines: 3.0.1
+ unist-util-generated: 2.0.1
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+
+ mdast-util-to-markdown@1.5.0:
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 3.0.1
+ mdast-util-to-string: 3.2.0
+ micromark-util-decode-string: 1.1.0
+ unist-util-visit: 4.1.2
+ zwitch: 2.0.4
+
+ mdast-util-to-string@3.2.0:
+ dependencies:
+ '@types/mdast': 3.0.15
+
+ mdn-data@2.0.14: {}
+
+ mdn-data@2.0.4: {}
+
+ media-typer@0.3.0: {}
+
+ memfs@3.5.3:
+ dependencies:
+ fs-monkey: 1.0.6
+
+ meow@8.1.2:
+ dependencies:
+ '@types/minimist': 1.2.5
+ camelcase-keys: 6.2.2
+ decamelize-keys: 1.1.1
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+
+ meow@9.0.0:
+ dependencies:
+ '@types/minimist': 1.2.5
+ camelcase-keys: 6.2.2
+ decamelize: 1.2.0
+ decamelize-keys: 1.1.1
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+
+ merge-descriptors@1.0.3: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ methods@1.1.2: {}
+
+ micromark-core-commonmark@1.1.0:
+ dependencies:
+ decode-named-character-reference: 1.2.0
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-extension-directive@2.2.1:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ parse-entities: 4.0.2
+ uvu: 0.5.6
+
+ micromark-extension-frontmatter@1.1.1:
+ dependencies:
+ fault: 2.0.1
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-extension-gfm-autolink-literal@1.0.5:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-extension-gfm-footnote@1.1.2:
+ dependencies:
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-extension-gfm-strikethrough@1.0.7:
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-extension-gfm-table@1.0.7:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-extension-gfm-tagfilter@1.0.2:
+ dependencies:
+ micromark-util-types: 1.1.0
+
+ micromark-extension-gfm-task-list-item@1.0.5:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-extension-gfm@2.0.3:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 1.0.5
+ micromark-extension-gfm-footnote: 1.1.2
+ micromark-extension-gfm-strikethrough: 1.0.7
+ micromark-extension-gfm-table: 1.0.7
+ micromark-extension-gfm-tagfilter: 1.0.2
+ micromark-extension-gfm-task-list-item: 1.0.5
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-destination@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-label@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-factory-space@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-title@1.1.0:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-whitespace@1.1.0:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-character@1.2.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-chunked@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-classify-character@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-combine-extensions@1.1.0:
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-util-decode-numeric-character-reference@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-decode-string@1.1.0:
+ dependencies:
+ decode-named-character-reference: 1.2.0
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-encode@1.1.0: {}
+
+ micromark-util-html-tag-name@1.2.0: {}
+
+ micromark-util-normalize-identifier@1.1.0:
+ dependencies:
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-resolve-all@1.1.0:
+ dependencies:
+ micromark-util-types: 1.1.0
+
+ micromark-util-sanitize-uri@1.2.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
+
+ micromark-util-subtokenize@1.1.0:
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+
+ micromark-util-symbol@1.1.0: {}
+
+ micromark-util-types@1.1.0: {}
+
+ micromark@3.2.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.1(supports-color@5.5.0)
+ decode-named-character-reference: 1.2.0
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.5:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ miller-rabin@4.0.1:
+ dependencies:
+ bn.js: 4.12.2
+ brorand: 1.1.0
+
+ mime-db@1.52.0: {}
+
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ min-indent@1.0.1: {}
+
+ minimalistic-assert@1.0.1: {}
+
+ minimalistic-crypto-utils@1.0.1: {}
+
+ minimatch@3.0.8:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimist-options@4.1.0:
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ kind-of: 6.0.3
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ mri@1.2.0: {}
+
+ ms@2.0.0: {}
+
+ ms@2.1.2: {}
+
+ ms@2.1.3: {}
+
+ multipipe@1.0.2:
+ dependencies:
+ duplexer2: 0.1.4
+ object-assign: 4.1.1
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nanoid@3.3.11: {}
+
+ natural-compare-lite@1.4.0: {}
+
+ natural-compare@1.4.0: {}
+
+ needle@3.3.1:
+ dependencies:
+ iconv-lite: 0.6.3
+ sax: 1.4.1
+ optional: true
+
+ negotiator@0.6.3: {}
+
+ negotiator@0.6.4: {}
+
+ neo-async@2.6.2: {}
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-abort-controller@3.1.1: {}
+
+ node-addon-api@7.1.1:
+ optional: true
+
+ node-domexception@1.0.0: {}
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
+ node-int64@0.4.0: {}
+
+ node-libs-browser-okam@2.2.5:
+ dependencies:
+ assert-okam: 1.5.0
+ browserify-zlib: 0.2.0
+ buffer-okam: 4.9.2
+ console-browserify: 1.2.0
+ constants-browserify: 1.0.0
+ crypto-browserify: 3.12.1
+ domain-browser: 1.2.0
+ events-okam: 3.3.0
+ https-browserify: 1.0.0
+ os-browserify: 0.3.0
+ path-browserify: 0.0.1
+ process-okam: 0.11.10
+ punycode-okam: 1.4.1
+ querystring-es3: 0.2.1
+ readable-stream: 2.3.8
+ stream-browserify: 2.0.2
+ stream-http: 2.8.3
+ string_decoder-okam: 1.3.0
+ timers-browserify: 2.0.12
+ tty-browserify: 0.0.0
+ url-okam: 0.11.1
+ util-okam: 0.11.1
+ vm-browserify: 1.1.2
+
+ node-libs-browser@2.2.1:
+ dependencies:
+ assert: 1.5.1
+ browserify-zlib: 0.2.0
+ buffer: 4.9.2
+ console-browserify: 1.2.0
+ constants-browserify: 1.0.0
+ crypto-browserify: 3.12.1
+ domain-browser: 1.2.0
+ events: 3.3.0
+ https-browserify: 1.0.0
+ os-browserify: 0.3.0
+ path-browserify: 0.0.1
+ process: 0.11.10
+ punycode: 1.4.1
+ querystring-es3: 0.2.1
+ readable-stream: 2.3.8
+ stream-browserify: 2.0.2
+ stream-http: 2.8.3
+ string_decoder: 1.3.0
+ timers-browserify: 2.0.12
+ tty-browserify: 0.0.0
+ url: 0.11.4
+ util: 0.11.1
+ vm-browserify: 1.1.2
+
+ node-releases@2.0.19: {}
+
+ normalize-package-data@2.5.0:
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.10
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+
+ normalize-package-data@3.0.3:
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.16.1
+ semver: 7.7.2
+ validate-npm-package-license: 3.0.4
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ nprogress@0.2.0: {}
+
+ nth-check@1.0.2:
+ dependencies:
+ boolbase: 1.0.0
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ object-keys@0.4.0: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+
+ object.getownpropertydescriptors@2.1.8:
+ dependencies:
+ array.prototype.reduce: 1.0.8
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ gopd: 1.2.0
+ safe-array-concat: 1.1.3
+
+ object.getprototypeof@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ get-proto: 1.0.1
+ reflect.getprototypeof: 1.0.10
+
+ object.hasown@1.1.4:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ obuf@1.1.2: {}
+
+ omit-deep@0.3.0:
+ dependencies:
+ is-plain-object: 2.0.4
+ unset-value: 0.1.2
+
+ on-exit-leak-free@0.2.0: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-headers@1.0.2: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ open@9.1.0:
+ dependencies:
+ default-browser: 4.0.0
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 2.2.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ os-browserify@0.3.0: {}
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@3.0.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ pako@1.0.11: {}
+
+ param-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-asn1@5.1.7:
+ dependencies:
+ asn1.js: 4.10.1
+ browserify-aes: 1.2.0
+ evp_bytestokey: 1.0.3
+ hash-base: 3.0.5
+ pbkdf2: 3.1.3
+ safe-buffer: 5.2.1
+
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.2.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-node-version@1.0.1: {}
+
+ parse5@6.0.1: {}
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
+ parseley@0.12.1:
+ dependencies:
+ leac: 0.6.0
+ peberminta: 0.9.0
+
+ parseurl@1.3.3: {}
+
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ path-browserify@0.0.1: {}
+
+ path-exists@3.0.0: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-to-regexp@0.1.12: {}
+
+ path-to-regexp@1.7.0:
+ dependencies:
+ isarray: 0.0.1
+
+ path-type@4.0.0: {}
+
+ pbkdf2@3.1.3:
+ dependencies:
+ create-hash: 1.1.3
+ create-hmac: 1.1.7
+ ripemd160: 2.0.1
+ safe-buffer: 5.2.1
+ sha.js: 2.4.11
+ to-buffer: 1.2.1
+
+ peberminta@0.9.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pidtree@0.6.0: {}
+
+ pify@4.0.1:
+ optional: true
+
+ pino-abstract-transport@0.5.0:
+ dependencies:
+ duplexify: 4.1.3
+ split2: 4.2.0
+
+ pino-std-serializers@4.0.0: {}
+
+ pino@7.11.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.5.0
+ on-exit-leak-free: 0.2.0
+ pino-abstract-transport: 0.5.0
+ pino-std-serializers: 4.0.0
+ process-warning: 1.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.1.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 2.8.0
+ thread-stream: 0.15.2
+
+ pirates@4.0.7: {}
+
+ piscina@4.9.2:
+ optionalDependencies:
+ '@napi-rs/nice': 1.0.1
+
+ pkg-up@3.1.0:
+ dependencies:
+ find-up: 3.0.0
+
+ pluralize@8.0.0: {}
+
+ pnpm@10.12.4: {}
+
+ point-in-polygon@1.1.0: {}
+
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-attribute-case-insensitive@5.0.2(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-clamp@4.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-color-functional-notation@4.2.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-color-hex-alpha@8.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-color-rebeccapurple@7.1.1(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-custom-media@8.0.2(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-custom-properties@12.1.11(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-custom-selectors@6.0.3(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-dir-pseudo-class@6.0.5(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-double-position-gradients@3.1.2(postcss@8.5.6):
+ dependencies:
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-env-function@4.0.6(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-flexbugs-fixes@5.0.2(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-focus-visible@6.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-focus-within@5.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-font-variant@5.0.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-gap-properties@3.0.5(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-image-set-function@4.0.7(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-initial@4.0.1(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-lab-function@4.2.1(postcss@8.5.6):
+ dependencies:
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ cosmiconfig: 9.0.0(typescript@5.4.2)
+ jiti: 1.21.7
+ postcss: 8.5.6
+ semver: 7.7.2
+ optionalDependencies:
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+ transitivePeerDependencies:
+ - typescript
+
+ postcss-logical@5.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-media-minmax@5.0.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-media-query-parser@0.2.3: {}
+
+ postcss-modules-extract-imports@3.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-modules-local-by-default@4.2.0(postcss@8.5.6):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-selector-parser: 7.1.0
+ postcss-value-parser: 4.2.0
+
+ postcss-modules-scope@3.2.1(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 7.1.0
+
+ postcss-modules-values@4.0.0(postcss@8.5.6):
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.5.6)
+ postcss: 8.5.6
+
+ postcss-nesting@10.2.0(postcss@8.5.6):
+ dependencies:
+ '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-opacity-percentage@1.1.3(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-overflow-shorthand@3.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-page-break@3.0.4(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-place@7.0.5(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ postcss-prefix-selector@1.16.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-preset-env@7.5.0(postcss@8.5.6):
+ dependencies:
+ '@csstools/postcss-color-function': 1.1.1(postcss@8.5.6)
+ '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.5.6)
+ '@csstools/postcss-hwb-function': 1.0.2(postcss@8.5.6)
+ '@csstools/postcss-ic-unit': 1.0.1(postcss@8.5.6)
+ '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.5.6)
+ '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.5.6)
+ '@csstools/postcss-oklab-function': 1.1.1(postcss@8.5.6)
+ '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.5.6)
+ '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.5.6)
+ '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.6)
+ autoprefixer: 10.4.21(postcss@8.5.6)
+ browserslist: 4.25.1
+ css-blank-pseudo: 3.0.3(postcss@8.5.6)
+ css-has-pseudo: 3.0.4(postcss@8.5.6)
+ css-prefers-color-scheme: 6.0.3(postcss@8.5.6)
+ cssdb: 6.6.3
+ postcss: 8.5.6
+ postcss-attribute-case-insensitive: 5.0.2(postcss@8.5.6)
+ postcss-clamp: 4.1.0(postcss@8.5.6)
+ postcss-color-functional-notation: 4.2.4(postcss@8.5.6)
+ postcss-color-hex-alpha: 8.0.4(postcss@8.5.6)
+ postcss-color-rebeccapurple: 7.1.1(postcss@8.5.6)
+ postcss-custom-media: 8.0.2(postcss@8.5.6)
+ postcss-custom-properties: 12.1.11(postcss@8.5.6)
+ postcss-custom-selectors: 6.0.3(postcss@8.5.6)
+ postcss-dir-pseudo-class: 6.0.5(postcss@8.5.6)
+ postcss-double-position-gradients: 3.1.2(postcss@8.5.6)
+ postcss-env-function: 4.0.6(postcss@8.5.6)
+ postcss-focus-visible: 6.0.4(postcss@8.5.6)
+ postcss-focus-within: 5.0.4(postcss@8.5.6)
+ postcss-font-variant: 5.0.0(postcss@8.5.6)
+ postcss-gap-properties: 3.0.5(postcss@8.5.6)
+ postcss-image-set-function: 4.0.7(postcss@8.5.6)
+ postcss-initial: 4.0.1(postcss@8.5.6)
+ postcss-lab-function: 4.2.1(postcss@8.5.6)
+ postcss-logical: 5.0.4(postcss@8.5.6)
+ postcss-media-minmax: 5.0.0(postcss@8.5.6)
+ postcss-nesting: 10.2.0(postcss@8.5.6)
+ postcss-opacity-percentage: 1.1.3(postcss@8.5.6)
+ postcss-overflow-shorthand: 3.0.4(postcss@8.5.6)
+ postcss-page-break: 3.0.4(postcss@8.5.6)
+ postcss-place: 7.0.5(postcss@8.5.6)
+ postcss-pseudo-class-any-link: 7.1.6(postcss@8.5.6)
+ postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6)
+ postcss-selector-not: 5.0.0(postcss@8.5.6)
+ postcss-value-parser: 4.2.0
+
+ postcss-pseudo-class-any-link@7.1.6(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.2
+
+ postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-resolve-nested-selector@0.1.6: {}
+
+ postcss-safe-parser@6.0.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-selector-not@5.0.0(postcss@8.5.6):
+ dependencies:
+ balanced-match: 1.0.2
+ postcss: 8.5.6
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-selector-parser@7.1.0:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-syntax@0.36.2(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.4.2):
+ dependencies:
+ prettier: 2.8.8
+ typescript: 5.4.2
+
+ prettier-plugin-packagejson@2.4.3(prettier@2.8.8):
+ dependencies:
+ sort-package-json: 2.4.1
+ synckit: 0.8.5
+ optionalDependencies:
+ prettier: 2.8.8
+
+ prettier-plugin-packagejson@2.5.17(prettier@2.8.8):
+ dependencies:
+ sort-package-json: 3.3.1
+ synckit: 0.11.8
+ optionalDependencies:
+ prettier: 2.8.8
+
+ prettier@2.8.8: {}
+
+ pretty-error@4.0.0:
+ dependencies:
+ lodash: 4.17.21
+ renderkid: 3.0.0
+
+ pretty-format@24.9.0:
+ dependencies:
+ '@jest/types': 24.9.0
+ ansi-regex: 4.1.1
+ ansi-styles: 3.2.1
+ react-is: 16.13.1
+
+ prism-react-renderer@1.3.5(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ prism-react-renderer@2.3.1(react@18.3.1):
+ dependencies:
+ '@types/prismjs': 1.26.5
+ clsx: 2.1.1
+ react: 18.3.1
+
+ prism-themes@1.9.0: {}
+
+ prismjs@1.30.0: {}
+
+ process-nextick-args@2.0.1: {}
+
+ process-okam@0.11.10: {}
+
+ process-warning@1.0.0: {}
+
+ process@0.11.10: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ property-information@6.5.0: {}
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ prr@1.0.1:
+ optional: true
+
+ public-encrypt@4.0.3:
+ dependencies:
+ bn.js: 4.12.2
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ parse-asn1: 5.1.7
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
+ punycode-okam@1.4.1: {}
+
+ punycode@1.4.1: {}
+
+ punycode@2.3.1: {}
+
+ q@1.5.1: {}
+
+ qs@6.13.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ qs@6.14.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ query-string@6.14.1:
+ dependencies:
+ decode-uri-component: 0.2.2
+ filter-obj: 1.1.0
+ split-on-first: 1.1.0
+ strict-uri-encode: 2.0.0
+
+ querystring-es3@0.2.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ quick-format-unescaped@4.0.4: {}
+
+ quick-lru@4.0.1: {}
+
+ ramda@0.28.0: {}
+
+ ramda@0.29.0: {}
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ randomfill@1.0.4:
+ dependencies:
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ raw-loader@4.0.2(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ loader-utils: 2.0.4
+ schema-utils: 3.3.0
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ rc-cascader@3.34.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-checkbox@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-collapse@3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-drawer@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.22.3
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-drawer@7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-dropdown@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 1.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-field-form@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/async-validator': 5.0.4
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-footer@0.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.22.3
+ classnames: 2.3.2
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-image@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-input-number@9.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/mini-decimal': 1.1.0
+ classnames: 2.5.1
+ rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-input@1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-mentions@2.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-textarea: 1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-menu@9.12.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 1.18.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-menu@9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-notification@5.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-overflow@1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-pagination@5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-picker@4.11.3(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ dayjs: 1.11.13
+
+ rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-rate@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ resize-observer-polyfill: 1.5.1
+
+ rc-segmented@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-select@14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-slider@11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-table@7.51.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.5.1
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-tabs@12.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-dropdown: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-menu: 9.12.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-tabs@15.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-textarea@1.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-input: 1.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-tooltip@6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ '@rc-component/trigger': 2.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ classnames: 2.3.2
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-tree-select@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-select: 14.16.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-tree: 5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-tree@5.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-virtual-list: 3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-upload@4.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.5.1
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ rc-util@5.41.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.22.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+
+ rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+
+ rc-virtual-list@3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ classnames: 2.3.2
+ rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-copy-to-clipboard@5.1.0(react@18.3.1):
+ dependencies:
+ copy-to-clipboard: 3.3.3
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-error-boundary@4.1.2(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.27.6
+ react: 18.3.1
+
+ react-error-overlay@6.0.9: {}
+
+ react-fast-compare@3.2.2: {}
+
+ react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.23.6
+ invariant: 2.2.4
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-fast-compare: 3.2.2
+ shallowequal: 1.1.0
+
+ react-intersection-observer@9.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-intl@7.1.11(react@18.3.1)(typescript@5.4.2):
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.4
+ '@formatjs/icu-messageformat-parser': 2.11.2
+ '@formatjs/intl': 3.1.6(typescript@5.4.2)
+ '@types/hoist-non-react-statics': 3.3.6
+ '@types/react': 18.3.23
+ hoist-non-react-statics: 3.3.2
+ intl-messageformat: 10.7.16
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ typescript: 5.4.2
+
+ react-is@16.13.1: {}
+
+ react-is@18.3.1: {}
+
+ react-loading-skeleton@3.5.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-merge-refs@1.1.0: {}
+
+ react-refresh@0.14.0: {}
+
+ react-refresh@0.14.2: {}
+
+ react-router-dom@6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ history: 5.3.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router: 6.3.0(react@18.3.1)
+
+ react-router@6.3.0(react@18.3.1):
+ dependencies:
+ history: 5.3.0
+ react: 18.3.1
+
+ react-simple-code-editor@0.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ reactflow@11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@reactflow/background': 11.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@reactflow/controls': 11.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@reactflow/minimap': 11.7.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@reactflow/node-resizer': 2.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
+ read-pkg-up@7.0.1:
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+
+ read-pkg@5.2.0:
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+
+ readable-stream@1.0.34:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 0.0.1
+ string_decoder: 0.10.31
+
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ 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.1
+
+ readdirp@4.1.2: {}
+
+ real-require@0.1.0: {}
+
+ redent@3.0.0:
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regenerate-unicode-properties@10.1.1:
+ dependencies:
+ regenerate: 1.4.2
+
+ regenerate@1.4.2: {}
+
+ regenerator-runtime@0.13.11: {}
+
+ regenerator-runtime@0.14.1: {}
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ rehype-autolink-headings@6.1.1:
+ dependencies:
+ '@types/hast': 2.3.10
+ extend: 3.0.2
+ hast-util-has-property: 2.0.1
+ hast-util-heading-rank: 2.1.1
+ hast-util-is-element: 2.1.3
+ unified: 10.1.2
+ unist-util-visit: 4.1.2
+
+ rehype-remove-comments@5.0.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ hast-util-is-conditional-comment: 2.0.0
+ unified: 10.1.2
+ unist-util-filter: 4.0.1
+
+ rehype-stringify@9.0.4:
+ dependencies:
+ '@types/hast': 2.3.10
+ hast-util-to-html: 8.0.4
+ unified: 10.1.2
+
+ relateurl@0.2.7: {}
+
+ remark-directive@2.0.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-directive: 2.2.4
+ micromark-extension-directive: 2.2.1
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-frontmatter@4.0.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-frontmatter: 1.0.1
+ micromark-extension-frontmatter: 1.1.1
+ unified: 10.1.2
+
+ remark-gfm@3.0.1:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-gfm: 2.0.2
+ micromark-extension-gfm: 2.0.3
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@10.0.2:
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@10.1.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-to-hast: 12.3.0
+ unified: 10.1.2
+
+ rename-keys@1.2.0: {}
+
+ renderkid@3.0.0:
+ dependencies:
+ css-select: 4.3.0
+ dom-converter: 0.2.0
+ htmlparser2: 6.1.0
+ lodash: 4.17.21
+ strip-ansi: 6.0.1
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ reselect@4.1.8: {}
+
+ resize-observer-polyfill@1.5.1: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-global@1.0.0:
+ dependencies:
+ global-dirs: 0.1.1
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.19.0:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ resolve@2.0.0-next.5:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@4.0.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rimraf@5.0.1:
+ dependencies:
+ glob: 10.4.5
+
+ ripemd160@2.0.1:
+ dependencies:
+ hash-base: 2.0.2
+ inherits: 2.0.4
+
+ ripemd160@2.0.2:
+ dependencies:
+ hash-base: 3.0.5
+ inherits: 2.0.4
+
+ rollup-plugin-visualizer@5.9.0(rollup@3.29.5):
+ dependencies:
+ open: 8.4.2
+ picomatch: 2.3.1
+ source-map: 0.7.4
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 3.29.5
+
+ rollup@3.29.5:
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ run-applescript@5.0.0:
+ dependencies:
+ execa: 5.1.1
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ sade@1.8.1:
+ dependencies:
+ mri: 1.2.0
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ sass-loader@16.0.5(sass@1.89.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ neo-async: 2.6.2
+ optionalDependencies:
+ sass: 1.89.2
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+
+ sass@1.89.2:
+ dependencies:
+ chokidar: 4.0.3
+ immutable: 5.1.3
+ source-map-js: 1.2.1
+ optionalDependencies:
+ '@parcel/watcher': 2.5.1
+
+ sax@1.2.4: {}
+
+ sax@1.4.1: {}
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ schema-utils@3.3.0:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ ajv-keywords: 3.5.2(ajv@6.12.6)
+
+ schema-utils@4.3.2:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.17.1)
+
+ scroll-into-view-if-needed@3.1.0:
+ dependencies:
+ compute-scroll-into-view: 3.1.1
+
+ selderee@0.11.0:
+ dependencies:
+ parseley: 0.12.1
+
+ select-hose@2.0.0: {}
+
+ semver@5.7.2: {}
+
+ semver@6.3.1: {}
+
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
+ semver@7.7.2: {}
+
+ send@0.19.0:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ serialize-javascript@6.0.2:
+ dependencies:
+ randombytes: 2.1.0
+
+ serve-static@1.16.2:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+
+ setimmediate@1.0.5: {}
+
+ setprototypeof@1.2.0: {}
+
+ sha.js@2.4.11:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ shallowequal@1.1.0: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
+ sitemap@7.1.2:
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.4.1
+
+ slash@3.0.0: {}
+
+ slash@4.0.0: {}
+
+ slice-ansi@4.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+
+ slice-ansi@5.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+
+ sonic-boom@2.8.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+
+ sort-object-keys@1.1.3: {}
+
+ sort-package-json@2.4.1:
+ dependencies:
+ detect-indent: 7.0.1
+ detect-newline: 4.0.1
+ git-hooks-list: 3.2.0
+ globby: 13.2.2
+ is-plain-obj: 4.1.0
+ sort-object-keys: 1.1.3
+
+ sort-package-json@3.3.1:
+ dependencies:
+ detect-indent: 7.0.1
+ detect-newline: 4.0.1
+ git-hooks-list: 4.1.1
+ is-plain-obj: 4.1.0
+ semver: 7.7.2
+ sort-object-keys: 1.1.3
+ tinyglobby: 0.2.14
+
+ source-map-js@1.2.1: {}
+
+ source-map-resolve@0.6.0:
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.5.7: {}
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ spdx-correct@3.2.0:
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.21
+
+ spdx-exceptions@2.5.0: {}
+
+ spdx-expression-parse@3.0.1:
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.21
+
+ spdx-license-ids@3.0.21: {}
+
+ spdy-transport@3.0.0:
+ dependencies:
+ debug: 4.4.1(supports-color@5.5.0)
+ detect-node: 2.1.0
+ hpack.js: 2.1.6
+ obuf: 1.1.2
+ readable-stream: 3.6.2
+ wbuf: 1.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ spdy@4.0.2:
+ dependencies:
+ debug: 4.4.1(supports-color@5.5.0)
+ handle-thing: 2.0.1
+ http-deceiver: 1.2.7
+ select-hose: 2.0.0
+ spdy-transport: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ split-on-first@1.1.0: {}
+
+ split2@3.2.2:
+ dependencies:
+ readable-stream: 3.6.2
+
+ split2@4.2.0: {}
+
+ sprintf-js@1.0.3: {}
+
+ stable@0.1.8: {}
+
+ stackframe@1.3.4: {}
+
+ statuses@2.0.1: {}
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ stream-browserify@2.0.2:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ stream-http@2.8.3:
+ dependencies:
+ builtin-status-codes: 3.0.0
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ to-arraybuffer: 1.0.1
+ xtend: 4.0.2
+
+ stream-shift@1.0.3: {}
+
+ strict-uri-encode@2.0.0: {}
+
+ string-argv@0.3.2: {}
+
+ string-convert@0.2.1: {}
+
+ 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@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string.prototype.matchall@4.0.12:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string_decoder-okam@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ string_decoder@0.10.31: {}
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@2.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-indent@3.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ style-search@0.1.0: {}
+
+ style-to-object@0.4.4:
+ dependencies:
+ inline-style-parser: 0.1.1
+
+ styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1):
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+ '@babel/traverse': 7.27.7(supports-color@5.5.0)
+ '@emotion/is-prop-valid': 1.3.1
+ '@emotion/stylis': 0.8.5
+ '@emotion/unitless': 0.7.5
+ babel-plugin-styled-components: 2.1.4(@babel/core@7.27.7)(styled-components@5.3.11(@babel/core@7.27.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0)
+ css-to-react-native: 3.2.0
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+ shallowequal: 1.1.0
+ supports-color: 5.5.0
+ transitivePeerDependencies:
+ - '@babel/core'
+
+ stylelint-config-recommended@7.0.0(stylelint@14.16.1):
+ dependencies:
+ stylelint: 14.16.1
+
+ stylelint-config-standard@25.0.0(stylelint@14.16.1):
+ dependencies:
+ stylelint: 14.16.1
+ stylelint-config-recommended: 7.0.0(stylelint@14.16.1)
+
+ stylelint@14.16.1:
+ dependencies:
+ '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 7.1.0
+ css-functions-list: 3.2.3
+ debug: 4.4.1(supports-color@5.5.0)
+ fast-glob: 3.3.3
+ fastest-levenshtein: 1.0.16
+ file-entry-cache: 6.0.1
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.3.1
+ ignore: 5.3.2
+ import-lazy: 4.0.0
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.26.0
+ mathml-tag-names: 2.1.3
+ meow: 9.0.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-media-query-parser: 0.2.3
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-safe-parser: 6.0.0(postcss@8.5.6)
+ postcss-selector-parser: 6.1.2
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ style-search: 0.1.0
+ supports-hyperlinks: 2.3.0
+ svg-tags: 1.0.0
+ table: 6.9.0
+ v8-compile-cache: 2.4.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ stylis@4.2.0: {}
+
+ stylis@4.3.6: {}
+
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.10
+ commander: 4.1.1
+ glob: 10.4.5
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.7
+ ts-interface-checker: 0.1.13
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-hyperlinks@2.3.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svg-parser@2.0.4: {}
+
+ svg-pathdata@5.0.5: {}
+
+ svg-tags@1.0.0: {}
+
+ svgo-browser@1.3.8:
+ dependencies:
+ chalk: 2.4.2
+ coa: 2.0.2
+ css-select: 2.1.0
+ css-select-base-adapter: 0.1.1
+ css-tree: 1.0.0-alpha.37
+ csso: 4.2.0
+ js-yaml: 3.14.1
+ mkdirp: 0.5.6
+ sax: 1.2.4
+ stable: 0.1.8
+ unquote: 1.1.1
+ util.promisify: 1.0.1
+
+ svgo@2.8.0:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 4.3.0
+ css-tree: 1.1.3
+ csso: 4.2.0
+ picocolors: 1.1.1
+ stable: 0.1.8
+
+ svgson@4.1.0:
+ dependencies:
+ deep-rename-keys: 0.2.1
+ omit-deep: 0.3.0
+ xml-reader: 2.4.3
+
+ synckit@0.11.8:
+ dependencies:
+ '@pkgr/core': 0.2.7
+
+ synckit@0.8.5:
+ dependencies:
+ '@pkgr/utils': 2.4.2
+ tslib: 2.8.1
+
+ systemjs@6.15.1: {}
+
+ table@6.9.0:
+ dependencies:
+ ajv: 8.17.1
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ tapable@2.2.2: {}
+
+ terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.1))(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.27
+ jest-worker: 27.5.1
+ schema-utils: 4.3.2
+ serialize-javascript: 6.0.2
+ terser: 5.43.1
+ webpack: 5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))
+ optionalDependencies:
+ '@swc/core': 1.9.2(@swc/helpers@0.5.1)
+
+ terser@5.43.1:
+ dependencies:
+ '@jridgewell/source-map': 0.3.8
+ acorn: 8.15.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ test-exclude@6.0.0:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+
+ text-extensions@1.9.0: {}
+
+ text-table@0.2.0: {}
+
+ textextensions@2.6.0: {}
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ thread-stream@0.15.2:
+ dependencies:
+ real-require: 0.1.0
+
+ throttle-debounce@5.0.2: {}
+
+ through2@0.4.2:
+ dependencies:
+ readable-stream: 1.0.34
+ xtend: 2.1.2
+
+ through2@4.0.2:
+ dependencies:
+ readable-stream: 3.6.2
+
+ through@2.3.8: {}
+
+ timers-browserify@2.0.12:
+ dependencies:
+ setimmediate: 1.0.5
+
+ tinyglobby@0.2.14:
+ dependencies:
+ fdir: 6.4.6(picomatch@4.0.2)
+ picomatch: 4.0.2
+
+ titleize@3.0.0: {}
+
+ tmpl@1.0.5: {}
+
+ to-arraybuffer@1.0.1: {}
+
+ to-buffer@1.2.1:
+ dependencies:
+ isarray: 2.0.5
+ safe-buffer: 5.2.1
+ typed-array-buffer: 1.0.3
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toggle-selection@1.0.6: {}
+
+ toidentifier@1.0.1: {}
+
+ transformation-matrix@2.16.1: {}
+
+ traverse@0.6.6: {}
+
+ trim-lines@3.0.1: {}
+
+ trim-newlines@3.0.1: {}
+
+ trim-right@1.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-interface-checker@0.1.13: {}
+
+ ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@20.5.1)(typescript@5.4.2):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.5.1
+ acorn: 8.15.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.4.2
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optionalDependencies:
+ '@swc/core': 1.9.2(@swc/helpers@0.5.1)
+
+ ts-toolbelt@9.6.0: {}
+
+ tsconfig-paths@4.0.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@1.14.1: {}
+
+ tslib@2.8.1: {}
+
+ tsutils@3.21.0(typescript@5.4.2):
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.4.2
+
+ tsx@3.12.2:
+ dependencies:
+ '@esbuild-kit/cjs-loader': 2.4.4
+ '@esbuild-kit/core-utils': 3.3.2
+ '@esbuild-kit/esm-loader': 2.6.5
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ tty-browserify@0.0.0: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@0.18.1: {}
+
+ type-fest@0.20.2: {}
+
+ type-fest@0.6.0: {}
+
+ type-fest@0.8.1: {}
+
+ type-fest@1.4.0: {}
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
+ types-ramda@0.29.10:
+ dependencies:
+ ts-toolbelt: 9.6.0
+
+ typescript-transform-paths@3.4.7(typescript@5.4.2):
+ dependencies:
+ minimatch: 3.1.2
+ typescript: 5.4.2
+
+ typescript@5.4.2: {}
+
+ typescript@5.8.3: {}
+
+ umi@4.4.11(@babel/core@7.27.7)(@types/node@20.5.1)(@types/react@18.3.23)(eslint@8.57.1)(lightningcss@1.22.1)(prettier@2.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@3.29.5)(sass@1.89.2)(stylelint@14.16.1)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1))):
+ dependencies:
+ '@babel/runtime': 7.23.6
+ '@umijs/bundler-utils': 4.4.11
+ '@umijs/bundler-webpack': 4.4.11(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/core': 4.4.11
+ '@umijs/lint': 4.4.11(eslint@8.57.1)(stylelint@14.16.1)(typescript@5.4.2)
+ '@umijs/preset-umi': 4.4.11(@types/node@20.5.1)(@types/react@18.3.23)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.89.2)(terser@5.43.1)(type-fest@1.4.0)(typescript@5.4.2)(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ '@umijs/renderer-react': 4.4.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@umijs/server': 4.4.11
+ '@umijs/test': 4.4.11(@babel/core@7.27.7)
+ '@umijs/utils': 4.4.11
+ prettier-plugin-organize-imports: 3.2.4(prettier@2.8.8)(typescript@5.4.2)
+ prettier-plugin-packagejson: 2.4.3(prettier@2.8.8)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@rspack/core'
+ - '@types/node'
+ - '@types/react'
+ - '@types/webpack'
+ - '@volar/vue-language-plugin-pug'
+ - '@volar/vue-typescript'
+ - eslint
+ - jest
+ - lightningcss
+ - node-sass
+ - postcss-html
+ - postcss-jsx
+ - postcss-less
+ - postcss-markdown
+ - postcss-scss
+ - prettier
+ - react
+ - react-dom
+ - rollup
+ - sass
+ - sass-embedded
+ - sockjs-client
+ - stylelint
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - type-fest
+ - typescript
+ - webpack
+ - webpack-dev-server
+ - webpack-hot-middleware
+ - webpack-plugin-serve
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@7.8.0: {}
+
+ unfetch@5.0.0: {}
+
+ unified@10.1.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ bail: 2.0.2
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 5.3.7
+
+ unist-util-filter@4.0.1:
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+
+ unist-util-generated@2.0.1: {}
+
+ unist-util-is@5.2.1:
+ dependencies:
+ '@types/unist': 2.0.11
+
+ unist-util-position@4.0.4:
+ dependencies:
+ '@types/unist': 2.0.11
+
+ unist-util-stringify-position@3.0.3:
+ dependencies:
+ '@types/unist': 2.0.11
+
+ unist-util-visit-parents@5.1.3:
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+
+ unist-util-visit@4.1.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+
+ universalify@0.1.2: {}
+
+ universalify@2.0.1: {}
+
+ unpipe@1.0.0: {}
+
+ unquote@1.1.1: {}
+
+ unset-value@0.1.2:
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+
+ untildify@4.0.0: {}
+
+ update-browserslist-db@1.1.3(browserslist@4.25.1):
+ dependencies:
+ browserslist: 4.25.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ url-okam@0.11.1:
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.14.0
+
+ url@0.11.4:
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.14.0
+
+ use-debouncy@4.6.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ use-isomorphic-layout-effect@1.2.1(@types/react@18.3.23)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.23
+
+ use-sync-external-store@1.5.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ util-deprecate@1.0.2: {}
+
+ util-okam@0.11.1:
+ dependencies:
+ inherits: 2.0.3
+
+ util.promisify@1.0.1:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ has-symbols: 1.1.0
+ object.getownpropertydescriptors: 2.1.8
+
+ util@0.10.3:
+ dependencies:
+ inherits: 2.0.1
+
+ util@0.10.4:
+ dependencies:
+ inherits: 2.0.3
+
+ util@0.11.1:
+ dependencies:
+ inherits: 2.0.3
+
+ utila@0.4.0: {}
+
+ utils-merge@1.0.1: {}
+
+ uuid@8.3.2: {}
+
+ uvu@0.5.6:
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.2.0
+ kleur: 4.1.5
+ sade: 1.8.1
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ v8-compile-cache@2.3.0: {}
+
+ v8-compile-cache@2.4.0: {}
+
+ validate-npm-package-license@3.0.4:
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+
+ validator@13.15.15: {}
+
+ vanilla-jsoneditor@0.16.1: {}
+
+ vary@1.1.2: {}
+
+ vfile-location@4.1.0:
+ dependencies:
+ '@types/unist': 2.0.11
+ vfile: 5.3.7
+
+ vfile-message@3.1.4:
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-stringify-position: 3.0.3
+
+ vfile@5.3.7:
+ dependencies:
+ '@types/unist': 2.0.11
+ is-buffer: 2.0.5
+ unist-util-stringify-position: 3.0.3
+ vfile-message: 3.1.4
+
+ vite@4.5.2(@types/node@20.5.1)(less@4.1.3)(lightningcss@1.22.1)(sass@1.89.2)(terser@5.43.1):
+ dependencies:
+ esbuild: 0.18.20
+ postcss: 8.5.6
+ rollup: 3.29.5
+ optionalDependencies:
+ '@types/node': 20.5.1
+ fsevents: 2.3.3
+ less: 4.1.3
+ lightningcss: 1.22.1
+ sass: 1.89.2
+ terser: 5.43.1
+
+ vm-browserify@1.1.2: {}
+
+ walker@1.0.8:
+ dependencies:
+ makeerror: 1.0.12
+
+ watchpack@2.4.4:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wbuf@1.7.3:
+ dependencies:
+ minimalistic-assert: 1.0.1
+
+ web-namespaces@2.0.1: {}
+
+ web-streams-polyfill@3.3.3: {}
+
+ webpack-5-chain@8.0.1:
+ dependencies:
+ deepmerge: 1.5.2
+ javascript-stringify: 2.1.0
+
+ webpack-sources@3.3.3: {}
+
+ webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)):
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.15.0
+ browserslist: 4.25.1
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.18.2
+ es-module-lexer: 1.7.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.0
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 4.3.2
+ tapable: 2.2.2
+ terser-webpack-plugin: 5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.1))(webpack@5.99.9(@swc/core@1.9.2(@swc/helpers@0.5.1)))
+ watchpack: 2.4.4
+ webpack-sources: 3.3.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.0
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.19
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.19:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@1.3.1:
+ dependencies:
+ isexe: 2.0.0
+
+ which@2.0.2:
+ 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@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
+ xml-lexer@0.2.2:
+ dependencies:
+ eventemitter3: 2.0.3
+
+ xml-reader@2.4.3:
+ dependencies:
+ eventemitter3: 2.0.3
+ xml-lexer: 0.2.2
+
+ xtend@2.1.2:
+ dependencies:
+ object-keys: 0.4.0
+
+ xtend@4.0.2: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml@1.10.2: {}
+
+ yaml@2.3.1: {}
+
+ yargs-parser@20.2.9: {}
+
+ 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
+
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ z-schema@5.0.5:
+ dependencies:
+ lodash.get: 4.4.2
+ lodash.isequal: 4.5.0
+ validator: 13.15.15
+ optionalDependencies:
+ commander: 9.5.0
+
+ zod-validation-error@2.1.0(zod@3.25.67):
+ dependencies:
+ zod: 3.25.67
+
+ zod@3.25.67: {}
+
+ zustand@4.5.7(@types/react@18.3.23)(react@18.3.1):
+ dependencies:
+ use-sync-external-store: 1.5.0(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.23
+ react: 18.3.1
+
+ zwitch@2.0.4: {}
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo1.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..dc2826a4cdcbbc71defdf117948733963f8ebade
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo1.jsx
@@ -0,0 +1,15 @@
+import { h, Fragment } from '@openinula/next';
+import Button from '../index.jsx';
+
+export default function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo2.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..b2c199815f400a64c32a56fe73a02742ea00bd7e
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo2.jsx
@@ -0,0 +1,15 @@
+import { h, Fragment } from '@openinula/next';
+import { Button } from 'inulaUI';
+
+export default function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo3.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..ab1ed2f999c2f27fbb1ec13a0c5a0e46f627b18a
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo3.jsx
@@ -0,0 +1,14 @@
+import { h, Fragment } from '@openinula/next';
+import { Button } from 'inulaUI';
+
+export default function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+ );
+}
+
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo4.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7dde92964c2b353585f686e77453591707777875
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo4.jsx
@@ -0,0 +1,15 @@
+import { h, Fragment } from '@openinula/next';
+import { Button } from 'inulaUI';
+
+export default function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo5.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..66f722c8218aec4aca6469f2770c2460cf6c6197
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo5.jsx
@@ -0,0 +1,15 @@
+import { h, Fragment } from '@openinula/next';
+import { Button } from 'inulaUI';
+
+export default function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/demos/demo6.jsx b/packages/inula2-ui/inulaUI/src/button/demos/demo6.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..735d8163c8fc75348faacae9c39dd0e8824d70c6
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/demos/demo6.jsx
@@ -0,0 +1,27 @@
+import { h, Fragment } from '@openinula/next';
+import { Button } from 'inulaUI';
+
+export default function ButtonDemo() {
+ let loading = false;
+ const handleLoading = () => {
+ loading = true;
+ setTimeout(() => loading = false, 1500);
+ console.log(loading);
+ };
+ return (
+
+
+
+ );
+}
+
+// export default function Counter() {
+// let count = 0; // 直接声明状态
+
+// return (
+//
+//
计数: {count}
+//
+//
+// );
+// }
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/index.css b/packages/inula2-ui/inulaUI/src/button/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..739479c1bd1d9293f5368364dd47515dcf5d89ca
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/index.css
@@ -0,0 +1,231 @@
+.inula-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 14px;
+ padding: 0 16px;
+ height: 32px;
+ border-radius: 4px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #333;
+ cursor: pointer;
+ transition: all 0.2s;
+ outline: none;
+}
+
+/* 主按钮 */
+.inula-btn-primary {
+ background: #1677ff;
+ border-color: #1677ff;
+ color: #fff;
+}
+.inula-btn-primary:hover {
+ background: #4096ff;
+ border-color: #4096ff;
+ color: #fff;
+}
+.inula-btn-primary:active {
+ background: #0958d9;
+ border-color: #0958d9;
+ color: #fff;
+}
+
+/* 默认按钮 */
+.inula-btn-default {
+ background: #fff;
+ border-color: #d9d9d9;
+ color: #333;
+}
+.inula-btn-default:hover {
+ color: #1677ff;
+ border-color: #1677ff;
+ background: #f0f7ff;
+}
+.inula-btn-default:active {
+ background: #e6f4ff;
+ border-color: #1677ff;
+ color: #1677ff;
+}
+
+/* 虚线按钮 */
+.inula-btn-dashed {
+ border-style: dashed;
+ background: #fff;
+ border-color: #d9d9d9;
+ color: #333;
+}
+.inula-btn-dashed:hover {
+ color: #1677ff;
+ border-color: #1677ff;
+ background: #f0f7ff;
+}
+.inula-btn-dashed:active {
+ background: #e6f4ff;
+ border-color: #1677ff;
+ color: #1677ff;
+}
+
+/* 文本按钮 */
+.inula-btn-text {
+ background: none;
+ border: none;
+ color: #1677ff;
+ box-shadow: none;
+}
+.inula-btn-text:hover {
+ background: #e6f4ff;
+ color: #0958d9;
+}
+.inula-btn-text:active {
+ background: #bae0ff;
+ color: #0958d9;
+}
+
+/* 链接按钮 */
+.inula-btn-link {
+ background: none;
+ border: none;
+ color: #1677ff;
+ text-decoration: underline;
+ box-shadow: none;
+}
+.inula-btn-link:hover {
+ color: #0958d9;
+ background: none;
+ text-decoration: underline;
+}
+.inula-btn-link:active {
+ color: #0958d9;
+ background: none;
+}
+
+/* 危险按钮 */
+.inula-btn-danger {
+ color: #ff4d4f;
+ border-color: #ff4d4f;
+ background: #fff1f0;
+}
+.inula-btn-danger:hover {
+ color: #fff;
+ background: #ff4d4f;
+ border-color: #ff4d4f;
+}
+.inula-btn-primary.inula-btn-danger {
+ background: #ff4d4f;
+ color: #fff;
+ border-color: #ff4d4f;
+}
+.inula-btn-primary.inula-btn-danger:hover {
+ background: #d9363e;
+ border-color: #d9363e;
+ color: #fff;
+}
+.inula-btn-primary.inula-btn-danger:active {
+ background: #d9363e;
+ border-color: #d9363e;
+ color: #fff;
+}
+
+/* 幽灵按钮基础样式 */
+.inula-btn-ghost {
+ background: transparent !important;
+ color: #1677ff;
+ border: 1px solid #1677ff;
+ box-shadow: none;
+}
+
+/* 幽灵主按钮 */
+.inula-btn-primary.inula-btn-ghost {
+ color: #1677ff;
+ border-color: #1677ff;
+ background: transparent;
+}
+.inula-btn-primary.inula-btn-ghost:hover {
+ color: #4096ff;
+ border-color: #4096ff;
+ background: rgba(22, 119, 255, 0.08);
+}
+.inula-btn-primary.inula-btn-ghost:active {
+ color: #4096ff;
+ border-color: #4096ff;
+ background: rgba(22, 119, 255, 0.16);
+}
+
+/* 幽灵危险按钮 */
+.inula-btn-danger.inula-btn-ghost,
+.inula-btn-primary.inula-btn-danger.inula-btn-ghost {
+ color: #ff4d4f;
+ border-color: #ff4d4f;
+ background: transparent;
+}
+.inula-btn-danger.inula-btn-ghost:hover,
+.inula-btn-primary.inula-btn-danger.inula-btn-ghost:hover {
+ color: #fff;
+ background: #ff4d4f;
+ border-color: #ff4d4f;
+}
+.inula-btn-danger.inula-btn-ghost:active {
+ color: #ff4d4f;
+ background: #ff4d4f;
+ border-color: #ff4d4f;
+}
+
+/* 幽灵默认按钮 */
+.inula-btn-default.inula-btn-ghost {
+ color: #1677ff;
+ border-color: #1677ff;
+ background: transparent;
+}
+.inula-btn-default.inula-btn-ghost:hover {
+ color: #4096ff;
+ border-color: #4096ff;
+ background: rgba(22, 119, 255, 0.08);
+}
+.inula-btn-default.inula-btn-ghost:active {
+ color: #4096ff;
+ border-color: #4096ff;
+ background: rgba(22, 119, 255, 0.16);
+}
+
+/* 禁用 */
+.inula-btn-disabled,
+.inula-btn:disabled,
+.inula-btn-disabled:hover,
+.inula-btn:disabled:hover,
+.inula-btn-disabled:active,
+.inula-btn:disabled:active {
+ cursor: not-allowed;
+ opacity: 0.5;
+ background: #fff !important;
+ color: #333 !important;
+ border-color: #d9d9d9 !important;
+ box-shadow: none !important;
+}
+
+/* 加载中 */
+.inula-btn-loading {
+ position: relative;
+}
+.inula-btn-spinner {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ border: 2px solid #ccc;
+ border-top: 2px solid #1677ff;
+ border-radius: 50%;
+ animation: inula-spin 0.8s linear infinite;
+ margin-right: 8px;
+}
+@keyframes inula-spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 幽灵按钮在深色背景下更明显 */
+.demo-dark-bg {
+ background: #222;
+ padding: 16px;
+ display: inline-block;
+ border-radius: 6px;
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/index.jsx b/packages/inula2-ui/inulaUI/src/button/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..5e88d47c66aef07078538f23e4c4660ad28682fd
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/index.jsx
@@ -0,0 +1,38 @@
+import { render } from '@openinula/next';
+import './index.css';
+
+const Button = ({
+ type = 'default', // primary, dashed, text, link
+ danger = false,
+ ghost = false,
+ disabled = false,
+ loading = false,
+ children,
+ onClick,
+ ...rest
+}) => {
+ const classNames = [
+ 'inula-btn',
+ `inula-btn-${type}`,
+ danger ? 'inula-btn-danger' : '',
+ ghost ? 'inula-btn-ghost' : '',
+ disabled ? 'inula-btn-disabled' : '',
+ loading ? 'inula-btn-loading' : '',
+ ].filter(Boolean).join(' ');
+
+ console.log('Button props:', rest);
+
+ return (
+
+ );
+};
+
+export default Button;
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/button/index.md b/packages/inula2-ui/inulaUI/src/button/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ac8df337b306e652430ffab138fcea47538a259
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/button/index.md
@@ -0,0 +1,37 @@
+---
+title: Button 按钮组件
+description: 支持五种类型和四种状态属性。
+demo:
+ cols: 2
+---
+
+## 按钮类型
+- 主按钮(`primary`):用于主行动点,一个操作区域只能有一个主按钮。
+- 默认按钮(`default`):用于没有主次之分的一组行动点。
+- 虚线按钮(`dashed`):常用于添加操作。
+- 文本按钮(`text`):用于最次级的行动点。
+- 链接按钮(`link`):一般用于链接,即导航至某位置。
+
+## 状态属性
+- 危险(`danger`):删除/移动/修改权限等危险操作,一般需要二次确认。
+- 幽灵(`ghost`):用于背景色比较复杂的地方,常用在首页/产品页等展示场景。
+- 禁用(`disabled`):行动点不可用的时候,一般需要文案解释。
+- 加载中(`loading`):用于异步操作等待反馈的时候,也可以避免多次提交。
+
+## 代码演示
+基本
+危险
+幽灵
+禁用
+加载中
+交互加载
+
+
+## API
+| 属性 | 说明 | 类型 | 默认值 |
+|---------|--------------|---------|--------|
+| type | 按钮类型 | `string` | default|
+| danger | 危险状态 | `boolean` | false |
+| ghost | 幽灵状态 | `boolean` | false |
+| disabled| 禁用状态 | `boolean` | false |
+| loading | 加载中状态 | `boolean` | false |
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/card/index.md b/packages/inula2-ui/inulaUI/src/card/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..36c7dc37bc4163c3bbe850774302e87671c1b7bd
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/card/index.md
@@ -0,0 +1,508 @@
+# Card 卡片组件
+
+## 何时使用
+
+卡片容器,可承载文字、列表、图片、段落,常用于后台概览页面。
+
+## 代码演示
+
+
+
+
+
基本
+
完整的Card由header、body、footer三部分组成,支持两种大小、两种边框样式、两种hover动效
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Card, Tag, Icon } from 'inula-ui';
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ return (
+
+
+ 完整Card布局
+
+
+ More
}
+ cover={
+

+ }
+ actions={actions}
+ >
+
Card content
+
Card content
+
Card content
+
+
+
+ 不同大小、边框、hover动效的Card
+
+
+
+ 默认型号,无hover动效
+
+
+ 小号,有hover动效
+
+
+
+ );
+};
+
+export default CardDemo;
+```
+
+
+
+
+
+
+
+
+
加载、嵌套
+
支持受控加载、嵌套卡片
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Card, Tag, Switch, Icon } from 'inula-ui';
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ let loading = false;
+ return (
+
+
+ 定义加载内容状态的Card
+
+
+ More
}
+ cover={
+

+ }
+ actions={actions}
+ loading={loading}
+ >
+
Card content
+
Card content
+
Card content
+
+
+ {
+ loading = !loading;
+ }}
+ />
+ 点击切换内容加载状态
+
+
+ 嵌套Card样式
+
+
+ 放在Card下的Card组件样式
+
+
+
+ );
+};
+
+export default CardDemo;
+```
+
+
+
+
+
+
+
+
+
CardMeta组件
+
CardMeta组件可以快速定义固定布局的内容。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Card, Tag, Icon, CardMeta } from 'inula-ui';
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ return (
+
+
+ Meta组件,快速定义内容
+
+
+
+ }
+ actions={actions}
+ >
+
+ }
+ title="Card title"
+ description="This is the description"
+ />
+
+
+
+ );
+};
+
+export default CardDemo;
+```
+
+
+
+
+
+
+
+
+
CardGrid网格型内嵌卡片
+
常见的卡片内容区隔模式。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Card, CardGrid, Tag } from 'inula-ui';
+
+const CardDemo = () => {
+ return (
+
+
+ Grid组件,网格型内嵌
+
+
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+
+
+ );
+};
+
+export default CardDemo;
+```
+
+
+
+
+
+
+
+
+
Tabs切换卡片
+
可以定义带标签的卡片。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Card, Tag } from 'inula-ui';
+
+const tabList = [
+ {
+ key: 'tab1',
+ tab: 'tab1',
+ },
+ {
+ key: 'tab2',
+ tab: 'tab2',
+ },
+];
+
+const contentList = {
+ tab1: content1
,
+ tab2: content2
,
+};
+
+const tabListNoTitle = [
+ {
+ key: 'article',
+ label: 'article',
+ },
+ {
+ key: 'app',
+ label: 'app',
+ },
+ {
+ key: 'project',
+ label: 'project',
+ },
+];
+
+const contentListNoTitle = {
+ article: article content
,
+ app: app content
,
+ project: project content
,
+};
+
+const CardDemo = () => {
+ let activeTabKey1 = 'tab1';
+ let activeTabKey2 = 'article';
+ const onTab1Change = (key) => {
+ activeTabKey1 = key;
+ };
+
+ const onTab2Change = (key) => {
+ activeTabKey2 = key;
+ };
+
+ return (
+
+
+ 两种传参方式的标签卡片
+
+
+ More}
+ tabList={tabList}
+ activeTabKey={activeTabKey1}
+ onTabChange={onTab1Change}
+ >
+ {contentList[activeTabKey1]}
+
+
+
+ More}
+ onTabChange={onTab2Change}
+ tabProps={{
+ size: 'middle',
+ }}
+ >
+ {contentListNoTitle[activeTabKey2]}
+
+
+
+ );
+};
+
+export default CardDemo;
+```
+
+
+
+
+
+## API
+
+### Card
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ------------------- | ------------------------------------------------------ | ------------------------------------------------------------------- | ---------------------------- | ------------ |
+| type | 卡片类型 | `string` | `'default' \| 'inner'` | `'default'` |
+| size | 卡片大小 | `string` | `'small' \| 'default'` | `'default'` |
+| loading | 卡片内容加载 | `boolean` | - | `false` |
+| variant | 边框样式 | `string` | `'outlined' \| 'borderless'` | `'outlined'` |
+| hoverable | 悬停浮空 | `boolean` | - | `false` |
+| gridbox | 网格布局,只有`children`全为`CardGrid`时才能传入`true` | `boolean` | - | `false` |
+| tabList | tab 标签 | `{ key: string, tab: string }[] \| { key: string,label: string }[]` | - | - |
+| tabProps | tab 相关属性 | `object` | - | - |
+| activeTabKey | tab 选中标签 | `string` | - | - |
+| defaultActiveTabKey | tab 初始选中标签 | `string` | - | - |
+| onTabChange | tab 状态改变事件 | `function(key)` | - | - |
+| title | 头部 title | `string` | - | - |
+| extra | 头部额外内容 | `node` | - | - |
+| cover | 卡片封面,位于 header 下方 | `node` | - | - |
+| actions | 卡片操作栏 | `node[] \|string[]` | - | - |
+| children | 卡片内容 | `node` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+| ...rest | 其他属性 | - | - | - |
+
+### CardMeta
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ----------- | ---------- | --------------- | ------ | ------ |
+| avatar | 头像型 | `node` | - | - |
+| title | 标题 | `string\| node` | - | - |
+| description | 介绍 | `string\|node` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+
+### CardGrid
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| --------- | ------------------ | --------------- | ------ | ------ |
+| hoverable | hover 悬浮动画效果 | `string` | - | `true` |
+| children | 卡片内容 | `node` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+| ...rest | 其他属性 | - | - | - |
+
+说明:
+
+- 完整布局 Card 的 header 包含`title、extra`,如果为标签卡片还包含`tabs`,body 包含`cover`封面、`children`内容,footer 为`actions`。
+- 网格布局属性`gridbox`只有孩子全为`CardGrid`才会生效。
diff --git a/packages/inula2-ui/inulaUI/src/datepicker/index.md b/packages/inula2-ui/inulaUI/src/datepicker/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..5eec97457fbc956e15e9db1c1aaa22f6646abf7c
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/datepicker/index.md
@@ -0,0 +1,1256 @@
+# DatePicker 日期选择器
+
+用于选择和展示日期
+
+## 何时使用
+
+当需要选择和展示日期时。
+
+## 代码演示
+
+
+
+
+
基本datepicker
+
支持五种picker、四种varient、两种status
+
+
+ 查看示例代码
+
+```jsx | pure
+import { DatePicker, Tag } from 'inula-ui';
+
+function DatePickerDemo() {
+ const handleChange = (value) => {
+ console.log('选择的值:', value);
+ };
+
+ return (
+
+
+ 五种picker基本日期选择器
+
+
+
+
+
+
+
+
+ 不同尺寸日期选择器
+
+
+
+
+
+
+ 禁用状态基本日期选择器
+
+
+
+
+ 四种varient变体基本选择器
+
+
+
+
+
+
+
+ 两种status基本日期选择器
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
+```
+
+
+
+
+
+
+
+
+
needConfirm,showNow,Icon
+
支持needConfirm确认模式,显示今天,自定义图标
+
+
+ 查看示例代码
+
+```jsx | pure
+import { DatePicker, Tag, Icon } from 'inula-ui';
+
+function DatePickerDemo() {
+ return (
+
+
+ 需要确认的日期选择器
+
+
+
+
+
+
+
+
+ showNow控制今天按钮显示
+
+
+
+
+ 自定义prefix,suffixIcon图标
+ }
+ placeholder="prefix"
+ />
+ }
+ placeholder="suffixIcon"
+ />
+
+
+
+ 自定义日历title切换图标
+ }
+ style={{ width: 200 }}
+ placeholder="prevIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="nextIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="superPrevIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="superNextIcon"
+ placement="topLeft"
+ />
+
+
+ );
+}
+
+export default DatePickerDemo;
+```
+
+
+
+
+
+
+
+
+
defaultValue, defaultPickerValue
+
支持日期默认值,日期浮层默认值,定义浮层默认值时,每次点击会自动返回默认值面板
+
+
+ 查看示例代码
+
+```jsx | pure
+import { DatePicker, Tag } from 'inula-ui';
+
+function DatePickerDemo() {
+ return (
+
+
+ 日期默认值
+
+
+
+
+
+
+
+
+ calendar浮窗面板默认值
+
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
+```
+
+
+
+
+
+
+
+
+
disbaledDate,minDate,maxDate
+
可以通过自定义字段来限制选中范围
+
+
+ 查看示例代码
+
+```jsx | pure
+import { DatePicker, Tag } from 'inula-ui';
+
+function DatePickerDemo() {
+ return (
+
+ 范围和选中限制
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
+```
+
+
+
+
+
+
+
+
+
回调、受控、弹出位置
+
可以自定义回调函数、受控控制calendar浮层开关、通过placement控制浮层弹出位置
+
+
+ 查看示例代码
+
+```jsx | pure
+import { DatePicker, Tag, Button } from 'inula-ui';
+
+function DatePickerDemo() {
+ let open = false;
+ let defaultOpen = false;
+ let placement = 'bottomLeft';
+ let picker = 'date';
+ let size = 'default';
+
+ const handleControllOpenChange = (isOpen) => {
+ open = !isOpen;
+ };
+
+ const handleChange = (value) => {
+ console.log('选择的值:', value);
+ };
+
+ const handleOpenChange = (isOpen) => {
+ console.log(isOpen);
+ };
+
+ const handlePanleChange = (value, mode) => {
+ console.log(value, mode);
+ };
+
+ const handleClickOk = (value) => {
+ console.log('ok', value);
+ };
+
+ const onBlur = () => {
+ console.log(111);
+ };
+
+ const onFocus = () => {
+ console.log(111);
+ };
+
+ return (
+
+
+
+ 回调函数示例
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 日历弹出位置控制
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
+```
+
+
+
+
+
+
+
+
+
rangepicker
+
支持五种picker、四种varient、两种status
+
+
+ 查看示例代码
+
+```jsx | pure
+import { RangePicker, Tag } from 'inula-ui';
+
+function RangePickerDemo() {
+ const handleChange = (value) => {
+ console.log('选择的值:', value);
+ };
+
+ return (
+
+
+
+ 五种picker-range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 三种size-range日期选择器
+
+
+
+
+
+
+
+
+
+
+ 禁用状态range日期选择器
+
+
+
+
+
+
+
+
+ 四种varient-range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+ 两种status-range日期选择器
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
+```
+
+
+
+
+
+
+
+
+
needConfirm,Icon,defaultValue,范围限制
+
rangepicker也支持确认模式,自定义图标,默认值,日期范围限制
+
+
+ 查看示例代码
+
+```jsx | pure
+import { RangePicker, Tag, Icon } from 'inula-ui';
+
+function RangePickerDemo() {
+ const handleChange = (value) => {
+ console.log('选择的值:', value);
+ };
+
+ return (
+
+
+
+ 需要确认的rang日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义前后缀图标和title切换图标的range日期选择器
+
+
+ }
+ placeholder="prefix"
+ />
+ }
+ placeholder="suffixIcon"
+ />
+ }
+ placeholder="prevIcon"
+ />
+ }
+ placeholder="nextIcon"
+ />
+ }
+ placeholder="superPrevIcon"
+ />
+ }
+ placeholder="superNextIcon"
+ />
+
+
+
+
+
+ 带defaultValue的range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 带日期范围限制的range日期选择器
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
+```
+
+
+
+
+
+
+
+
+
回调、受控、弹出位置
+
rangepikcer也可以自定义回调函数、受控控制calendar浮层开关、通过placement控制浮层弹出位置
+
+
+ 查看示例代码
+
+```jsx | pure
+import { RangePicker, Tag, Button } from 'inula-ui';
+
+function RangePickerDemo() {
+ let open = false;
+ let defaultOpen = false;
+ let placement = 'bottomLeft';
+ let picker = 'date';
+ let size = 'default';
+
+ const handleControllOpenChange = (isOpen) => {
+ open = !isOpen;
+ };
+
+ const handleChange = (value) => {
+ console.log('选择的值:', value);
+ };
+
+ const handleOpenChange = (isOpen) => {
+ console.log(isOpen);
+ };
+
+ const handlePanleChange = (value, mode) => {
+ console.log(value, mode);
+ };
+
+ const handleClickOk = (value) => {
+ console.log('ok', value);
+ };
+
+ const onBlur = () => {
+ console.log(111);
+ };
+
+ const onFocus = () => {
+ console.log(111);
+ };
+
+ return (
+
+
+
+ 自定义回调函数的range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 控制日历弹出位置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
+```
+
+
+
+
+
+## API
+
+### DatePicker
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ------------------ | -------------------- | --------------------------- | ---------------------------------------------------------- | -------------- |
+| allowClear | 自定义清除按钮 | `node` | - | - |
+| showNow | 是否展示“今天”按钮 | `boolean` | - | `true` |
+| autoFocus | 自动获取焦点 | `boolean` | - | `false` |
+| inputReadOnly | 设置输入框只读 | `boolean` | - | `false` |
+| defaultOpen | 是否默认展开控制弹层 | `boolean` | - | `false` |
+| disabled | 禁用 | `boolean` | - | `false` |
+| disabledDate | 不可选择的日期 | `dateType[]` | - | - |
+| onChange | 时间变化回调 | `(value:dateType) => void` | - | - |
+| onOk | 点击确定回调 | `(value:dateType) => void` | - | - |
+| open | 控制弹层是否展开 | `boolean` | - | - |
+| defaultPickerValue | 默认面板日期 | `dateType` | - | - |
+| defaultValue | 默认值 | `dateType` | - | - |
+| minDate | 最小日期 | `dateType` | - | - |
+| maxDate | 最大日期 | `dateType` | - | - |
+| needConfirm | 是否需要确认按钮 | `boolean` | - | `false` |
+| picker | 设置选择器类型 | `string` | `'date' \| 'week' \| 'month' \| 'quarter'` `year` | `'date'` |
+| placeholder | 输入框提示文字 | `string` | - | - |
+| placement | 选择器弹出的位置 | `string` | `'bottomLeft' \| 'bottomRight' \| 'topLeft' \| 'topRight'` | `'bottomLeft'` |
+| prefix | 自定义前缀 | `node` | - | - |
+| prevIcon | 自定义上一个图标-月 | `node` | - | - |
+| nextIcon | 自定义下一个图标-月 | `node` | - | - |
+| suffixIcon | 自定义后缀 | `node` | - | - |
+| superNextIcon | 自定义下一个图标-年 | `node` | - | - |
+| superPrevIcon | 自定义上一个图标-年 | `node` | - | - |
+| size | input 大小 | `string` | `'large':40px, 'small':24px, 'default':32px` | - |
+| status | 设置校验状态 | `string` | `'error' \| 'warning'` - | - |
+| disabled | 是否禁用 | `boolean` | - | `false` |
+| variant | 复选框形态 | `string` | `'outlined' \| 'filled' \| 'borderless' \| 'underlined'` | `'outlined'` |
+| onOpenChange | 变化时回调 | `(value: dateType) => void` | - | - |
+| onPanleChange | 变化时回调 | `(value: dateType) => void` | - | - |
+| onBlur | 失去焦点时回调 | `(value: dateType) => void` | - | - |
+| onFocus | 获得焦点时回调 | `(value: dateType) => void` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+
+### RangePicker
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ------------- | -------------------- | --------------------------- | ---------------------------------------------------------- | -------------- |
+| allowClear | 自定义清除按钮 | `node` | - | - |
+| showNow | 是否展示“今天”按钮 | `boolean` | - | `true` |
+| autoFocus | 自动获取焦点 | `boolean` | - | `false` |
+| inputReadOnly | 设置输入框只读 | `boolean` | - | `false` |
+| defaultOpen | 是否默认展开控制弹层 | `boolean` | - | `false` |
+| disabled | 禁用 | `boolean` | - | `false` |
+| disabledDate | 不可选择的日期 | `dateType[]` | - | - |
+| onChange | 时间变化回调 | `(value:dateType) => void` | - | - |
+| onOk | 点击确定回调 | `(value:dateType) => void` | - | - |
+| open | 控制弹层是否展开 | `boolean` | - | - |
+| order | 是否自动排序 | `boolean` | - | `true` |
+| defaultValue | 默认值 | `dateType[]` | - | - |
+| minDate | 最小日期 | `dateType` | - | - |
+| maxDate | 最大日期 | `dateType` | - | - |
+| needConfirm | 是否需要确认按钮 | `boolean` | - | `false` |
+| picker | 设置选择器类型 | `string` | `'date' \| 'week' \| 'month' \| 'quarter'` `year` | `'date'` |
+| placeholder | 输入框提示文字 | `string[]` | - | - |
+| placement | 选择器弹出的位置 | `string` | `'bottomLeft' \| 'bottomRight' \| 'topLeft' \| 'topRight'` | `'bottomLeft'` |
+| prefixIcon | 自定义前缀 | `node` | - | - |
+| prevIcon | 自定义上一个图标-月 | `node` | - | - |
+| nextIcon | 自定义下一个图标-月 | `node` | - | - |
+| suffixIcon | 自定义后缀 | `node` | - | - |
+| superNextIcon | 自定义下一个图标-年 | `node` | - | - |
+| superPrevIcon | 自定义上一个图标-年 | `node` | - | - |
+| size | input 大小 | `string` | `'large':40px, 'small':24px, 'default':32px` | - |
+| status | 设置校验状态 | `string` | `'error' \| 'warning'` - | - |
+| disabled | 是否禁用 | `boolean` | - | `false` |
+| variant | 复选框形态 | `string` | `'outlined' \| 'filled' \| 'borderless' \| 'underlined'` | `'outlined'` |
+| onOpenChange | 变化时回调 | `(value: dateType) => void` | - | - |
+| onPanelChange | 变化时回调 | `(value: dateType) => void` | - | - |
+| onBlur | 失去焦点时回调 | `(value: dateType) => void` | - | - |
+| onFocus | 获得焦点时回调 | `(value: dateType) => void` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+
+说明:
+
+- dateType:为对应 picker 日期选择器的格式,`date`为`YYYY-MM-DD`,`week`为`YYYY-WW周`,`month`为`YYYY-MM`,`quarter`为`YYYY-QW`,`year`为`YYYY`。
+- 受控模式:当传入`open`字段时,calendar 浮层的打开会变成受控模式。
diff --git a/packages/inula2-ui/inulaUI/src/global.d.ts b/packages/inula2-ui/inulaUI/src/global.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b0fbe18d50db31a5ca57fa0f1435e6313afa21af
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/global.d.ts
@@ -0,0 +1,4 @@
+declare module '*.jsx' {
+ const component: any;
+ export default component;
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/inulaUI/src/icon/index.md b/packages/inula2-ui/inulaUI/src/icon/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..893d1d1eb28d97147cbb906a299d594709466799
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/icon/index.md
@@ -0,0 +1,227 @@
+# Icon 图标组件
+
+## 何时使用
+
+当你需要通过图标表达意思时
+
+## 代码演示
+
+
+
+
+
基本
+
仅支持实体图标和品牌图标,可以改变颜色。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Icon } from 'inula-ui';
+
+function IconDemo() {
+ return (
+
+
+
+ user默认实体
+
+
+
+ user实体
+
+
+
+ user实体蓝色
+
+
+ );
+}
+
+export default IconDemo;
+```
+
+
+
+
+
+
+
+
+
大小
+
通过size字段可以改变大小
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Icon } from 'inula-ui';
+
+function IconDemo() {
+ return (
+
+
+
+ 下箭头默认实体
+
+
+
+ 下箭头实体
+
+
+
+ 下箭头实体32px
+
+
+ );
+}
+
+export default IconDemo;
+```
+
+
+
+
+
+
+
+
+
动画
+
支持旋转动画
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Icon } from 'inula-ui';
+
+function IconDemo() {
+ return (
+
+
+
+ caret-left默认实体
+
+
+
+ caret-left实体
+
+
+
+ caret-left实体蓝色
+
+
+
+ caret-left实体天蓝色旋转45
+
+
+
+ caret-left实体天蓝色旋转
+
+
+ );
+}
+
+export default IconDemo;
+```
+
+
+
+
+
+
+
+
+
品牌图标
+
品牌图标示例。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Icon } from 'inula-ui';
+
+function IconDemo() {
+ return (
+
+
+
+ 苹果品牌图标
+
+
+
+ 苹果品牌图标32px
+
+
+
+ 苹果品牌图标绿色
+
+
+
+ 苹果品牌图标绿色旋转120度
+
+
+
+ 苹果品牌图标绿色旋转
+
+
+ );
+}
+
+export default IconDemo;
+```
+
+
+
+
+
+
+
+
+
实体图标表
+
该框架支持的所有实体图标表,点击即可复制。
+
+
+
+
+
+
+
+
+
品牌图标表
+
该框架支持的所有品牌图标表,点击即可复制。
+
+
+
+
+
+## API
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ------- | -------------------------------------------- | --------------- | --------------------- | ---------- |
+| value | 图标名称 | `string` | - | - |
+| theme | 图标主题,filled 或 brand 支持实体、品牌图标 | `string` | `'filled' \| 'brand'` | `'filled'` |
+| size | 图标大小 | `number` | - | - |
+| color | 图标颜色 | `string` | - | - |
+| rotate | 图标旋转角度 | `number` | - | - |
+| spin | 是否旋转动画 | `boolean` | - | `false` |
+| style | 图标样式 | `CSSProperties` | - | - |
+| onClick | 点击事件 | `function(e)` | - | - |
+| ...rest | 其他属性 | - | - | - |
diff --git a/packages/inula2-ui/inulaUI/src/index.ts b/packages/inula2-ui/inulaUI/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6539c399fac43c9043f0f4c300be6662217d243e
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/index.ts
@@ -0,0 +1,2 @@
+// export { default as Foo } from './Foo';
+export { default as Button } from './button';
diff --git a/packages/inula2-ui/inulaUI/src/notification/index.md b/packages/inula2-ui/inulaUI/src/notification/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/packages/inula2-ui/inulaUI/src/switch/index.md b/packages/inula2-ui/inulaUI/src/switch/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..655198620bcf9e782e6e01c9fac8b6facca38c6c
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/switch/index.md
@@ -0,0 +1,233 @@
+# Switch 开关组件
+
+## 何时使用
+
+使用开关可以切换两种状态。
+
+## 代码演示
+
+
+
+
+
基本
+
两种型号开关,支持默认选中、禁用
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Switch, Tag } from 'inula-ui';
+
+const SwitchDemo = () => {
+ let checked = false;
+
+ return (
+
+
+ 默认型号、小号开关
+
+ 默认型号
+
+ 小号
+
+
+ 默认选中
+
+ 默认选中
+
+
+ 禁用开关
+
+ 默认选中禁用
+
+ 禁用
+
+
+ );
+};
+
+export default SwitchDemo;
+```
+
+
+
+
+
+
+
+
+
受控
+
开关状态外部受控案例
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Switch, Tag, Button } from 'inula-ui';
+
+const SwitchDemo = () => {
+ let checked = false;
+
+ return (
+
+
+ 外部受控开关
+
+ 选中
+
+
+
+
+ );
+};
+
+export default SwitchDemo;
+```
+
+
+
+
+
+
+
+
+
带内容开关
+
可以自定义选中和非选中时开关的内容
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Switch, Tag, Icon } from 'inula-ui';
+
+const SwitchDemo = () => {
+ return (
+
+
+ 带内容的开关
+
+
+ }
+ unCheckedChildren={}
+ defaultChecked
+ />
+
+
+ );
+};
+
+export default SwitchDemo;
+```
+
+
+
+
+
+
+
+
+
加载
+
支持加载状态开关,加载中不可操作。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Switch, Tag } from 'inula-ui';
+
+const SwitchDemo = () => {
+ return (
+
+ );
+};
+
+export default SwitchDemo;
+```
+
+
+
+
+
+## API
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ----------------- | -------------------------------- | --------------- | ---------------------- | ------- |
+| defaultChecked | 默认选中 | `boolean` | - | `false` |
+| defaultValue | defaultChecked 别名 | `boolean` | - | `false` |
+| size | 开关大小 | `string` | `'default' \| 'small'` | `false` |
+| checked | 当前选中状态 | `boolean` | - | - |
+| disabled | 禁用状态 | `boolean` | - | `false` |
+| loading | 加载中状态(禁用且展示旋转图标) | `boolean` | - | `false` |
+| checkedChildren | 选中时 swicth 自带内容 | `node` | - | - |
+| unCheckedChildren | 非选中时 swicth 自带内容 | `node` | - | - |
+| onChange | 状态改变回调 | `(e) => void` | - | - |
+| onClick | 点击回调 | `(e) => void` | - | - |
+| className | 自定义样式类 | `string` | - | - |
+| style | 自定义行内样式 | `CSSProperties` | - | - |
+
+说明:当传入`checked`时 switch 为外部受控状态。
diff --git a/packages/inula2-ui/inulaUI/src/tag/index.md b/packages/inula2-ui/inulaUI/src/tag/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..7bf69359e03c7a5daf2c54769a23dd0d459e615c
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/tag/index.md
@@ -0,0 +1,253 @@
+# Tag 标签组件
+
+## 何时使用
+
+进行标记和分类的小标签。
+
+## 代码演示
+
+
+
+
+
基本
+
基本标签、link标签、带关闭按钮的标签
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tag } from 'inula-ui';
+
+const Demo1 = () => {
+ return (
+
+ );
+};
+
+export default Demo1;
+```
+
+
+
+
+
+
+
+
+
颜色
+
不同颜色的Tag
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tag } from 'inula-ui';
+
+const Demo2 = () => {
+ const colors = [
+ 'magenta',
+ 'red',
+ 'volcano',
+ 'orange',
+ 'gold',
+ 'lime',
+ 'green',
+ 'cyan',
+ 'blue',
+ 'geekblue',
+ 'purple',
+ ];
+
+ return (
+
+
+
Presets
+ {colors.map((c) => (
+
+ {c}
+
+ ))}
+
+
+
Custom
+
#2db7f5
+
#87d068
+
+
+ );
+};
+
+export default Demo2;
+```
+
+
+
+
+
+
+
+
+
增删tag
+
可以控制增加删减tag
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tag } from 'inula-ui';
+
+const Demo3 = () => {
+ let tags = ['Unremovable', 'Tag 2', '大家读'];
+ let newIndex = 1;
+
+ const handleClose = (removed) => {
+ tags = tags.filter((t) => t !== removed);
+ };
+
+ const addTag = () => {
+ const next = `New Tag ${newIndex++}`;
+ tags = [...tags, next];
+ };
+
+ return (
+
+ {tags.map((tag, i) => (
+ handleClose(tag)}>
+ {tag}
+
+ ))}
+
+ + New Tag
+
+
+ );
+};
+
+export default Demo3;
+```
+
+
+
+
+
+
+
+
+
CheckableTag
+
支持可以选中的Tag
+
+
+ 查看示例代码
+
+```jsx | pure
+import { CheckabelTag } from 'inula-ui';
+
+const Demo4 = () => {
+ let checked = [true, false, false, false];
+ const tags = ['Movies', 'Books', 'Music', 'Sports'];
+
+ return (
+
+ {tags.map((tag, i) => (
+ {
+ checked[i] = next;
+ }}
+ >
+ {tag}
+
+ ))}
+
+ );
+};
+
+export default Demo4;
+```
+
+
+
+
+
+## API
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| --------- | ---------------- | --------------- | -------------------------------- | ----------- |
+| color | 标签内置颜色 | `string` | `PRESET-COLORS` | `'default'` |
+| size | 标签大小 | `string` | `'small' \| 'default' \| 'large` | `'default'` |
+| icon | 自定义图标 | `node` | `- | - |
+| closable | 是否显示关闭按钮 | `boolean` | - | `false` |
+| bordered | 是否显示边框 | `boolean` | - | `true` |
+| round | 是否显示圆角 | `boolean` | - | `false` |
+| disabled | 是否禁用标签 | `boolean` | - | `false` |
+| onClose | 关闭回调 | `function(e)` | - | - |
+| onClick | 点击回调 | `function(e)` | - | - |
+| children | 卡片内容 | `node` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+| ...rest | 其他属性 | - | - | - |
+
+### CheckableTag
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| -------------- | ------------ | ------------- | ------ | ------- |
+| checked | 当前选中状态 | `boolean` | - | - |
+| defaultChecked | 默认选中 | `boolean` | - | `false` |
+| disabled | 是否禁用标签 | `boolean` | - | `false` |
+| onChange | 状态改变回调 | `function(e)` | - | - |
+| children | 卡片内容 | `node` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| ...rest | 其他属性 | - | - | - |
+
+说明:
+
+- `PRESET_COLORS`:[
+ 'magenta','red','volcano','orange','gold','lime','green','cyan','blue','geekblue','purple',
+ 'success','processing','warning','error','default'
+ ]
+- 当传入`checked`时 CheckableTag 为外部受控状态。
diff --git a/packages/inula2-ui/inulaUI/src/tree/index.md b/packages/inula2-ui/inulaUI/src/tree/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..c6f42006ba61a58e6c3307652dc5ca0e390273e8
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/src/tree/index.md
@@ -0,0 +1,506 @@
+# Tree 树形控件
+
+## 何时使用
+
+文件夹、组织架构、生物分类、国家地区等等,世间万物的大多数结构都是树形结构。使用`树控件`可以完整展现其中的层级关系,并具有展开收起选择等交互功能。
+
+## 代码演示
+
+
+
+
+
基本
+
基本的checkbox选中、select选中、展开收起
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tree } from 'inula-ui';
+
+const TreeDemo = () => {
+ const onSelect = (selectedKeys, info) => {
+ console.log('selected', selectedKeys, info);
+ };
+
+ const onCheck = (checkedKeys, info) => {
+ console.log('onCheck', checkedKeys, info);
+ };
+ const treeData = [
+ {
+ title: 'parent 1',
+ key: '0-0',
+ children: [
+ {
+ title: 'parent 1-0',
+ key: '0-0-0',
+ disabled: true,
+ children: [
+ {
+ title: 'leaf',
+ key: '0-0-0-0',
+ disableCheckbox: true,
+ },
+ {
+ title: 'leaf',
+ key: '0-0-0-1',
+ },
+ ],
+ },
+ {
+ title: 'parent 1-1',
+ key: '0-0-1',
+ children: [
+ {
+ title: sss,
+ key: '0-0-1-0',
+ },
+ ],
+ },
+ { title: 'parent 1-0', key: '0-0-2' },
+ ],
+ },
+ ];
+
+ return (
+
+ );
+};
+
+export default TreeDemo;
+```
+
+
+
+
+
+
+
+
+
受控示例
+
外部受控控制checkbox选择,select选中,展开收起
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tree } from 'inula-ui';
+
+const treeData = [
+ {
+ title: '0-0',
+ key: '0-0',
+ children: [
+ {
+ title: '0-0-0',
+ key: '0-0-0',
+ children: [
+ { title: '0-0-0-0', key: '0-0-0-0' },
+ { title: '0-0-0-1', key: '0-0-0-1' },
+ { title: '0-0-0-2', key: '0-0-0-2' },
+ ],
+ },
+ {
+ title: '0-0-1',
+ key: '0-0-1',
+ children: [
+ { title: '0-0-1-0', key: '0-0-1-0' },
+ { title: '0-0-1-1', key: '0-0-1-1' },
+ { title: '0-0-1-2', key: '0-0-1-2' },
+ ],
+ },
+ {
+ title: '0-0-2',
+ key: '0-0-2',
+ },
+ ],
+ },
+ {
+ title: '0-1',
+ key: '0-1',
+ children: [
+ { title: '0-1-0-0', key: '0-1-0-0' },
+ { title: '0-1-0-1', key: '0-1-0-1' },
+ { title: '0-1-0-2', key: '0-1-0-2' },
+ ],
+ },
+ {
+ title: '0-2',
+ key: '0-2',
+ },
+];
+
+const TreeDemo = () => {
+ let expandedKeys = ['0-0-0', '0-0-1'];
+ let checkedKeys = ['0-0-0'];
+ let selectedKeys = [];
+ let autoExpandParent = true;
+
+ const onExpand = (expandedKeysValue) => {
+ console.log('onExpand', expandedKeysValue);
+ expandedKeys = expandedKeysValue;
+ autoExpandParent = false;
+ };
+
+ const onCheck = (checkedKeysValue) => {
+ console.log('onCheck', checkedKeysValue);
+ checkedKeys = checkedKeysValue;
+ };
+
+ const onSelect = (selectedKeysValue, info) => {
+ console.log('onSelect', info);
+ selectedKeys = selectedKeysValue;
+ };
+
+ return (
+
+ );
+};
+
+export default TreeDemo;
+```
+
+
+
+
+
+
+
+
+
自定义图标、连接线
+
可以文字前图标和展开按钮图标,支持连接线
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tree, Icon } from 'inula-ui';
+
+const treeData1 = [
+ {
+ title: 'parent 1',
+ key: '0-0',
+ icon: ,
+ children: [
+ {
+ title: 'leaf',
+ key: '0-0-0',
+ icon: (
+
+ ),
+ },
+ {
+ title: 'leaf',
+ key: '0-0-1',
+ icon: ,
+ },
+ ],
+ },
+];
+
+const treeData2 = [
+ {
+ title: 'parent 1',
+ key: '0-0',
+ children: [
+ {
+ title: 'parent 1-0',
+ key: '0-0-0',
+ children: [
+ {
+ title: 'leaf',
+ key: '0-0-0-0',
+ },
+ {
+ title: 'leaf',
+ key: '0-0-0-1',
+ },
+ {
+ title: 'leaf',
+ key: '0-0-0-2',
+ },
+ ],
+ },
+ {
+ title: 'parent 1-1',
+ key: '0-0-1',
+ children: [
+ {
+ title: 'leaf',
+ key: '0-0-1-0',
+ },
+ ],
+ },
+ {
+ title: 'parent 1-2',
+ key: '0-0-2',
+ children: [
+ {
+ title: 'leaf',
+ key: '0-0-2-0',
+ },
+ {
+ title: 'leaf',
+ key: '0-0-2-1',
+ },
+ ],
+ },
+ ],
+ },
+];
+
+const TreeDemo = () => {
+ const onSelect = (selectedKeys, info) => {
+ console.log('selected', selectedKeys, info);
+ };
+ return (
+
+
+ }
+ treeData={treeData1}
+ />
+
+
+ }
+ defaultExpandedKeys={['0-0-0']}
+ onSelect={onSelect}
+ treeData={treeData2}
+ />
+
+
+ );
+};
+
+export default TreeDemo;
+```
+
+
+
+
+
+
+
+
+
异步加载
+
支持树控件异步加载。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tree } from 'inula-ui';
+
+const initTreeData = [
+ { title: 'Expand to load', key: '0' },
+ { title: 'Expand to load', key: '1' },
+ { title: 'Tree Node', key: '2', isLeaf: true },
+];
+
+const updateTreeData = (list, key, children) =>
+ list.map((node) => {
+ if (node.key === key) {
+ return {
+ ...node,
+ children,
+ };
+ }
+ if (node.children) {
+ return {
+ ...node,
+ children: updateTreeData(node.children, key, children),
+ };
+ }
+ return node;
+ });
+
+const TreeDemo = () => {
+ let treeData = initTreeData;
+
+ const onLoadData = ({ key, children }) =>
+ new Promise((resolve) => {
+ if (children) {
+ resolve();
+ return;
+ }
+ setTimeout(() => {
+ treeData = updateTreeData(treeData, key, [
+ { title: 'Child Node', key: `${key}-0` },
+ { title: 'Child Node', key: `${key}-1` },
+ ]);
+
+ resolve();
+ }, 1000);
+ });
+
+ return ;
+};
+
+export default TreeDemo;
+```
+
+
+
+
+
+
+
+
+
虚拟列表
+
数控件支持虚拟列表。
+
+
+ 查看示例代码
+
+```jsx | pure
+import { Tree } from 'inula-ui';
+
+const dig = (path = '0', level = 3) => {
+ const list = [];
+ for (let i = 0; i < 10; i += 1) {
+ const key = `${path}-${i}`;
+ const treeNode = {
+ title: key,
+ key,
+ };
+
+ if (level > 0) {
+ treeNode.children = dig(key, level - 1);
+ }
+
+ list.push(treeNode);
+ }
+ return list;
+};
+
+const treeData = dig();
+
+const TreeDemo = () => (
+ {
+ const title = item.title;
+ return {title};
+ }}
+ />
+);
+
+export default TreeDemo;
+```
+
+
+
+
+
+## API
+
+### Card
+
+| 属性 | 说明 | 类型 | 可选值 | 默认值 |
+| ------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------ | ------------------------------ |
+| autoExpandParent | 是否自动展开父节点 | `boolean` | - | `false` |
+| checkable | 是否显示复选框 | `boolean` | - | `false` |
+| checkedKeys | 受控选中复选框的树节点 | `string[] \| checkStrictly:{checked: string[], halfChecked: string[]}` | - | `[]` |
+| checkStrictly | 父子节点不再关联,完全受控 | `boolean` | - | `false` |
+| defaultCheckedKeys | 默认选中的树节点 | `string[]` | - | `[]` |
+| defaultExpandAll | 默认展开所有树节点 | `boolean` | - | `false` |
+| defaultExpandParent | 默认展开父节点 | `boolean` | - | `true` |
+| defaultExpandedKeys | 默认展开指定的树节点 | `string[]` | - | `[]` |
+| expandedKeys | 受控展开的树节点 | `string[]` | - | `[]` |
+| disabled | 禁用树 | `boolean` | - | `false` |
+| height | 设置虚拟滚动容器高度,设置后内部不再支持横向滚动 | `number` | - | - |
+| icon | 标题之前插入自定义图标,需设置 showIcon 为 true | `node` | - | - |
+| loadData | 异步加载数据,需设置 loadData 属性,返回 Promise 对象,返回值为树节点数据 | `function` | - | - |
+| loadedKeys | 受控已加载的树节点,用于控制异步加载,需配合 loadData 属性使用 | `string[]` | - | `[]` |
+| multiple | 是否支持多选 | `boolean` | - | `false` |
+| selectable | 是否支持选中,为 false 时点击为 check 选中 | `boolean` | - | `true` |
+| defaultSelectedKeys | 默认选中的树节点,多选需配合 multiple 属性使用 | `string[]` | - | `[]` |
+| selectedKeys | 受控选中的树节点,多选需配合 multiple 属性使用 | `string[]` | - | `[]` |
+| showIcon | 是否显示图标 | `boolean` | - | `false` |
+| showLine | 是否显示连接线 | `boolean` | - | `false` |
+| switcherIcon | 自定义展开图标 | `node` | - | - |
+| switcherLoadingIcon | 自定义加载中图标 | `node` | - | - |
+| titleRender | 自定义渲染节点 | `function` | - | - |
+| rootStyle | Tree 最外层 style | `CSSProperties` | - | - |
+| treeData | 树节点数据 | `array<{key, title, children, (disabled, selectable)}>` | - | - |
+| virtual | 是否开启虚拟滚动,设置 false 关闭虚拟滚动 | `boolean` | - | `false` |
+| onCheck | 点击复选框触发 | `function(e)` | - | - |
+| onExpand | 展开/收起节点时触发 | `function(e)` | - | - |
+| onLoad | 异步加载数据时触发 | `function(e)` | - | - |
+| onSelect | 选中/取消选中节点时触发 | `function(e)` | - | - |
+| className | 自定义类名 | `string` | - | - |
+| style | 行内样式 | `CSSProperties` | - | - |
+| ...rest | 其他属性 | - | - | - |
+
+说明:
+
+- `check、select、expand` 均支持受控。
+- 虚拟列表模式一定要设置`height`高度,不然不会生效。
diff --git a/packages/inula2-ui/inulaUI/tsconfig.json b/packages/inula2-ui/inulaUI/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a2788847d17d544d0e1772f2e33d2ce6f9d7fa4
--- /dev/null
+++ b/packages/inula2-ui/inulaUI/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "strict": true,
+ "declaration": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "jsx": "react",
+ "baseUrl": "./",
+ "paths": {
+ "@@/*": [".dumi/tmp/*"],
+ "inulaUI": ["src"],
+ "inulaUI/*": ["src/*", "*"]
+ },
+ "allowJs": true,
+ "checkJs": false
+ },
+ "include": [".dumirc.ts", "src/**/*"]
+}
diff --git a/packages/inula2-ui/library_code/.gitignore b/packages/inula2-ui/library_code/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..40d843311c3570c1273810abfdc6c5545a12fb62
--- /dev/null
+++ b/packages/inula2-ui/library_code/.gitignore
@@ -0,0 +1,17 @@
+# 依赖目录
+node_modules/
+.vscode/
+.idea/
+
+# 构建产物
+dist/
+build/
+*.log
+
+# 缓存文件
+.cache/
+*.tmp
+
+# 包管理器文件
+yarn.lock
+package-lock.json
diff --git a/packages/inula2-ui/library_code/index.html b/packages/inula2-ui/library_code/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..a8b784df1b86f7888422912ccf5d1ae2f0611dc0
--- /dev/null
+++ b/packages/inula2-ui/library_code/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+ Inula-Next
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/inula2-ui/library_code/package.json b/packages/inula2-ui/library_code/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d7678787f41efdb61316f48189d0391363b4c328
--- /dev/null
+++ b/packages/inula2-ui/library_code/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "inula-next-vite-app",
+ "private": true,
+ "version": "0.0.6",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@openinula/next": "^0.0.5"
+ },
+ "devDependencies": {
+ "@openinula/unplugin": "^0.0.2",
+ "vite": "^4.4.9"
+ },
+ "keywords": [
+ "inula-next"
+ ]
+}
diff --git a/packages/inula2-ui/library_code/src/colors.css b/packages/inula2-ui/library_code/src/colors.css
new file mode 100644
index 0000000000000000000000000000000000000000..e679d83d471aa7639d8fa1aa702f963d0dde93f9
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/colors.css
@@ -0,0 +1,65 @@
+:root {
+ /* 主要按钮颜色 */
+ --inula-color-primary: #1677ff;
+ --inula-color-primary-hover: #4096ff;
+ --inula-color-primary-active: #0958d9;
+
+ /* 默认按钮颜色 */
+ --inula-color-default-bg: #fff;
+ --inula-color-default-border: #d9d9d9;
+ --inula-color-default-text: #333;
+ --inula-color-default-hover-bg: #f0f7ff;
+ --inula-color-default-active-bg: #e6f4ff;
+
+ /* 虚线按钮颜色 */
+ --inula-color-dashed-border: #d9d9d9;
+
+ /* 文本按钮颜色 */
+ --inula-color-text: #1677ff;
+ --inula-color-text-hover-bg: #e6f4ff;
+ --inula-color-text-active-bg: #bae0ff;
+
+ /* 链接按钮颜色 */
+ --inula-color-link: #1677ff;
+ --inula-color-link-hover: #0958d9;
+
+ /* 危险按钮颜色 */
+ --inula-color-danger: #ff4d4f;
+ --inula-color-danger-bg: #fff1f0;
+ --inula-color-danger-hover-bg: #ff4d4f;
+ --inula-color-danger-hover-text: #fff;
+ --inula-color-danger-active-bg: #d9363e;
+
+ /* 幽灵按钮背景色 */
+ --inula-color-ghost-bg-hover: rgba(22, 119, 255, 0.08);
+ --inula-color-ghost-bg-active: rgba(22, 119, 255, 0.16);
+
+ /* 禁用状态颜色 */
+ --inula-color-disabled-bg: rgba(0,0,0,0.04);
+ --inula-color-disabled-text: rgba(0,0,0,0.25);
+ --inula-color-disabled-border: #d9d9d9;
+
+ /* 加载中 spinner 颜色 */
+ --inula-color-spinner: #ccc;
+ --inula-color-spinner-active: #1677ff;
+
+ /* demo 深色背景 */
+ --inula-demo-dark-bg: #222;
+
+ /* icon 默认颜色 */
+ --inula-icon-default: #555555;
+
+ /* indeterminate-checkbox */
+ --inula-checkbox-indeterminate-hover-bg: #4096ff;
+ --inula-checkbox-indeterminate-disabled-after: #b8b8b8;
+
+ /* switch */
+ --inula-switch-default-bg: #bfbfbf;
+ --inula-switch-default-hover-bg: #8c8c8c;
+
+ --inula-switch-checked-bg: #1677ff;
+ --inula-switch-checked-hover-bg: #4096ff;
+
+ --inula-switch-disabled-bg: #d5d5d5;
+ --inula-switch-checked-disabled-bg: #67a6ff;
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demo.jsx b/packages/inula2-ui/library_code/src/components/button/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..5c88846b4a1dc0bd9e7a938e585d6e9503276803
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demo.jsx
@@ -0,0 +1,22 @@
+import Button from './index.jsx';
+import demo1 from './demos/demo1.jsx';
+import demo2 from './demos/demo2.jsx';
+import demo3 from './demos/demo3.jsx';
+import demo4 from './demos/demo4.jsx';
+import demo5 from './demos/demo5.jsx';
+import demo6 from './demos/demo6.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..6cfa48925e6760dfd65add11461d63419f1c781f
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo1.jsx
@@ -0,0 +1,15 @@
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..318922e753f29f6d2b88c50e78f5dbff739ebd99
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo2.jsx
@@ -0,0 +1,15 @@
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..519b83e8426c7be4bde5cf2705c3bd8f45aff2d3
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo3.jsx
@@ -0,0 +1,13 @@
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+ );
+}
+export default ButtonDemo;
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..12bba8c5c3049d9cd5f0bd87f331579d7027cfd0
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo4.jsx
@@ -0,0 +1,16 @@
+
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..361e1d0cf8b02d254f3e0d03b13223b25f60f7f1
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo5.jsx
@@ -0,0 +1,16 @@
+
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+
+
+
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/demos/demo6.jsx b/packages/inula2-ui/library_code/src/components/button/demos/demo6.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..baefee358596bd769f410a48a7af894fb3bc664e
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/demos/demo6.jsx
@@ -0,0 +1,16 @@
+
+import Button from '../index.jsx';
+
+function ButtonDemo() {
+ let loading = false;
+ return (
+
+
+
+ );
+}
+export default ButtonDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/index.css b/packages/inula2-ui/library_code/src/components/button/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..c5ad9cfa1b5240cc80c74c4bcbc213075789f697
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/index.css
@@ -0,0 +1,231 @@
+.inula-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 14px;
+ padding: 0 16px;
+ height: 32px;
+ border-radius: 4px;
+ border: 1px solid var(--inula-color-default-border);
+ background: var(--inula-color-default-bg);
+ color: var(--inula-color-default-text);
+ cursor: pointer;
+ transition: all 0.2s;
+ outline: none;
+}
+
+/* 主按钮 */
+.inula-btn-primary {
+ background: var(--inula-color-primary);
+ border-color: var(--inula-color-primary);
+ color: #fff;
+}
+.inula-btn-primary:hover {
+ background: var(--inula-color-primary-hover);
+ border-color: var(--inula-color-primary-hover);
+ color: #fff;
+}
+.inula-btn-primary:active {
+ background: var(--inula-color-primary-active);
+ border-color: var(--inula-color-primary-active);
+ color: #fff;
+}
+
+/* 默认按钮 */
+.inula-btn-default {
+ background: var(--inula-color-default-bg);
+ border-color: var(--inula-color-default-border);
+ color: var(--inula-color-default-text);
+}
+.inula-btn-default:hover {
+ color: var(--inula-color-primary);
+ border-color: var(--inula-color-primary);
+ background: var(--inula-color-default-hover-bg);
+}
+.inula-btn-default:active {
+ background: var(--inula-color-default-active-bg);
+ border-color: var(--inula-color-primary);
+ color: var(--inula-color-primary);
+}
+
+/* 虚线按钮 */
+.inula-btn-dashed {
+ border-style: dashed;
+ background: var(--inula-color-default-bg);
+ border-color: var(--inula-color-dashed-border);
+ color: var(--inula-color-default-text);
+}
+.inula-btn-dashed:hover {
+ color: var(--inula-color-primary);
+ border-color: var(--inula-color-primary);
+ background: var(--inula-color-default-hover-bg);
+}
+.inula-btn-dashed:active {
+ background: var(--inula-color-default-active-bg);
+ border-color: var(--inula-color-primary);
+ color: var(--inula-color-primary);
+}
+
+/* 文本按钮 */
+.inula-btn-text {
+ background: none;
+ border: none;
+ color: var(--inula-color-text);
+ box-shadow: none;
+}
+.inula-btn-text:hover {
+ background: var(--inula-color-text-hover-bg);
+ color: var(--inula-color-primary-active);
+}
+.inula-btn-text:active {
+ background: var(--inula-color-text-active-bg);
+ color: var(--inula-color-primary-active);
+}
+
+/* 链接按钮 */
+.inula-btn-link {
+ background: none;
+ border: none;
+ color: var(--inula-color-link);
+ text-decoration: underline;
+ box-shadow: none;
+}
+.inula-btn-link:hover {
+ color: var(--inula-color-link-hover);
+ background: none;
+ text-decoration: underline;
+}
+.inula-btn-link:active {
+ color: var(--inula-color-link-hover);
+ background: none;
+}
+
+/* 危险按钮 */
+.inula-btn-danger {
+ color: var(--inula-color-danger);
+ border-color: var(--inula-color-danger);
+ background: var(--inula-color-danger-bg);
+}
+.inula-btn-danger:hover {
+ color: var(--inula-color-danger-hover-text);
+ background: var(--inula-color-danger-hover-bg);
+ border-color: var(--inula-color-danger-hover-bg);
+}
+.inula-btn-primary.inula-btn-danger {
+ background: var(--inula-color-danger);
+ color: #fff;
+ border-color: var(--inula-color-danger);
+}
+.inula-btn-primary.inula-btn-danger:hover {
+ background: var(--inula-color-danger-active-bg);
+ border-color: var(--inula-color-danger-active-bg);
+ color: #fff;
+}
+.inula-btn-primary.inula-btn-danger:active {
+ background: var(--inula-color-danger-active-bg);
+ border-color: var(--inula-color-danger-active-bg);
+ color: #fff;
+}
+
+/* 幽灵按钮基础样式 */
+.inula-btn-ghost {
+ background: transparent !important;
+ color: var(--inula-color-primary);
+ border: 1px solid var(--inula-color-primary);
+ box-shadow: none;
+}
+
+/* 幽灵主按钮 */
+.inula-btn-primary.inula-btn-ghost {
+ color: var(--inula-color-primary);
+ border-color: var(--inula-color-primary);
+ background: transparent;
+}
+.inula-btn-primary.inula-btn-ghost:hover {
+ color: var(--inula-color-primary-hover);
+ border-color: var(--inula-color-primary-hover);
+ background: var(--inula-color-ghost-bg-hover);
+}
+.inula-btn-primary.inula-btn-ghost:active {
+ color: var(--inula-color-primary-hover);
+ border-color: var(--inula-color-primary-hover);
+ background: var(--inula-color-ghost-bg-active);
+}
+
+/* 幽灵危险按钮 */
+.inula-btn-danger.inula-btn-ghost,
+.inula-btn-primary.inula-btn-danger.inula-btn-ghost {
+ color: var(--inula-color-danger);
+ border-color: var(--inula-color-danger);
+ background: transparent;
+}
+.inula-btn-danger.inula-btn-ghost:hover,
+.inula-btn-primary.inula-btn-danger.inula-btn-ghost:hover {
+ color: #fff;
+ background: var(--inula-color-danger);
+ border-color: var(--inula-color-danger);
+}
+.inula-btn-danger.inula-btn-ghost:active {
+ color: var(--inula-color-danger);
+ background: var(--inula-color-danger);
+ border-color: var(--inula-color-danger);
+}
+
+/* 幽灵默认按钮 */
+.inula-btn-default.inula-btn-ghost {
+ color: var(--inula-color-primary);
+ border-color: var(--inula-color-primary);
+ background: transparent;
+}
+.inula-btn-default.inula-btn-ghost:hover {
+ color: var(--inula-color-primary-hover);
+ border-color: var(--inula-color-primary-hover);
+ background: var(--inula-color-ghost-bg-hover);
+}
+.inula-btn-default.inula-btn-ghost:active {
+ color: var(--inula-color-primary-hover);
+ border-color: var(--inula-color-primary-hover);
+ background: var(--inula-color-ghost-bg-active);
+}
+
+/* 禁用 */
+.inula-btn-disabled,
+.inula-btn:disabled,
+.inula-btn-disabled:hover,
+.inula-btn:disabled:hover,
+.inula-btn-disabled:active,
+.inula-btn:disabled:active {
+ cursor: not-allowed;
+ opacity: 0.5;
+ background: var(--inula-color-disabled-bg) !important;
+ color: var(--inula-color-disabled-text) !important;
+ border-color: var(--inula-color-disabled-border) !important;
+ box-shadow: none !important;
+}
+
+/* 加载中 */
+.inula-btn-loading {
+ position: relative;
+}
+.inula-btn-spinner {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ border: 2px solid var(--inula-color-spinner);
+ border-top: 2px solid var(--inula-color-spinner-active);
+ border-radius: 50%;
+ animation: inula-spin 0.8s linear infinite;
+ margin-right: 8px;
+}
+@keyframes inula-spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+/* 幽灵按钮在深色背景下更明显 */
+.demo-dark-bg {
+ background: var(--inula-demo-dark-bg);
+ padding: 16px;
+ display: inline-block;
+ border-radius: 6px;
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/button/index.jsx b/packages/inula2-ui/library_code/src/components/button/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..98aab9a50403b3064015453c94cb42588d072e1b
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/button/index.jsx
@@ -0,0 +1,38 @@
+import { render } from '@openinula/next';
+import './index.css';
+
+const Button = ({
+ type = 'default', // primary, dashed, text, link
+ danger = false,
+ ghost = false,
+ disabled = false,
+ loading = false,
+ children,
+ onClick,
+ ...rest
+}) => {
+ const classNames = [
+ 'inula-btn',
+ `inula-btn-${type}`,
+ danger ? 'inula-btn-danger' : '',
+ ghost ? 'inula-btn-ghost' : '',
+ disabled ? 'inula-btn-disabled' : '',
+ loading ? 'inula-btn-loading' : '',
+ ].filter(Boolean).join(' ');
+
+ // console.log('Button props:', rest);
+
+ return (
+
+ );
+};
+
+export default Button;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/card/demo.jsx b/packages/inula2-ui/library_code/src/components/card/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..a8c0f9d2cff78bdec93d3fc5b6b76efc5e9245a4
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demo.jsx
@@ -0,0 +1,31 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+import demo4 from "./demos/demo4.jsx";
+const CardDemo = () => {
+ return (
+
+
+
基本样式
+
完整Card布局、边框样式、型号、hover效果
+
+
+
+
加载内容状态、嵌套Card样式
+
+
+
+
CardMeta组件
+
可定义头像、标题和介绍
+
+
+
+
CardGrid组件
+
网格布局内容组件,支持悬停浮空
+
+
+
+ )
+}
+
+export default CardDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/card/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/card/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7174e2567482a4fc71dc27a9dcb6a4b7f89a74e4
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demos/demo1.jsx
@@ -0,0 +1,63 @@
+import { Card } from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ return (
+
+
+ 完整Card布局
+
+
+ More
}
+ cover={
+

+ }
+ actions={actions}
+ >
+
Card content
+
Card content
+
Card content
+
+
+
+ 不同大小、边框、hover动效的Card
+
+
+
+ 默认型号,无hover动效
+
+
+ 小号,有hover动效
+
+
+
+ );
+};
+
+export default CardDemo;
diff --git a/packages/inula2-ui/library_code/src/components/card/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/card/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..490b8a6fa6e43dd32f6b29d153a03099ad8de6f1
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demos/demo2.jsx
@@ -0,0 +1,71 @@
+import { Card } from "../index.jsx";
+import Switch from "../../switch/index.jsx";
+import Icon from "../../icon/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ let loading = false;
+ return (
+
+
+ 定义加载内容状态的Card
+
+
+ More
}
+ cover={
+

+ }
+ actions={actions}
+ loading={loading}
+ >
+
Card content
+
Card content
+
Card content
+
+
+ {
+ loading = !loading;
+ }}
+ />
+ 点击切换内容加载状态
+
+
+ 嵌套Card样式
+
+
+ 放在Card下的Card组件样式
+
+
+
+ );
+};
+
+export default CardDemo;
diff --git a/packages/inula2-ui/library_code/src/components/card/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/card/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..e7f93ce7e697f2bc34e8243be6ff8b5652939fc8
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demos/demo3.jsx
@@ -0,0 +1,47 @@
+import { Card, CardMeta } from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const actions = [
+ ,
+ ,
+ ,
+];
+
+const CardDemo = () => {
+ return (
+
+
+ Meta组件,快速定义内容
+
+
+
+ }
+ actions={actions}
+ >
+
+ }
+ title="Card title"
+ description="This is the description"
+ />
+
+
+
+ );
+};
+
+export default CardDemo;
diff --git a/packages/inula2-ui/library_code/src/components/card/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/card/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..53b473f1ede82627313427f55fcdad235431526f
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demos/demo4.jsx
@@ -0,0 +1,82 @@
+import { Card, CardGrid } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const CardDemo = () => {
+ return (
+
+
+ Grid组件,网格型内嵌
+
+
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+ Content
+
+
+
+
+ );
+};
+
+export default CardDemo;
diff --git a/packages/inula2-ui/library_code/src/components/card/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/card/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4275518be117cd464a6cfeb2f861ed2c67b0fedf
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/demos/demo5.jsx
@@ -0,0 +1,101 @@
+import { Card } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const tabList = [
+ {
+ key: "tab1",
+ tab: "tab1",
+ },
+ {
+ key: "tab2",
+ tab: "tab2",
+ },
+];
+
+const contentList = {
+ tab1: content1
,
+ tab2: content2
,
+};
+
+const tabListNoTitle = [
+ {
+ key: "article",
+ label: "article",
+ },
+ {
+ key: "app",
+ label: "app",
+ },
+ {
+ key: "project",
+ label: "project",
+ },
+];
+
+const contentListNoTitle = {
+ article: article content
,
+ app: app content
,
+ project: project content
,
+};
+
+const CardDemo = () => {
+ let activeTabKey1 = "tab1";
+ let activeTabKey2 = "article";
+ const onTab1Change = (key) => {
+ activeTabKey1 = key;
+ };
+
+ const onTab2Change = (key) => {
+ activeTabKey2 = key;
+ };
+
+ return (
+
+
+ 两种传参方式的标签卡片
+
+
+ More}
+ tabList={tabList}
+ activeTabKey={activeTabKey1}
+ onTabChange={onTab1Change}
+ >
+ {contentList[activeTabKey1]}
+
+
+
+ More}
+ onTabChange={onTab2Change}
+ tabProps={{
+ size: "middle",
+ }}
+ >
+ {contentListNoTitle[activeTabKey2]}
+
+
+
+ );
+};
+
+export default CardDemo;
diff --git a/packages/inula2-ui/library_code/src/components/card/index.css b/packages/inula2-ui/library_code/src/components/card/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..35924246a80124c0abd548306e308b96590970b4
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/index.css
@@ -0,0 +1,214 @@
+/* --- Card --- */
+.inula-card {
+ display: flex;
+ flex-direction: column;
+ background-color: var(--inula-color-default-bg);
+}
+
+/* 悬停浮空效果*/
+.inula-card-hoverable:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ transform: scale(1.01);
+ transition: all 0.3s ease-in-out;
+}
+
+/* 卡片大小 */
+.inula-card.inula-card-default {
+ border-radius: 8px;
+ width: 300px;
+}
+
+.inula-card.inula-card-small {
+ border-radius: 8px;
+ width: 300px;
+}
+
+.inula-card.inula-card-gridbox {
+ width: 950px;
+}
+
+/* 卡片边框样式 */
+.inula-card.inula-card-outlined {
+ border: 1px solid #f0f0f0;
+}
+
+.inula-card.inula-card-borderless {
+ border: none;
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03),
+ 0 1px 6px -1px rgba(0, 0, 0, 0.02), 0 2px 4px 0 rgba(0, 0, 0, 0.02);
+}
+
+/* 卡片头部 */
+.inula-card-header {
+ min-height: 8px; /* 合56px */
+ padding: 24px;
+ font-size: 16px;
+ background-color: transparent;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.inula-card-header.inula-card-header-inner {
+ background-color: #fafafa;
+}
+
+.inula-card-header.inula-card-header-small {
+ padding: 12px;
+ font-size: 14px;
+}
+
+.inula-card-header-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.inula-card-header-content .inula-card-header-title {
+ font-weight: bold;
+}
+
+.inula-card-header-content .inula-card-header-extra {
+ color: rgba(0, 0, 0, 0.88);
+}
+
+/* 卡片封面 */
+.inula-card-cover {
+ width: 100%;
+ height: auto;
+ overflow: hidden;
+}
+
+.inula-card-cover img {
+ width: 100%;
+ height: auto;
+ object-fit: cover;
+}
+
+/* 卡片内容 */
+.inula-card-body {
+ width: calc(100% - 48px);
+ min-height: 8px;
+ padding: 24px;
+}
+
+.inula-card-body.inula-card-body-small {
+ padding: 12px;
+}
+
+.inula-card-body.inula-card-body-gridbox {
+ display: flex;
+ flex-wrap: wrap;
+ width: 100% !important;
+ padding: 0 !important;
+}
+
+/* 卡片加载中状态 */
+.inula-card-loading {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ width: 100%;
+ height: 100px;
+}
+
+.inula-card-loading-spinner {
+ display: flex;
+ gap: 8px;
+ width: 80px;
+ height: 20px;
+}
+
+.loading-bar {
+ width: 100%;
+ height: 15px;
+ background: linear-gradient(90deg, #f0f0f0 0%, #bfbfbf 50%, #f0f0f0 100%);
+ background-size: 200% 100%;
+ animation: loading 2s infinite linear;
+ border-radius: 4px;
+}
+
+@keyframes loading {
+ 0% {
+ background-position: 100% 0;
+ }
+ 50% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: -100% 0;
+ }
+}
+
+/* 卡片底部操作栏 */
+.inula-card-actions {
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ min-height: 56px;
+ border-top: 1px solid #f0f0f0;
+}
+
+.inula-card-actions-item {
+ position: relative;
+}
+
+.inula-card-actions-item:not(:last-child)::after {
+ content: "";
+ position: absolute;
+ right: -1px;
+ height: 100%;
+ width: 1px;
+ background-color: rgba(0, 0, 0, 0.1);
+}
+
+/* --- CardMeta --- */
+.inula-card-meta {
+ display: flex;
+ gap: 12px;
+ width: 100%;
+}
+
+.inula-card-meta-avatar {
+ width: 32px;
+ height: 32px;
+ border-radius: 100%;
+}
+
+.inula-card-meta-avatar img {
+ width: 100%;
+ height: 100%;
+ border-radius: 100%;
+ object-fit: cover;
+}
+
+.inula-card-meta-content {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 8px;
+}
+
+.inula-card-meta-title {
+ font-size: 16px;
+ font-weight: bold;
+}
+
+.inula-card-meta-description {
+ color: rgba(0, 0, 0, 0.45);
+}
+
+/* --- CardGrid --- */
+.inula-card-grid {
+ height: 64px;
+ border: 1px solid #f0f0f0;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.inula-card-grid-hoverable:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ transform: scale(1.01);
+ transition: all 0.3s ease-in-out;
+}
diff --git a/packages/inula2-ui/library_code/src/components/card/index.jsx b/packages/inula2-ui/library_code/src/components/card/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..a08d70fcfbee49d9d07426a16d594effa41c21b8
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/card/index.jsx
@@ -0,0 +1,168 @@
+import "./index.css";
+
+const Card = ({
+ type = "default",
+ size = "default", // small, default
+ loading = false,
+ variant = "outlined", // outlined, borderless
+ hoverable = false, //悬停浮空
+ gridbox = false, //网格布局, 只有children全为CardGrid时才能传入true
+ tabList,
+ tabProps,
+ activeTabKey,
+ defaultActiveTabKey,
+ onTabChange,
+ title,
+ extra,
+ cover,
+ actions,
+ children,
+ className,
+ style,
+ ...rest
+}) => {
+ let isShowHeader = title || extra || tabList; // 是否显示头部
+
+ const classNames = [
+ "inula-card",
+ `inula-card-${type}`, // 卡片类型,默认为default
+ `inula-card-${size}`, // 卡片大小,默认为default
+ `inula-card-${variant}`, // 卡片变体,默认为outlined
+ hoverable && "inula-card-hoverable", // 悬停
+ gridbox && "inula-card-gridbox", // 网格布局
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const bodyClassName = [
+ "inula-card-body",
+ `inula-card-body-${size}`,
+ gridbox && "inula-card-body-gridbox",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const headerClassName = [
+ "inula-card-header",
+ `inula-card-header-${size}`,
+ `inula-card-header-${type}`,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const styles = {
+ ...style,
+ };
+
+ const CardHeader = () => {
+ if (!isShowHeader) return <>>;
+ return (
+
+
+ {title &&
{title}
}
+ {extra &&
{extra}
}
+
+
+ );
+ };
+
+ const CardLoading = () => {
+ return (
+
+ {/* 四个加载条容器 */}
+ {[...Array(4)].map((_, i) => (
+
+ ))}
+
+ );
+ };
+
+ return (
+
+
+ {cover && (
+
+ {cover}
+
+ )}
+
+ {loading ? : children}
+
+ {actions && (
+
+ {actions.map((action, index) => (
+
+ {action}
+
+ ))}
+
+ )}
+
+ );
+};
+
+const CardMeta = ({
+ avatar,
+ title,
+ description,
+ className,
+ style,
+ ...rest
+}) => {
+ const classNames = ["inula-card-meta", className].filter(Boolean).join(" ");
+ const styles = {
+ ...style,
+ };
+ return (
+
+ {avatar &&
{avatar}
}
+
+ {title &&
{title}
}
+ {description && (
+
{description}
+ )}
+
+
+ );
+};
+
+const CardGrid = ({
+ hoverable = true,
+ className,
+ style,
+ children,
+ ...rest
+}) => {
+ const classNames = [
+ "inula-card-grid",
+ hoverable && "inula-card-grid-hoverable",
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+ const styles = {
+ ...style,
+ };
+ return (
+
+ {children}
+
+ );
+};
+
+export { Card, CardMeta, CardGrid };
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/demo.jsx b/packages/inula2-ui/library_code/src/components/checkbox/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..dc0a92ca6e71736c821fa35cce8d709238c42762
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/demo.jsx
@@ -0,0 +1,27 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+
+const CheckboxDemo = () => {
+ return (
+
+
+
基本Checkbox
+
选中、默认选中、禁用、indeterminate样式
+
+
+
+
CheckboxGroup
+
选中、默认选中、禁用、外部受控
+
+
+
+
案例
+
区分全不选、部分选、全选的复选框案例
+
+
+
+ )
+}
+
+export default CheckboxDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..8d3816c9d297d3242f4e06c2727d166e24490f21
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo1.jsx
@@ -0,0 +1,57 @@
+import { Checkbox } from "../index.jsx";
+
+const CheckboxDemo = () => {
+ return (
+
+
+ 基本状态
+ 普通Checkbox
+ 选中
+ 默认选中
+
+
+ indeterminate复选框样式
+ indeterminate按钮
+
+ indeterminate选中
+
+
+
+ 禁用状态
+ 禁用未选中
+
+ 禁用选中
+
+
+ 禁用默认选中
+
+
+ indeterminate按钮禁用
+
+
+
+ );
+};
+
+export default CheckboxDemo;
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..5d62408266eccd8c0db3a6d3247cebdb87045feb
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo2.jsx
@@ -0,0 +1,60 @@
+import { CheckboxGroup } from "../index.jsx";
+
+const CheckboxDemo = () => {
+ let checkedList = ["Apple", "Pear"];
+
+ const options = [
+ { label: "Apple", value: "Apple", disabled: true },
+ { label: "Pear", value: "Pear" },
+ { label: "Orange", value: "Orange" },
+ ];
+
+ const onChange = (list) => {
+ checkedList = list;
+ };
+
+ return (
+
+
+ 定义默认选中和选中:
+
+
+
+ 只定义默认选中:
+
+
+
+ 只定义选中:
+
+
+
+ 全禁用:
+
+
+
+ 外部受控:
+
+
+
+ );
+};
+
+export default CheckboxDemo;
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..af09c301c08b2c83c564456b200953a58b75bc98
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/demos/demo3.jsx
@@ -0,0 +1,29 @@
+import { Checkbox, CheckboxGroup } from "../index.jsx";
+
+const plainOptions = ['Apple', 'Pear', 'Orange'];
+const defaultCheckedList = ['Apple', 'Orange'];
+
+const CheckboxDemo = () => {
+ let checkedList = defaultCheckedList;
+ let checkAll = plainOptions.length === checkedList.length;
+ let indeterminate = checkedList.length > 0 && checkedList.length < plainOptions.length;
+
+ const onChange = (list) => {
+ checkedList = list;
+ };
+
+ const onCheckAllChange = (e) => {
+ checkedList = e.target.checked ? plainOptions : [];
+ };
+
+ return (
+
+
+ Check all
+
+
+
+ );
+};
+
+export default CheckboxDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/index.css b/packages/inula2-ui/library_code/src/components/checkbox/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..f60a1797e14fe1705ddb925a5cc0fc0a5df0501d
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/index.css
@@ -0,0 +1,128 @@
+/* checkbox */
+.inula-checkbox {
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ font-size: 14px;
+ gap: 8px;
+}
+
+/* 禁用样式 */
+.inula-checkbox-input-disabled {
+ cursor: not-allowed !important;
+ background-color: var(--inula-color-disabled-bg) !important;
+ color: var(--inula-color-disabled-text) !important;
+ border: 1px solid var(--inula-color-disabled-border) !important;
+}
+
+.inula-checkbox-disabled {
+ color: var(--inula-color-disabled-text) !important;
+}
+
+/* 普通checkbox样式 */
+.inula-checkbox-input {
+ width: 18px;
+ height: 18px;
+ border-radius: 4px;
+
+ /* 清除默认样式 */
+ outline: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ padding: 0px;
+ margin: 0px;
+
+ cursor: pointer;
+ border: 1px solid var(--inula-color-default-border);
+ background-color: var(--inula-color-default-bg);
+ color: white;
+}
+
+.inula-checkbox-input:checked {
+ background: var(--inula-color-primary);
+ position: relative;
+}
+
+.inula-checkbox-input:checked::after {
+ content: "\f00c"; /* Font Awesome check图标 */
+ font-family: "Font Awesome 6 Free";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ /* color: white; */
+ font-weight: 900;
+}
+
+/* indeterminate checkbox样式 */
+.inula-checkbox-indeterminate {
+ position: relative;
+ background: var(--inula-color-default-bg);
+ transition: background 0.3s ease;
+}
+
+/* indeterminate状态移除选中背景色 */
+.inula-checkbox-indeterminate:checked {
+ background: var(--inula-color-default-bg)!important;
+}
+
+/* indeterminate状态移除图标 */
+.inula-checkbox-indeterminate:checked::after {
+ content: "" !important;
+}
+
+/* indeterminate 伪元素样式 */
+.inula-checkbox-indeterminate::after {
+ content: "";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ width: 8px;
+ height: 8px;
+ background: var(--inula-color-primary);
+ transform: translate(-50%, -50%);
+}
+
+/* indeterminate hover */
+.inula-checkbox-indeterminate:hover {
+ background: var(--inula-checkbox-indeterminate-hover-bg) !important;
+}
+
+/* indeterminate active */
+.inula-checkbox-indeterminate:active {
+ animation: indeterminate-expand 0.3s ease-out;
+}
+
+@keyframes indeterminate-expand {
+ 0% {
+ box-shadow: 0 0 0 0 rgba(64, 135, 255, 0.8);
+ }
+ 100% {
+ box-shadow: 0 0 0 12px rgba(64, 135, 255, 0);
+ }
+}
+
+
+/* indeterminate 禁用 */
+.inula-checkbox-indeterminate-disabled:hover {
+ background: var(--inula-color-disabled-bg)!important;
+}
+
+.inula-checkbox-indeterminate-disabled::after {
+ background: var(--inula-checkbox-indeterminate-disabled-after);
+}
+
+.inula-checkbox-indeterminate-disabled:active {
+ animation: none;
+}
+
+/* checkboxgroup */
+.inula-checkbox-group {
+ display: flex;
+ gap: 10px;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ align-items: center;
+ justify-content: flex-start;
+}
diff --git a/packages/inula2-ui/library_code/src/components/checkbox/index.jsx b/packages/inula2-ui/library_code/src/components/checkbox/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..da0afd99e5d6df3cf847c926aac5bacfb62e7211
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/checkbox/index.jsx
@@ -0,0 +1,129 @@
+import "./index.css";
+
+const Checkbox = ({
+ // autoFocus = false,
+ defaultChecked = false,
+ disabled = false,
+ indeterminate = false,
+ children,
+ checked,
+ className,
+ style,
+ onChange,
+ onBlur,
+ onFocus,
+ ...rest
+}) => {
+
+ const handleBoxChange = (e) => {
+ if (checked !== undefined) {
+ e.target.checked = checked;
+ onChange && onChange(e);
+ return;
+ }
+ if (onChange) {
+ onChange(e);
+ }
+ };
+
+ const classNames = [
+ className,
+ "inula-checkbox",
+ disabled ? "inula-checkbox-disabled" : "",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const inputClassNames = [
+ "inula-checkbox-input",
+ indeterminate ? "inula-checkbox-indeterminate" : "",
+ disabled ? "inula-checkbox-input-disabled" : "",
+ indeterminate && disabled ? "inula-checkbox-indeterminate-disabled" : "",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const styles = {
+ ...style,
+ ...(disabled && { cursor: "not-allowed" }),
+ };
+
+ return (
+
+ );
+};
+
+const CheckboxGroup = ({
+ defaultValue = [], // [value1, value2,...]
+ disabled = false,
+ options, // [{value, label, disabled, ...}]
+ value, // [value1, value2,...]
+ className,
+ style,
+ onChange,
+ ...rest
+}) => {
+ let checkedValues = value || defaultValue || [];
+
+ const handleBoxChange = (targetValue) => {
+ if (value) {
+ onChange && onChange(targetValue);
+ return;
+ }
+ if (checkedValues.includes(targetValue)) {
+ checkedValues = checkedValues.filter((item) => item !== targetValue);
+ } else {
+ checkedValues = [...checkedValues, targetValue];
+ }
+ if (onChange) {
+ onChange(checkedValues);
+ }
+ };
+
+ const classNames = ["inula-checkbox-group", className]
+ .filter(Boolean)
+ .join(" ");
+
+ const styles = {
+ ...style,
+ };
+
+ const normalizedOptions = options.map((option) =>
+ typeof option === "string" ? { value: option, label: option } : option
+ );
+
+ return (
+
+
+ {(option, index) => {
+ return (
+ handleBoxChange(option.value)}
+ className={option.className || ""}
+ style={option.style || {}}
+ >
+ {option.label}
+
+ );
+ }}
+
+
+ );
+};
+
+export { Checkbox, CheckboxGroup };
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demo.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1cd5f817a9357bf9efc824a1cf3046969065ea2e
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demo.jsx
@@ -0,0 +1,85 @@
+import Demo1 from "./demos/demo1.jsx";
+import Demo2 from "./demos/demo2.jsx";
+import Demo3 from "./demos/demo3.jsx";
+import Demo4 from "./demos/demo4.jsx";
+import Demo5 from "./demos/demo5.jsx";
+import Demo6 from "./demos/demo6.jsx";
+
+function DatePickerDemo() {
+ return (
+
+
+
+
基础用法
+
最简单的用法,在浮层中可以选择或者输入日期。
+
+
+
+
+
+
+ {/*
+
+
日期范围选择器
+
通过设置 picker 属性,指定范围选择器类型。
+
+
+
+
+
+
+
+
+
基础选择器回调受控
+
测试回调函数和受控实现
+
+
+
+
+
+
+
+
+
rangePicker
+
+ 可以通过picker改变选择器功能,size分为大中小,支持禁用、支持varient变体,status状态。
+
+
+
+
+
+
+
+
+
+
rangepikcer进阶
+
+ 图标自定义,自定义defaultValue、defaultPickerValue,format,时期范围限定
+
+
+
+
+
+
+
+
+
+
range选择器回调受控
+
测试回调函数和受控实现
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..60e4ec9b438814e33b1e978af679ee9dfba29fbb
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo1.jsx
@@ -0,0 +1,97 @@
+import { DatePicker } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function Demo1() {
+ const handleChange = (value) => {
+ console.log("选择的值:", value);
+ };
+
+ return (
+
+
+ 五种picker基本日期选择器
+
+
+
+
+
+
+
+
+ 不同尺寸日期选择器
+
+
+
+
+
+
+ 禁用状态基本日期选择器
+
+
+
+
+ 四种varient变体基本选择器
+
+
+
+
+
+
+
+ 两种status基本日期选择器
+
+
+
+
+ );
+}
+
+export default Demo1;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..b2f0ba44f70e18cea2f1887432eaaaf27f6153a8
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo2.jsx
@@ -0,0 +1,100 @@
+import { DatePicker } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+import Icon from "../../icon/index.jsx";
+
+function DatePickerDemo() {
+ return (
+
+
+ 需要确认的日期选择器
+
+
+
+
+
+
+
+
+ showNow控制今天按钮显示
+
+
+
+
+ 自定义prefix,suffixIcon图标
+ }
+ placeholder="prefix"
+ />
+ }
+ placeholder="suffixIcon"
+ />
+
+
+
+ 自定义日历title切换图标
+ }
+ style={{ width: 200 }}
+ placeholder="prevIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="nextIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="superPrevIcon"
+ placement="topLeft"
+ />
+ }
+ style={{ width: 200 }}
+ placeholder="superNextIcon"
+ placement="topLeft"
+ />
+
+
+ );
+}
+
+export default DatePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..9f86eb25e604fdbf0abe7124991fe591b46ba855
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo3.jsx
@@ -0,0 +1,73 @@
+import { DatePicker } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function DatePickerDemo() {
+ return (
+
+
+ 日期默认值
+
+
+
+
+
+
+
+
+ calendar浮窗面板默认值
+
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..55ef2e56cca619b0dfbffd707be63db397e926aa
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo4.jsx
@@ -0,0 +1,59 @@
+import { DatePicker } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function DatePickerDemo() {
+ return (
+
+ 范围和选中限制
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..29bcef0bf3423839f91d6b3fbd28e97af6779f1b
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo5.jsx
@@ -0,0 +1,161 @@
+import { DatePicker } from "../index.jsx";
+import Button from "../../button/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function DatePickerDemo() {
+ let open = false;
+ let defaultOpen = false;
+ let placement = "bottomLeft";
+ let picker = "date";
+ let size = "default";
+
+ const handleControllOpenChange = (isOpen) => {
+ open = !isOpen;
+ };
+
+ const handleChange = (value) => {
+ console.log("选择的值:", value);
+ };
+
+ const handleOpenChange = (isOpen) => {
+ console.log(isOpen);
+ };
+
+ const handlePanleChange = (value, mode) => {
+ console.log(value, mode);
+ };
+
+ const handleClickOk = (value) => {
+ console.log("ok", value);
+ };
+
+ const onBlur = () => {
+ console.log(111);
+ };
+
+ const onFocus = () => {
+ console.log(111);
+ };
+
+ return (
+
+
+
+ 回调函数示例
+
+
+
+
+
+
+
+
+
+
+
+
+ 日历弹出位置控制
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default DatePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo6.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo6.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..99db9edce0e737e25346adc3fceaf36212608206
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo6.jsx
@@ -0,0 +1,143 @@
+import { RangePicker } from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function RangePickerDemo() {
+ const handleChange = (value) => {
+ console.log("选择的值:", value);
+ };
+
+ return (
+
+
+
+ 五种picker-range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 三种size-range日期选择器
+
+
+
+
+
+
+
+
+
+
+ 禁用状态range日期选择器
+
+
+
+
+
+
+
+
+ 四种varient-range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+ 两种status-range日期选择器
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo7.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo7.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..c5e1f51d74086873cbedf2ce7a5f565ac1ca50cc
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo7.jsx
@@ -0,0 +1,199 @@
+import { RangePicker } from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function RangePickerDemo() {
+ const handleChange = (value) => {
+ console.log("选择的值:", value);
+ };
+
+ return (
+
+
+
+ 需要确认的rang日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义前后缀图标和title切换图标的range日期选择器
+
+
+ }
+ placeholder="prefix"
+ />
+ }
+ placeholder="suffixIcon"
+ />
+ }
+ placeholder="prevIcon"
+ />
+ }
+ placeholder="nextIcon"
+ />
+ }
+ placeholder="superPrevIcon"
+ />
+ }
+ placeholder="superNextIcon"
+ />
+
+
+
+
+
+ 带defaultValue的range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+ 带日期范围限制的range日期选择器
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo8.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo8.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..d01819ea450fc7e7d2ba9306d993a1619c6baf44
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/demos/demo8.jsx
@@ -0,0 +1,183 @@
+import { RangePicker } from "../index.jsx";
+import Button from "../../button/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+function RangePickerDemo() {
+ let open = false;
+ let defaultOpen = false;
+ let placement = "bottomLeft";
+ let picker = "date";
+ let size = "default";
+
+ const handleControllOpenChange = (isOpen) => {
+ open = !isOpen;
+ };
+
+ const handleChange = (value) => {
+ console.log("选择的值:", value);
+ };
+
+ const handleOpenChange = (isOpen) => {
+ console.log(isOpen);
+ };
+
+ const handlePanleChange = (value, mode) => {
+ console.log(value, mode);
+ };
+
+ const handleClickOk = (value) => {
+ console.log("ok", value);
+ };
+
+ const onBlur = () => {
+ console.log(111);
+ };
+
+ const onFocus = () => {
+ console.log(111);
+ };
+
+ return (
+
+
+
+ 自定义回调函数的range日期选择器
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 控制日历弹出位置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default RangePickerDemo;
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/index.css b/packages/inula2-ui/library_code/src/components/datepicker2/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..514dace2bc2c9c701eca7bce275ae8dd5cea73b6
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/index.css
@@ -0,0 +1,599 @@
+.inula-datepicker {
+ position: relative;
+}
+
+/* 输入框样式 */
+.inula-datepicker-input-contiainer {
+ position: relative;
+}
+
+/* 普通输入框 */
+.inula-datepicker-input {
+ width: 112px;
+ height: 24px;
+ border-radius: 6px;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+
+ padding: 4px 11px;
+
+ font-size: 14px;
+ line-height: 24px;
+}
+
+.inula-datepicker-input:hover {
+ border-color: #1677ff;
+}
+
+.inula-datepicker-input:focus {
+ border-color: #1677ff;
+ outline: none;
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.2);
+}
+
+.inula-datepicker-input-icon {
+ position: absolute;
+ right: 8px;
+ top: 16px;
+ transform: translateY(-50%);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.inula-datepicker-input-icon .clear {
+ width: 14px;
+ height: 14px;
+ border-radius: 50%;
+ background-color: rgba(0, 0, 0, 0.45);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ cursor: pointer;
+}
+
+/* 禁用态 */
+.inula-datepicker-input-disabled,
+.inula-datepicker-input-disabled:hover {
+ background-color: #f5f5f5;
+ border-color: rgba(0, 0, 0, 0.08);
+ color: rgba(0, 0, 0, 0.25);
+ cursor: not-allowed;
+}
+
+.icon-disabled .inula-icon:hover {
+ cursor: not-allowed !important;
+}
+
+/* 小尺寸 */
+.inula-datepicker-input-small {
+ width: 112px;
+ height: 24px;
+ font-size: 12px;
+ line-height: 20px;
+ padding: 0 7px;
+
+ font-size: 12px;
+}
+
+.inula-datepicker-input-small + .inula-datepicker-input-icon .inula-icon {
+ font-size: 12px !important;
+}
+
+.inula-datepicker-input-small + .inula-datepicker-input-icon .clear {
+ width: 12px;
+ height: 12px;
+}
+
+.inula-datepicker-input-small + .inula-datepicker-input-icon {
+ top: 13px;
+}
+
+/* 大尺寸 */
+.inula-datepicker-input-large {
+ width: 112px;
+ height: 24px;
+ font-size: 16px;
+ line-height: 32px;
+ padding: 7px 11px;
+
+ font-size: 16px;
+}
+
+.inula-datepicker-input-large + .inula-datepicker-input-icon .inula-icon {
+ font-size: 16px !important;
+}
+
+.inula-datepicker-input-large + .inula-datepicker-input-icon .clear {
+ width: 20px;
+ height: 20px;
+}
+
+.inula-datepicker-input-large + .inula-datepicker-input-icon {
+ top: 20px;
+}
+
+/* variant线条边框样式 */
+/* filled */
+.inula-datepicker-input.inula-datepicker-input-filled {
+ border: 1px solid transparent;
+ background-color: #f0f0f0;
+}
+
+.inula-datepicker-input.inula-datepicker-input-filled:focus {
+ border: 1px solid #1677ff;
+ outline: none;
+ box-shadow: none;
+}
+
+/* bordless */
+.inula-datepicker-input.inula-datepicker-input-borderless {
+ border: none;
+}
+
+.inula-datepicker-input.inula-datepicker-input-borderless:focus {
+ outline: none;
+ box-shadow: none;
+}
+
+/* underline */
+.inula-datepicker-input.inula-datepicker-input-underline {
+ border: 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.25);
+ border-radius: 0;
+}
+
+.inula-datepicker-input.inula-datepicker-input-underline:focus {
+ border-color: #1677ff;
+ outline: none;
+ box-shadow: none;
+}
+
+/* status 状态样式 */
+/* error */
+.inula-datepicker-input.inula-datepicker-input-error {
+ border: 1px solid #ff4d4f;
+}
+
+.inula-datepicker-input.inula-datepicker-input-error:hover {
+ border-color: #ffa39e;
+}
+
+.inula-datepicker-input.inula-datepicker-input-error:focus {
+ box-shadow: 0 0 0 2px rgba(255, 38, 5, 0.06);
+}
+
+.inula-datepicker-input.inula-datepicker-input-error
+ + .inula-datepicker-input-icon
+ .inula-icon {
+ color: #ff4d4f !important;
+}
+
+/* 不改变清除按钮颜色 */
+.inula-datepicker-input.inula-datepicker-input-error
+ + .inula-datepicker-input-icon
+ .clear
+ .inula-icon {
+ color: #fff !important;
+}
+
+/* warning */
+.inula-datepicker-input.inula-datepicker-input-warning {
+ border: 1px solid #faad14;
+}
+
+.inula-datepicker-input.inula-datepicker-input-warning:hover {
+ border-color: #ffd666;
+}
+
+.inula-datepicker-input.inula-datepicker-input-warning:focus {
+ box-shadow: 0 0 0 2px rgba(255, 215, 5, 0.1);
+}
+
+.inula-datepicker-input.inula-datepicker-input-warning
+ + .inula-datepicker-input-icon
+ .inula-icon {
+ color: #faad14 !important;
+}
+
+.inula-datepicker-input.inula-datepicker-input-warning
+ + .inula-datepicker-input-icon
+ .clear
+ .inula-icon {
+ color: #fff !important;
+}
+
+/* RangePicker */
+.inula-datepicker-input-container.range-container {
+ width: 300px;
+}
+
+.inula-datepicker-input.range-input {
+ width: 45%;
+}
+
+/* 日历样式 */
+.inula-calendar {
+ position: absolute;
+ z-index: 100;
+ top: 33px;
+
+ width: 287x !important;
+ background-color: #fff;
+
+ display: flex;
+ flex-direction: column;
+
+ border-radius: 6px;
+ box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+ 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+}
+
+.inula-calendar.closed {
+ display: none;
+}
+
+/* 日历头部样式 */
+.inula-calendar-header {
+ width: calc(100% - 8px);
+ height: 32px;
+
+ padding: 4px;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+
+.inula-calendar-header-title {
+ font-size: 14px;
+ font-weight: bold;
+ color: rgba(0, 0, 0, 0.88);
+}
+
+.range-title.inula-calendar-header-title {
+ width: 65%;
+ display: flex;
+ justify-content: space-between;
+}
+
+/* 左右切换箭头 */
+.inula-calendar-header-left {
+ display: flex;
+ gap: 7px;
+ margin-left: 8px;
+}
+
+.inula-calendar-header-left .inula-icon:hover {
+ cursor: pointer;
+ color: rgba(0, 0, 0, 0.88) !important;
+}
+
+.inula-calendar-header-right {
+ display: flex;
+ gap: 7px;
+ margin-right: 8px;
+}
+
+.inula-calendar-header-right .inula-icon:hover {
+ cursor: pointer;
+ color: rgba(0, 0, 0, 0.88) !important;
+}
+
+/* 日历内容样式 */
+.inula-calendar-content {
+ width: calc(100% - 21px);
+ padding: 10.5px;
+ display: grid;
+ grid-template-columns: repeat(var(--grid-columns), 1fr);
+}
+
+/* rangpicker */
+.inula-calendar-range-content {
+ display: flex;
+}
+
+/*
+
+item通用样式
+
+*/
+/* 容器 */
+.item-container {
+ width: 36px;
+ height: px;
+
+ margin: 6px 0;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ position: relative;
+
+ transition: all 0.1s ease-in-out;
+}
+
+.item-container::before {
+ content: "";
+
+ width: 100%;
+ height: 6px;
+
+ position: absolute;
+ top: -6px;
+}
+
+.item-container::after {
+ content: "";
+
+ width: 100%;
+ height: 6px;
+
+ position: absolute;
+ bottom: -6px;
+}
+
+/*
+
+日期选择器、周选择器共用
+
+*/
+/* 星期标签item */
+.inula-calendar-content-weekday {
+ height: 32px;
+ line-height: 32px;
+ text-align: center;
+}
+
+/* 今天选中样式 */
+.inula-calendar-content-date-item.inula-calendar-content-date-item-today {
+ border: 1px solid #1677ff;
+ box-sizing: border-box;
+}
+
+/*
+通用hover样式,week特殊
+
+*/
+/* 容器 */
+.item-container:not(.week-container):hover {
+ cursor: pointer;
+}
+
+/* item本身 */
+.inula-calendar-content-date-item {
+ height: 24px;
+ width: 24px;
+ margin: 5px 7px;
+ border-radius: 6px;
+
+ font-size: 14px;
+ text-align: center;
+ line-height: 24px;
+
+ transition: all 0.3s ease-in-out;
+}
+
+/* item本身,selected时不生效 */
+.item-container:not(.week-container):hover
+ .inula-calendar-content-date-item:not(
+ .inula-calendar-content-date-item-selected
+ ) {
+ background-color: #f5f5f5;
+ cursor: pointer;
+}
+
+/* rangepicker的hover样式 */
+.inula-calendar-content.inula-range-calendar-content
+ .item-container:not(.week-container, .item-container-disabled):hover
+ .inula-calendar-content-date-item:not(
+ .inula-calendar-content-date-item-notThisTitleRange
+ ) {
+ color: #fff;
+ background-color: #1677ff;
+}
+
+/* 通用非标题范围样式 */
+.inula-calendar-content-date-item.inula-calendar-content-date-item-notThisTitleRange {
+ color: rgba(0, 0, 0, 0.25);
+}
+
+.inula-calendar-content-date-item.inula-calendar-content-date-item-today {
+ border: 1px solid #1677ff;
+ box-sizing: border-box;
+}
+
+.inula-calendar-content-date-item.inula-calendar-content-date-item-selected {
+ color: #fff;
+ background-color: #1677ff;
+}
+
+/* row只给周选择器用 */
+.inula-calendar-content-week-row-header {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ border-radius: 6px;
+}
+
+.inula-calendar-content-week-row {
+ height: 24px;
+ border-radius: 6px;
+
+ margin: 4px 0;
+
+ line-height: 32px;
+ text-align: center;
+ grid-column: 1;
+
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+}
+
+/* hover */
+.inula-calendar-content-week-row:hover {
+ color: #fff;
+ background-color: #1677ff;
+ cursor: pointer;
+}
+
+.inula-calendar-content-week-row:hover .inula-calendar-content-date-item {
+ color: #fff;
+}
+
+.inula-calendar-content-week-row .inula-calendar-content-date-item:hover {
+ background-color: #1572f5;
+}
+
+/* 选中 */
+.inula-calendar-content-week-row.inula-calendar-content-week-row-selected {
+ color: #fff;
+ background-color: #1677ff;
+}
+
+.inula-calendar-content-week-row.inula-calendar-content-week-row-selected
+ .inula-calendar-content-date-item {
+ color: #fff;
+}
+
+/* 月选择器 */
+.item-container.month-container {
+ height: 24px;
+ width: 88px;
+
+ margin: 18px 0;
+}
+
+.item-container.month-container::before {
+ height: 18px;
+ top: -18px;
+}
+
+.item-container.month-container::after {
+ height: 18px;
+ bottom: -18px;
+}
+
+.item-container.month-container .inula-calendar-content-date-item {
+ height: 24px;
+ width: 64px;
+ border-radius: 6px;
+
+ margin: 18px 12px;
+
+ line-height: 24px;
+ text-align: center;
+}
+
+/* hover */
+.inula-calendar-content-month-item:hover {
+ background-color: #f5f5f5;
+ cursor: pointer;
+}
+
+/* 选中 */
+.inula-calendar-content-month-item.inula-calendar-content-month-item-selected {
+ color: #fff;
+ background-color: #1677ff;
+}
+
+/* 季度选择器 */
+.item-container.quarter-container {
+ height: 24px;
+ width: 68px;
+
+ margin: 10px 0;
+}
+
+.item-container.quarter-container::before {
+ height: 24px;
+ top: -24px;
+}
+
+.item-container.quarter-container::after {
+ height: 24px;
+ bottom: -24px;
+}
+
+.item-container.quarter-container .inula-calendar-content-date-item {
+ height: 24px;
+ width: 56px;
+ border-radius: 6px;
+
+ margin: 10px 6px;
+
+ line-height: 24px;
+ text-align: center;
+}
+
+/* hover */
+.inula-calendar-content-quarter-item:hover {
+ background-color: #f5f5f5;
+ cursor: pointer;
+}
+
+/* 选中 */
+.inula-calendar-content-quarter-item.inula-calendar-content-quarter-item-selected {
+ color: #fff;
+ background-color: #1677ff;
+}
+
+/* 年选择器 */
+.item-container.year-container {
+ height: 24px;
+ width: 88px;
+
+ margin: 18px 0;
+}
+
+.item-container.year-container::before {
+ height: 18px;
+ top: -18px;
+}
+
+.item-container.year-container::after {
+ height: 18px;
+ bottom: -18px;
+}
+
+.item-container.year-container .inula-calendar-content-date-item {
+ height: 24px;
+ width: 64px;
+}
+
+/* rangepicker在范围内item样式 */
+.item-container.item-container-in-range {
+ background-color: #e6f4ff;
+}
+
+/* 非title范围 */
+.inula-calendar-content-year-item.inula-calendar-content-year-item-notthispage {
+ color: rgba(0, 0, 0, 0.25);
+}
+
+/* 日历底部样式 */
+.inula-calendar-footer {
+ width: calc(100% - 8px);
+ height: 40px;
+ border-top: 1px solid rgba(0, 0, 0, 0.08);
+
+ padding: 4px;
+
+ display: flex;
+ align-items: center;
+}
+
+.inula-calendar-footer-today {
+ font-size: 14px;
+ color: #1677ff;
+}
+
+.inula-calendar-footer-today:hover {
+ color: #69b1ff;
+ cursor: pointer;
+}
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/index.jsx b/packages/inula2-ui/library_code/src/components/datepicker2/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4068bf70bbfcea0afb7b1190e8535074b3723e56
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/index.jsx
@@ -0,0 +1,1891 @@
+import { didMount, watch, createContext, useContext } from "@openinula/next";
+import "./index.css";
+import Icon from "../icon";
+import Button from "../button";
+import {
+ calculateDaysInYearMonth,
+ calculateFirstWeekDayInYearMonth,
+ calculateCurWeek,
+ calculateRenderDateItems,
+ calculateRenderYQMItems,
+ calculateRenderWeekItems,
+ calculateNextRange,
+ getTodayDate,
+ formatDate,
+ formatDateToObject,
+ formatDateToYearMonth,
+ compareDate,
+ isEqualedDate,
+ isInRangeDate,
+} from "./utils";
+
+const ValueContext = createContext({
+ confirmValue: "",
+ selectValue: "",
+});
+
+const RangeValueContext = createContext({
+ startConfirmValue: "",
+ endConfirmValue: "",
+ startSelectValue: "",
+ endSelectValue: "",
+ rangeHoverValue: "",
+ rangeDefaultValue: "",
+ focusState: "00",
+});
+
+const DatePicker = ({
+ allowClear, //自定义清除按钮
+ autoFocus = false, //自动获取焦点
+ cellRender, //自定义单元格内容
+ components, //自定义面板
+ defaultOpen, //是否默认展开控制弹层
+ disabled = false, //禁用
+ disabledDate, //不可选择的日期
+ format, //设置日期格式
+ order = true, //多选、范围事是否自动排序
+ preserveInvalidOnBlur = false, //失去焦点是否要清空输入框内无效内容
+ getPopupContainer, //自定义浮层的容器,默认为body上新建div
+ inputReadOnly = false, //设置输入框只读
+ minDate, //最小日期
+ maxDate, //最大日期
+ needConfirm, //是否需要确认按钮
+ open, //控制弹层是否展开
+ // panekRender, //自定义渲染面板
+ picker = "date", //设置选择器类型, date | week | month | quarter | year
+ placeholder, //输入框提示文字
+ placement, //选择器弹出的位置bottomLeft | bottomRight | toLeft | toRight
+ prefix, //自定义前缀
+ prevIcon, //自定义上一个图标-月
+ nextIcon, //自定义下一个图标-月
+ suffixIcon, //自定义后缀
+ superNextIcon, //自定义下一个图标-年
+ superPrevIcon, //自定义上一个图标-年
+ size = "middle", //input大小,large高40px,small24px,default32px
+ variant = "outlined", // outlined | borderless | filled | underlined
+ status, //设置校验状态
+ onOpenChange,
+ onPanleChange,
+ className, //自定义类名
+ style,
+}) => {
+ let selectValue = "";
+ let confirmValue = "";
+ let isOpen = initialOpen;
+ let isClearIcon = false;
+ let curYear;
+ let curMonth;
+ let hoverValue;
+ let inputRef;
+
+ watch(() => {
+ if (defaultPickerValue || defaultValue) {
+ const parsedYearMonth = formatDateToYearMonth(
+ defaultPickerValue || defaultValue,
+ "",
+ picker
+ );
+ curYear = parsedYearMonth?.year || new Date().getFullYear();
+ curMonth = parsedYearMonth?.month || new Date().getMonth() + 1;
+ if (defaultValue) confirmValue = defaultValue;
+ } else {
+ curYear = new Date().getFullYear();
+ curMonth = new Date().getMonth() + 1;
+ }
+ });
+
+ watch(() => {
+ if (open !== undefined) {
+ isOpen = open;
+ }
+ });
+
+ const initialPlaceholder = () => {
+ if (placeholder) return placeholder;
+ switch (picker) {
+ case "date":
+ return "请选择日期";
+ case "week":
+ return "请选择周";
+ case "month":
+ return "请选择月份";
+ case "quarter":
+ return "请选择季度";
+ case "year":
+ return "请选择年份";
+ default:
+ return "请选择日期";
+ }
+ };
+
+ //选择某个日期
+ const handleSelect = (type, item) => {
+ console.log(type, item);
+ switch (type) {
+ case "date": {
+ selectValue = `${item.year}-${item.month}-${item.day}`;
+ if (item.year !== curYear) curYear = item.year;
+ if (item.month !== curMonth) curMonth = item.month;
+ break;
+ }
+ case "week": {
+ selectValue = `${curYear}-${item.week}周`;
+ if (item.year !== curYear) curYear = item.year;
+ if (item.month !== curMonth) curMonth = item.month;
+ break;
+ }
+ case "month": {
+ selectValue = `${curYear}-${item.month}`;
+ break;
+ }
+ case "quarter": {
+ selectValue = `${curYear}-Q${item.quarter}`;
+ break;
+ }
+ case "year": {
+ selectValue = `${item.year}`;
+ if (item.year !== curYear) curYear = item.year;
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ if (!needConfirm) {
+ hoverValue = "";
+ confirmValue = formatDate(selectValue, defaultValue, format, picker);
+ if (onChange) onChange(selectValue);
+ if (!defaultPickerValue) {
+ if (item.year !== curYear || (item.month && item.month !== curMonth)) {
+ if (onPanleChange) onPanleChange({ curYear, curMonth }, picker);
+ }
+ if (item.year && item.year !== curYear) curYear = item.year;
+ if (item.month && type !== "month" && item.month !== curMonth)
+ curMonth = item.month;
+ } else {
+ if (onPanleChange) onPanleChange(selectValue, picker);
+ curYear = formatDateToYearMonth(defaultPickerValue, "", picker)?.year;
+ curMonth = formatDateToYearMonth(defaultPickerValue, "", picker)?.month;
+ }
+ handleChangeOpen("close");
+ }
+ };
+
+ const mouseEnterItem = (type, item) => {
+ let tempValue;
+ switch (type) {
+ case "date": {
+ tempValue = `${item.year}-${item.month}-${item.day}`;
+ break;
+ }
+ case "week": {
+ tempValue = `${item.year}-${item.week}周`;
+ break;
+ }
+ case "month": {
+ tempValue = `${item.year}-${item.month}`;
+ break;
+ }
+ case "quarter": {
+ tempValue = `${item.year}-Q${item.quarter}`;
+ break;
+ }
+ case "year": {
+ tempValue = `${item.year}`;
+ break;
+ }
+ default: {
+ handleChangeOpen("close");
+ break;
+ }
+ }
+ hoverValue = formatDate(tempValue, defaultValue, format, picker);
+ };
+
+ const mouseLeaveItem = () => {
+ hoverValue = "";
+ };
+
+ const handleConfirm = () => {
+ confirmValue = selectValue;
+ isOpen = false;
+ };
+
+ //targer: year | month, action: add minus
+ const handleChangeTitle = (target, action) => {
+ if (target === "year") {
+ curYear = action === "add" ? curYear + 1 : curYear - 1;
+ } else {
+ if (action === "add") {
+ if (curMonth === 12) {
+ curMonth = 1;
+ curYear += 1;
+ } else curMonth += 1;
+ } else {
+ if (curMonth === 1) {
+ curMonth = 12;
+ curYear -= 1;
+ } else curMonth -= 1;
+ }
+ }
+ };
+
+ const handleClear = (e) => {
+ e.stopPropagation();
+ if (isClearIcon) {
+ selectValue = "";
+ confirmValue = "";
+ isClearIcon = false;
+ }
+ };
+
+ const handleOnBlur = () => {
+ if (onBlur) {
+ onBlur();
+ }
+ if (defaultPickerValue) {
+ curYear = formatDateToYearMonth(defaultPickerValue, "", picker)?.year;
+ curMonth = formatDateToYearMonth(defaultPickerValue, "", picker)?.month;
+ }
+ handleChangeOpen("close");
+ };
+
+ const handleOnFocus = () => {
+ if (onFocus) onFocus();
+ handleChangeOpen("open");
+ };
+
+ const handleChangeOpen = (action) => {
+ if (action === "open") {
+ if (onOpenChange && isOpen === false) onOpenChange(isOpen);
+ else isOpen = true;
+ } else if (action === "close") {
+ if (selectValue) selectValue = "";
+ inputRef.blur();
+ if (onOpenChange && isOpen === true) onOpenChange(isOpen);
+ else isOpen = false;
+ }
+ };
+
+ const inputContainerClassNames = [
+ "inula-datepicker-input-container",
+ size === "large" && "inula-datepicker-input-container-large",
+ size === "small" && "inula-datepicker-input-container-small",
+ disabled && "inula-datepicker-input-container-disabled",
+ variant === "filled" && "inula-datepicker-input-container-filled",
+ variant === "outlined" && "inula-datepicker-input-container-outlined",
+ variant === "borderless" && "inula-datepicker-input-container-borderless",
+ variant === "underline" && "inula-datepicker-input-container-underline",
+ status === "error" && "inula-datepicker-input-container-error",
+ status === "warning" && "inula-datepicker-input-container-warning",
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const inputClassNames = [
+ "inula-datepicker-input",
+ size === "large" && "inula-datepicker-input-large",
+ size === "small" && "inula-datepicker-input-small",
+ disabled && "inula-datepicker-input-disabled",
+ variant === "filled" && "inula-datepicker-input-filled",
+ variant === "outlined" && "inula-datepicker-input-outlined",
+ variant === "borderless" && "inula-datepicker-input-borderless",
+ variant === "underline" && "inula-datepicker-input-underline",
+ status === "error" && "inula-datepicker-input-error",
+ status === "warning" && "inula-datepicker-input-warning",
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+
+
{
+ if (disabled) return;
+ handleChangeOpen("open");
+ if (inputRef) inputRef.focus();
+ }}
+ >
+
+ {prefix}
+
+
(isOpen = true)}
+ onBlur={() => (isOpen = false)}
+ >
+
confirmValue && (isClearIcon = true)}
+ onMouseLeave={() => (isClearIcon = false)}
+ onMouseDown={(e) => e.preventDefault()}
+ onClick={(e) => {
+ e.stopPropagation();
+ handleClear(e);
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const RangePicker = ({
+ allowClear, //自定义清除按钮
+ showNow = true, //是否展示“今天”按钮
+ autoFocus = false, //自动获取焦点
+ inputReadOnly = false, //设置输入框只读
+ defaultOpen = false, //是否默认展开控制弹层
+ disabled = false, //禁用
+ disabledDate, //不可选择的日期
+ format, //设置日期格式
+ onChange, //时间变化回调
+ onOk, //点击确定回调
+ open, //控制弹层是否展开
+ initialOpen = open !== undefined ? open : defaultOpen || false,
+ order = true,
+ defaultPickerValue, //默认面板日期,每次打开面板会被重置到该日期,格式为YYYY-MM-DD
+ defaultValue = ["", ""], //默认值,与format对应,如果开始或结束时间为null或undefined,日期范围将是一个开区间
+ minDate, //最小日期
+ maxDate, //最大日期
+ needConfirm, //是否需要确认按钮 // panekRender, //自定义渲染面板
+ picker = "date", //设置选择器类型, date | week | month | quarter | year
+ placeholder, //输入框提示文字
+ placement = "bottomLeft", //选择器弹出的位置bottomLeft | bottomRight | toLeft | toRight
+ prefix, //自定义前缀
+ prevIcon, //自定义上一个图标-月
+ nextIcon, //自定义下一个图标-月
+ suffixIcon, //自定义后缀
+ superNextIcon, //自定义下一个图标-年
+ superPrevIcon, //自定义上一个图标-年
+ size = "middle", //input大小,large高40px,small24px,default32px
+ variant = "outlined", // outlined | borderless | filled | underlined
+ status, //设置校验状态
+ onOpenChange,
+ onPanleChange,
+ onBlur,
+ onFocus,
+ className, //自定义类名
+ style,
+}) => {
+ let hoverValue;
+ let startConfirmValue = "";
+ let endConfirmValue = "";
+ let focusState = "00";
+ let isOpen = initialOpen;
+ let startSelectValue = "";
+ let endSelectValue = "";
+ let isClearIcon = false;
+ let curYear;
+ let curMonth;
+ let startInputRef;
+ let endInputRef;
+
+ didMount(() => {
+ if (defaultValue) {
+ const parsedYearMonth = formatDateToYearMonth(
+ defaultValue[0],
+ "",
+ picker
+ );
+ curYear = parsedYearMonth?.year || new Date().getFullYear();
+ curMonth = parsedYearMonth?.month || new Date().getMonth() + 1;
+ if (defaultValue[0] && defaultValue[1]) {
+ startConfirmValue = compareDate(
+ defaultValue[0],
+ defaultValue[1],
+ picker
+ )
+ ? defaultValue[0]
+ : defaultValue[1];
+ endConfirmValue = compareDate(defaultValue[0], defaultValue[1], picker)
+ ? defaultValue[1]
+ : defaultValue[0];
+ }
+ } else {
+ curYear = new Date().getFullYear();
+ curMonth = new Date().getMonth() + 1;
+ }
+ });
+
+ watch(() => {
+ if (open !== undefined) {
+ isOpen = open;
+ }
+ });
+
+ const initialPlaceholder = (inputType) => {
+ if (placeholder) {
+ if (String.prototype.toString.call(inputType).slice(8, -1) !== "Array") {
+ return placeholder;
+ } else {
+ if (inputType === "start") {
+ return placeholder[0];
+ } else {
+ return placeholder[1];
+ }
+ }
+ }
+
+ switch (picker) {
+ case "date":
+ return "请选择日期";
+ case "week":
+ return "请选择周";
+ case "month":
+ return "请选择月份";
+ case "quarter":
+ return "请选择季度";
+ case "year":
+ return "请选择年份";
+ default:
+ return "请选择日期";
+ }
+ }; //选择某个日期
+
+ const handleSelect = (type, item) => {
+ switch (type) {
+ case "date": {
+ if (focusState === "10")
+ startSelectValue = `${item.year}-${item.month}-${item.day}`;
+ else if (focusState === "01")
+ endSelectValue = `${item.year}-${item.month}-${item.day}`;
+ break;
+ }
+ case "week": {
+ if (focusState === "10")
+ startSelectValue = `${item.year}-${item.week}周`;
+ else if (focusState === "01")
+ endSelectValue = `${item.year}-${item.week}周`;
+ break;
+ }
+ case "month": {
+ if (focusState === "10")
+ startSelectValue = `${item.year}-${item.month}`;
+ else if (focusState === "01")
+ endSelectValue = `${item.year}-${item.month}`;
+ break;
+ }
+ case "quarter": {
+ if (focusState === "10")
+ startSelectValue = `${item.year}-Q${item.quarter}`;
+ else if (focusState === "01")
+ endSelectValue = `${item.year}-Q${item.quarter}`;
+ break;
+ }
+ case "year": {
+ if (focusState === "10") startSelectValue = `${item.year}`;
+ else if (focusState === "01") endSelectValue = `${item.year}`;
+ break;
+ }
+ default: {
+ handleChangeOpen("close");
+ break;
+ }
+ }
+
+ if (!needConfirm) {
+ hoverValue = "";
+
+ if (focusState === "10") {
+ startConfirmValue = formatDate(
+ startSelectValue,
+ defaultValue[0],
+ format,
+ picker
+ );
+ focusState = "01";
+ endInputRef.focus();
+ } else if (focusState === "01") {
+ endConfirmValue = formatDate(
+ endSelectValue,
+ defaultValue[1],
+ format,
+ picker
+ );
+ focusState = "10";
+ startInputRef.focus();
+ }
+
+ if (!defaultPickerValue) {
+ switch (type) {
+ case "date":
+ case "week": {
+ if (curYear < item.year) {
+ curYear = item.year;
+ curMonth = 1;
+ } else if (curYear > item.year) {
+ curYear = item.year;
+ curMonth = 12;
+ } else {
+ if (item.month > curMonth + 1 || item.month < curMonth) {
+ curMonth = item.month;
+ }
+ }
+ break;
+ }
+ case "month":
+ case "quarter": {
+ if (Math.abs(curYear - item.year) > 1) curYear = item.year;
+ break;
+ }
+ case "year": {
+ if (
+ Math.floor(curYear / 10) * 10 + 20 === item.year ||
+ Math.floor(curYear / 10) * 10 - 1 === item.year
+ )
+ curYear = item.year;
+ }
+ }
+ } else {
+ if (onPanleChange)
+ onPanleChange(startSelectValue, endSelectValue, picker);
+ curYear = formatDateToYearMonth(defaultPickerValue, "", picker)?.year;
+ curMonth = formatDateToYearMonth(defaultPickerValue, "", picker)?.month;
+ }
+
+ if (onChange) onChange(startSelectValue, endSelectValue);
+ if (startConfirmValue && endConfirmValue) handleChangeOpen("close", item);
+ }
+ };
+
+ const mouseEnterItem = (type, item) => {
+ let tempValue;
+
+ switch (type) {
+ case "date": {
+ tempValue = `${item.year}-${item.month}-${item.day}`;
+ break;
+ }
+ case "week": {
+ tempValue = `${item.year}-${item.week}周`;
+ break;
+ }
+ case "month": {
+ tempValue = `${item.year}-${item.month}`;
+ break;
+ }
+ case "quarter": {
+ tempValue = `${item.year}-Q${item.quarter}`;
+ break;
+ }
+ case "year": {
+ tempValue = `${item.year}`;
+ break;
+ }
+
+ default: {
+ handleChangeOpen("close");
+ break;
+ }
+ }
+
+ hoverValue = formatDate(tempValue, defaultValue[0], format, picker);
+ };
+
+ const mouseLeaveItem = () => {
+ hoverValue = "";
+ };
+
+ const handleConfirm = () => {
+ hoverValue = "";
+ let item;
+
+ if (focusState === "10") {
+ if (!startSelectValue) return;
+ startConfirmValue = formatDate(
+ startSelectValue,
+ defaultValue[0],
+ format,
+ picker
+ );
+ item = formatDateToObject(startSelectValue, "", picker);
+ focusState = "01";
+ endInputRef.focus();
+ } else if (focusState === "01") {
+ if (!endSelectValue) return;
+ endConfirmValue = formatDate(
+ endSelectValue,
+ defaultValue[1],
+ format,
+ picker
+ );
+ item = formatDateToObject(endSelectValue, "", picker);
+ focusState = "10";
+ startInputRef.focus();
+ }
+
+ if (!defaultPickerValue) {
+ switch (picker) {
+ case "date":
+ case "week": {
+ if (curYear < item.year) {
+ curYear = item.year;
+ curMonth = 1;
+ } else if (curYear > item.year) {
+ curYear = item.year;
+ curMonth = 12;
+ } else {
+ if (item.month > curMonth + 1 || item.month < curMonth) {
+ curMonth = item.month;
+ }
+ }
+ break;
+ }
+ case "month":
+ case "quarter": {
+ if (Math.abs(curYear - item.year) > 1) curYear = item.year;
+ break;
+ }
+ case "year": {
+ if (
+ Math.floor(curYear / 10) * 10 + 20 === item.year ||
+ Math.floor(curYear / 10) * 10 - 1 === item.year
+ )
+ curYear = item.year;
+ }
+ }
+ } else {
+ if (onPanleChange)
+ onPanleChange(startSelectValue, endSelectValue, picker);
+ curYear = formatDateToYearMonth(defaultPickerValue, "", picker)?.year;
+ curMonth = formatDateToYearMonth(defaultPickerValue, "", picker)?.month;
+ }
+
+ if (onChange) onChange(startSelectValue, endSelectValue);
+
+ if (startConfirmValue && endConfirmValue) handleChangeOpen("close");
+ };
+
+ //target: year | month, action: add minus
+ const handleChangeTitle = (target, action, type = "date") => {
+ if (onPanleChange)
+ onPanleChange({ curYear, curMonth }, endSelectValue, picker);
+
+ if (target === "year") {
+ if (type === "year")
+ curYear = action === "add" ? curYear + 10 : curYear - 10;
+ else curYear = action === "add" ? curYear + 1 : curYear - 1;
+ } else {
+ if (action === "add") {
+ if (curMonth === 12) {
+ curMonth = 1;
+ curYear += 1;
+ } else curMonth += 1;
+ } else {
+ if (curMonth === 1) {
+ curMonth = 12;
+ curYear -= 1;
+ } else curMonth -= 1;
+ }
+ }
+ };
+
+ const handleClear = (e) => {
+ e.stopPropagation();
+ if (isClearIcon) {
+ startSelectValue = "";
+ endSelectValue = "";
+ startConfirmValue = "";
+ endConfirmValue = "";
+ isClearIcon = false;
+ }
+ };
+
+ const handleOnBlur = (curRef) => {
+ if (onBlur) {
+ onBlur();
+ }
+
+ if (defaultPickerValue) {
+ curYear = formatDateToYearMonth(defaultPickerValue, "", picker)?.year;
+ curMonth = formatDateToYearMonth(defaultPickerValue, "", picker)?.month;
+ }
+
+ if (curRef === "start" && focusState === "10") {
+ focusState = "00";
+ handleChangeOpen("close");
+ } else if (curRef === "end" && focusState === "01") {
+ focusState = "00";
+ handleChangeOpen("close");
+ }
+ };
+
+ const handleOnFocus = (curRef) => {
+ if (onFocus) onFocus();
+ handleChangeOpen("open");
+
+ if (curRef === "start") {
+ focusState = "10";
+ } else {
+ focusState = "01";
+ }
+ };
+
+ const handleOnClickContainer = () => {
+ if (disabled) return;
+ handleChangeOpen("open");
+
+ if (focusState === "00") {
+ startInputRef.focus();
+ }
+ };
+
+ const handleChangeOpen = (action) => {
+ if (action === "open") {
+ if (onOpenChange && isOpen === false) onOpenChange(isOpen);
+ else isOpen = true;
+ } else if (action === "close") {
+ startSelectValue = "";
+ endSelectValue = "";
+ if (startConfirmValue && endConfirmValue && order) {
+ if (!compareDate(startConfirmValue, endConfirmValue, picker)) {
+ const temp = startConfirmValue;
+ startConfirmValue = endConfirmValue;
+ endConfirmValue = temp;
+ }
+ }
+ startInputRef.blur();
+ endInputRef.blur();
+ if (onOpenChange && isOpen === true) onOpenChange(isOpen);
+ else isOpen = false;
+ }
+ };
+
+ const inputContainerClassNames = [
+ "inula-datepicker-input-container",
+ "range-container",
+ size === "large" && "inula-datepicker-input-container-large",
+ size === "small" && "inula-datepicker-input-container-small",
+ disabled && "inula-datepicker-input-container-disabled",
+ variant === "filled" && "inula-datepicker-input-container-filled",
+ variant === "outlined" && "inula-datepicker-input-container-outlined",
+ variant === "borderless" && "inula-datepicker-input-container-borderless",
+ variant === "underline" && "inula-datepicker-input-container-underline",
+ status === "error" && "inula-datepicker-input-container-error",
+ status === "warning" && "inula-datepicker-input-container-warning",
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const startInputClassNames = [
+ "inula-datepicker-input",
+ "range-input",
+ size === "large" && "inula-datepicker-input-large",
+ size === "small" && "inula-datepicker-input-small",
+ focusState === "10" && hoverValue && "inula-datepicker-input-hover-value",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const endInputClassNames = [
+ "inula-datepicker-input",
+ "range-input",
+ size === "large" && "inula-datepicker-input-large",
+ size === "small" && "inula-datepicker-input-small",
+ focusState === "01" && hoverValue && "inula-datepicker-input-hover-value",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const inputIconClassNames = [
+ "inula-datepicker-input-icon",
+ disabled && "icon-disabled",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+
+
handleOnClickContainer()}
+ >
+
+ {prefix}
+
+ {/* start */}
+
e.stopPropagation()}
+ onBlur={() => handleOnBlur("start")}
+ onFocus={() => handleOnFocus("start")}
+ >
+
+
+ {/* end */}
+
e.stopPropagation()}
+ onBlur={() => handleOnBlur("end")}
+ onFocus={() => handleOnFocus("end")}
+ >
+
+
{
+ if (startConfirmValue || endConfirmValue) isClearIcon = true;
+ }}
+ onMouseLeave={() => (isClearIcon = false)}
+ onMouseDown={(e) => e.preventDefault()}
+ onClick={(e) => {
+ e.stopPropagation();
+ handleClear(e);
+ }}
+ >
+
{
+ if (startConfirmValue || endConfirmValue) isClearIcon = true;
+ }}
+ onMouseLeave={() => (isClearIcon = false)}
+ onMouseDown={(e) => e.preventDefault()}
+ onClick={() => handleClear()}
+ >
+
+
+ {suffixIcon ? (
+ suffixIcon
+ ) : (
+
+ )}
+
+
+ {allowClear ? (
+ allowClear
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+};
+
+const Calendar = ({
+ type = "date",
+ mode = "date",
+ size = "default",
+ curYear = new Date().getFullYear(),
+ curMonth = new Date().getMonth() + 1,
+ curDay = new Date().getDate(),
+ isOpen = false,
+ placement,
+ defaultValue,
+ disabledDate,
+ minDate,
+ maxDate,
+ needConfirm,
+ handleConfirm,
+ prevIcon,
+ nextIcon,
+ superPrevIcon,
+ superNextIcon,
+}) => {
+ const { selectValue, confirmValue } = useContext(ValueContext);
+ const { rangeDefaultValue } = useContext(RangeValueContext);
+
+ const today = `${new Date().getFullYear()}-${
+ new Date().getMonth() + 1
+ }-${new Date().getDate()}`;
+
+ const calendarClassNames = ["inula-calendar", !isOpen && "closed"]
+ .filter(Boolean)
+ .join(" ");
+
+ //通过minDate、maxDate、disabledDate判断元素是否为禁用
+ const isDisabled = (item) => {
+ if (!minDate && !maxDate && !disabledDate) return false;
+ const miniDate = formatDateToObject(minDate, "", type);
+ const maxiDate = formatDateToObject(maxDate, "", type);
+ const disabledDates = disabledDate
+ ? disabledDate.map((date) => formatDateToObject(date, "", type))
+ : null;
+ switch (type) {
+ case "date": {
+ if (miniDate) {
+ if (item.year < miniDate.year) return true;
+ else if (item.year === miniDate.year && item.month < miniDate.month)
+ return true;
+ else if (
+ item.year === miniDate.year &&
+ item.month === miniDate.month &&
+ item.day <= miniDate.day
+ )
+ return true;
+ }
+
+ if (maxiDate) {
+ if (item.year > maxiDate.year) return true;
+ else if (item.year === maxiDate.year && item.month > maxiDate.month)
+ return true;
+ else if (
+ item.year === maxiDate.year &&
+ item.month === maxiDate.month &&
+ item.day >= maxiDate.day
+ )
+ return true;
+ }
+
+ if (disabledDates)
+ for (const date of disabledDates)
+ if (
+ date.year === item.year &&
+ date.month === item.month &&
+ date.day === item.day
+ )
+ return true;
+ break;
+ }
+
+ case "week": {
+ if (miniDate) {
+ if (item.year < miniDate.year) return true;
+ else if (item.year === miniDate.year && item.week <= miniDate.week)
+ return true;
+ }
+
+ if (maxiDate) {
+ if (item.year > maxiDate.year) return true;
+ else if (item.year === maxiDate.year && item.week >= maxiDate.week)
+ return true;
+ }
+
+ if (disabledDates)
+ for (const date of disabledDates)
+ if (date.year === item.year && date.week === item.week) return true;
+ break;
+ }
+
+ case "month": {
+ if (miniDate) {
+ if (item.year < miniDate.year) return true;
+ else if (item.year === miniDate.year && item.month <= miniDate.month)
+ return true;
+ }
+
+ if (maxiDate) {
+ if (item.year > maxiDate.year) return true;
+ else if (item.year === maxiDate.year && item.month >= maxiDate.month)
+ return true;
+ }
+
+ if (disabledDates)
+ for (const date of disabledDates)
+ if (date.year === item.year && date.month === item.month)
+ return true;
+ break;
+ }
+
+ case "quarter": {
+ if (miniDate) {
+ if (item.year < miniDate.year) return true;
+ else if (
+ item.year === miniDate.year &&
+ item.quarter <= miniDate.quarter
+ )
+ return true;
+ }
+
+ if (maxiDate) {
+ if (item.year > maxiDate.year) return true;
+ else if (
+ item.year === maxiDate.year &&
+ item.quarter >= maxiDate.quarter
+ )
+ return true;
+ }
+
+ if (disabledDates)
+ for (const date of disabledDates)
+ if (date.year === item.year && date.quarter === item.quarter)
+ return true;
+ break;
+ }
+
+ case "year": {
+ if (miniDate && item.year <= miniDate.year) return true;
+ if (maxiDate && item.year >= maxiDate.year) return true;
+
+ if (disabledDates)
+ for (const date of disabledDates)
+ if (date.year === item.year) return true;
+ break;
+ }
+ }
+
+ return false;
+ };
+
+ const getGridColumns = () => {
+ switch (type) {
+ case "date":
+ return 7;
+ case "week":
+ return 1;
+ case "month":
+ return 3;
+ case "quarter":
+ return 4;
+ case "year":
+ return 3;
+ default:
+ return 7;
+ }
+ };
+
+ //日历头部
+ const CalendarHeader = () => {
+ return (
+
+
+ {superPrevIcon ? (
+ superPrevIcon
+ ) : (
+ handleChangeTitle("year", "minus")}
+ />
+ )}
+ {type === "date" ||
+ (type === "week" &&
+ (prevIcon ? (
+ prevIcon
+ ) : (
+ handleChangeTitle("month", "minus")}
+ />
+ )))}
+
+
+
+
+
+ {`${curYear}年 ${curMonth}月`}
+
+
+ {`${curYear}年`}
+
+ {`${Math.floor(curYear / 10) * 10}年-${
+ Math.floor(curYear / 10) * 10 + 9
+ }年`}
+
+
+
+
+ {`${calculateNextRange(curYear, curMonth, type).nextYear}年 ${
+ calculateNextRange(curYear, curMonth, type).nextMonth
+ }月`}
+
+
+ {`${calculateNextRange(curYear, curMonth, type).nextYear}年`}
+
+ {`${
+ Math.floor(
+ calculateNextRange(curYear, curMonth, type).nextYear / 10
+ ) * 10
+ }年-${
+ Math.floor(
+ calculateNextRange(curYear, curMonth, type).nextYear / 10
+ ) *
+ 10 +
+ 9
+ }年`}
+
+
+
+
+ {type === "date" ||
+ (type === "week" &&
+ (nextIcon ? (
+ nextIcon
+ ) : (
+ handleChangeTitle("month", "add")}
+ />
+ )))}
+ {superNextIcon ? (
+ superNextIcon
+ ) : (
+ handleChangeTitle("year", "add")}
+ />
+ )}
+
+
+ );
+ };
+
+ //日历内容
+ const CalendarContent = () => {
+ return (
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+
+ {(row, index) => (
+ handleClick(e, "week", row[0])}
+ onMouseEnter={() => handleMounseEnter("week", row[0])}
+ onMouseLeave={() => handleMounseLeave(row[0])}
+ >
+
+ {(item, index) => (
+
+ )}
+
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+ );
+ };
+
+ const CalendarRangeContent = () => {
+ return (
+
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+
+ {(row, index) => (
+
+ !isDisabled(row[0]) && onSelect && onSelect("week", row[0])
+ }
+ onMouseEnter={() =>
+ !isDisabled(row[0]) && mouseEnterItem("week", row[0])
+ }
+ onMouseLeave={() => !isDisabled(row[0]) && mouseLeaveItem()}
+ >
+
+ {(item, index) => (
+
+ )}
+
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+
+ {(item) => (
+
+ {item}
+
+ )}
+
+
+
+ {(row, index) => (
+
+ !isDisabled(row[0]) && onSelect && onSelect("week", row[0])
+ }
+ onMouseEnter={() =>
+ !isDisabled(row[0]) && mouseEnterItem("week", row[0])
+ }
+ onMouseLeave={() => !isDisabled(row[0]) && mouseLeaveItem()}
+ >
+
+ {(item, index) => (
+
+ )}
+
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ {(item, index) => (
+
+ )}
+
+
+
+
+ );
+ };
+
+ //日历底部
+ const CalendarFooter = () => {
+ const justifyContent = () => {
+ if (type === "date" && needConfirm) return "space-between";
+ if (type === "date" && !needConfirm) return "center";
+ if (type !== "date" && needConfirm) return "flex-end";
+ return "center";
+ };
+
+ return (
+
+
+ onSelect && onSelect("date", getTodayDate())}
+ >
+ 今天
+
+
+
+
+
+
+ );
+ };
+
+ return (
+ e.preventDefault()}>
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const CalendarContentItem = ({
+ type = "date", //日历类型
+ mode = "date",
+ item, //item日期信息{year, quarter, month, week, day, isThisTitleRange}
+ defaultValue, //默认日期
+ disabled, //是否禁用
+ onClick,
+ onMouseEnter,
+ onMouseLeave,
+ className,
+}) => {
+ const { confirmValue, selectValue } = useContext(ValueContext);
+ const {
+ startConfirmValue,
+ endConfirmValue,
+ startSelectValue,
+ endSelectValue,
+ focusState,
+ rangeHoverValue,
+ } = useContext(RangeValueContext);
+
+ const today = `${new Date().getFullYear()}-${
+ new Date().getMonth() + 1
+ }-${new Date().getDate()}`;
+
+ const isTody =
+ (type === "date" || "week") &&
+ today === `${item.year}-${item.month}-${item.day}`;
+
+ const defaultString = (item) => {
+ switch (type) {
+ case "date":
+ return `${item.year}-${item.month}-${item.day}`;
+ case "week":
+ return `${item.year}-${item.week}周`;
+ case "month":
+ return `${item.year}-${item.month}`;
+ case "quarter":
+ return `${item.year}-Q${item.quarter}`;
+ case "year":
+ return `${item.year}`;
+ }
+ };
+
+ const itemContainerClassNames = [
+ "item-container",
+ disabled && "item-container-disabled",
+ isInRangeDate(
+ focusState,
+ rangeHoverValue,
+ startConfirmValue,
+ endConfirmValue,
+ startSelectValue,
+ endSelectValue,
+ item,
+ type
+ ) && "item-container-in-range",
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const itemClassNames = [
+ "inula-calendar-content-date-item",
+ !item.isThisTitleRange &&
+ "inula-calendar-content-date-item-notThisTitleRange",
+ isTody && "inula-calendar-content-date-item-today",
+ type !== "week" &&
+ item.isThisTitleRange &&
+ mode === "date" &&
+ (selectValue
+ ? selectValue === defaultString(item)
+ : confirmValue
+ ? isEqualedDate(confirmValue, item, type)
+ : isEqualedDate(defaultValue, item, type)) &&
+ "inula-calendar-content-date-item-selected",
+ type !== "week" &&
+ item.isThisTitleRange &&
+ mode === "range" &&
+ !(focusState === "10" && rangeHoverValue) &&
+ (startSelectValue
+ ? startSelectValue === defaultString(item)
+ : startConfirmValue
+ ? isEqualedDate(startConfirmValue, item, type)
+ : isEqualedDate(defaultValue, item, type)) &&
+ "inula-calendar-content-date-item-selected",
+ type !== "week" &&
+ item.isThisTitleRange &&
+ mode === "range" &&
+ !(focusState === "01" && rangeHoverValue) &&
+ (endSelectValue
+ ? endSelectValue === defaultString(item)
+ : endConfirmValue
+ ? isEqualedDate(endConfirmValue, item, type)
+ : isEqualedDate(defaultValue, item, type)) &&
+ "inula-calendar-content-date-item-selected",
+ type !== "week" &&
+ item.isThisTitleRange &&
+ mode === "range" &&
+ rangeHoverValue &&
+ isEqualedDate(rangeHoverValue, item, type) &&
+ "inula-calendar-content-date-item-selected",
+ disabled && "inula-calendar-content-date-item-disabled",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+ onMouseEnter && onMouseEnter(type, item)}
+ onMouseLeave={() => onMouseLeave && onMouseLeave(item)}
+ >
+
onClick(e, type, item)}>
+ {item.day}
+ {item.day || item.week}
+ {`${item.month}月`}
+ {`Q${item.quarter}`}
+ {item.year}
+
+
+ );
+};
+
+export { DatePicker, RangePicker };
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/utils/calculateFunc.js b/packages/inula2-ui/library_code/src/components/datepicker2/utils/calculateFunc.js
new file mode 100644
index 0000000000000000000000000000000000000000..8da31f4d37be389b973044897da3a84f99b6a1bb
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/utils/calculateFunc.js
@@ -0,0 +1,471 @@
+import { formatDateToObject } from "./formatFunc";
+//计算给定年月有多少天
+export function calculateDaysInYearMonth(year, month) {
+ return new Date(year, month, 0).getDate();
+}
+
+//计算当年当月的下一个区间
+export function calculateNextRange(year, month, type) {
+ switch (type) {
+ case "date":
+ case "week": {
+ const nextYear = month === 12 ? year + 1 : year;
+ const nextMonth = month === 12 ? 1 : month + 1;
+ return { nextYear, nextMonth };
+ }
+ case "month":
+ case "quarter": {
+ const nextYear = year + 1;
+ const nextMonth = month;
+ return { nextYear, nextMonth };
+ }
+ case "year": {
+ const nextYear = year + 10;
+ const nextMonth = month;
+ return { nextYear, nextMonth };
+ }
+ }
+}
+
+//计算给定年月的当月第一天是星期几
+export function calculateFirstWeekDayInYearMonth(year, month) {
+ return ((new Date(year, month - 1, 1).getDay() + 6) % 7) + 1;
+}
+
+//日期选择器,计算当前渲染年月的calendar渲染数组
+export function calculateRenderDateItems(year, month) {
+ const curMonthDays = calculateDaysInYearMonth(year, month);
+ const curStartWeek = calculateFirstWeekDayInYearMonth(year, month);
+ const preMonthDays = calculateDaysInYearMonth(
+ month === 1 ? year - 1 : year,
+ month === 1 ? 12 : month - 1
+ );
+ const preMonth = month === 1 ? 12 : month - 1;
+ const preYear = month === 1 ? year - 1 : year;
+ const nextMonth = month === 12 ? 1 : month + 1;
+ const nextYear = month === 12 ? year + 1 : year;
+ const items = [];
+ for (let i = curStartWeek - 1; i >= 1; i--) {
+ items.push({
+ year: preYear,
+ month: preMonth,
+ day: preMonthDays - i + 1,
+ isThisPage: false,
+ });
+ }
+
+ for (let i = 1; i <= curMonthDays; i++) {
+ items.push({
+ year: year,
+ month: month,
+ day: i,
+ isThisPage: true,
+ });
+ }
+
+ for (let i = 1; i <= 42 - (curStartWeek + curMonthDays) + 1; i++) {
+ items.push({
+ year: nextYear,
+ month: nextMonth,
+ day: i,
+ isThisPage: false,
+ });
+ }
+
+ return items;
+}
+
+//周选择器,计算当前的calendar渲染数组
+export function calculateRenderWeekItems(year, month) {
+ const curMonthDays = calculateDaysInYearMonth(year, month);
+ const curStartWeek = calculateFirstWeekDayInYearMonth(year, month);
+ const preMonthDays = calculateDaysInYearMonth(
+ month === 1 ? year - 1 : year,
+ month === 1 ? 12 : month - 1
+ );
+ const preMonth = month === 1 ? 12 : month - 1;
+ const preYear = month === 1 ? year - 1 : year;
+ const nextMonth = month === 12 ? 1 : month + 1;
+ const nextYear = month === 12 ? year + 1 : year;
+ const items = [];
+ let weekCount = calculateWeekOfYearForFirstDay(year, month);
+ let dayCount = 0;
+ for (let i = curStartWeek - 1; i >= 1; i--) {
+ if (dayCount % 7 === 0) {
+ items.push({
+ year: preYear,
+ month: preMonth,
+ week: weekCount,
+ day: null,
+ isThisPage: false,
+ });
+ weekCount++;
+ }
+ items.push({
+ year: preYear,
+ month: preMonth,
+ week: weekCount - 1,
+ day: preMonthDays - i + 1,
+ isThisPage: false,
+ });
+ dayCount++;
+ }
+
+ for (let i = 1; i <= curMonthDays; i++) {
+ if (dayCount % 7 === 0) {
+ items.push({
+ year: year,
+ month: month,
+ week: weekCount,
+ day: null,
+ isThisPage: false,
+ });
+ weekCount++;
+ }
+ items.push({
+ year: year,
+ month: month,
+ week: weekCount - 1,
+ day: i,
+ isThisPage: true,
+ });
+ dayCount++;
+ }
+
+ for (let i = 1; i <= 42 - (curStartWeek + curMonthDays) + 1; i++) {
+ if (dayCount % 7 === 0) {
+ items.push({
+ year: nextYear,
+ month: nextMonth,
+ week: weekCount,
+ day: null,
+ isThisPage: false,
+ });
+ weekCount++;
+ }
+ items.push({
+ year: nextYear,
+ month: nextMonth,
+ week: weekCount - 1,
+ day: i,
+ isThisPage: false,
+ });
+ dayCount++;
+ }
+
+ const ROW = 6,
+ COL = 8,
+ TOTAL = ROW * COL;
+ while (items.length < TOTAL) items.push({});
+
+ const matrix = [];
+ for (let r = 0; r < ROW; r++) {
+ matrix.push(items.slice(r * COL, (r + 1) * COL));
+ }
+ return matrix;
+}
+
+//年、季度、月选择器,计算当前calendar渲染数组
+export function calculateRenderYQMItems(type, year) {
+ const items = [];
+ switch (type) {
+ case "year": {
+ const curYearStart = Math.floor(year / 10) * 10;
+ items.push({ year: curYearStart - 1, isThisPage: false });
+ for (let i = curYearStart; i <= curYearStart + 9; i++) {
+ items.push({ year: i, isThisPage: true });
+ }
+ items.push({ year: curYearStart + 10, isThisPage: false });
+
+ return items;
+ }
+ case "month": {
+ for (let i = 1; i <= 12; i++) {
+ items.push({ month: i, isThisPage: true });
+ }
+ return items;
+ }
+ case "quarter": {
+ for (let i = 1; i <= 4; i++) {
+ items.push({ quarter: i, isThisPage: true });
+ }
+ return items;
+ }
+ }
+}
+
+//计算某年某月某日是某年第几周
+export function calculateCurWeek(year, month, day) {
+ const date = new Date(year, month - 1, day);
+
+ // 设置日期为当前日期的周四(ISO周计算中,周四决定属于哪一周)
+ const thursday = new Date(date);
+ thursday.setDate(date.getDate() + 4 - (date.getDay() || 7)); // 周日为0,转为7
+
+ const yearStart = new Date(thursday.getFullYear(), 0, 1);
+
+ const week = Math.ceil(((thursday - yearStart) / 86400000 + 1) / 7);
+
+ return week;
+}
+
+//根据年、月计算当月第一天是当年第几周
+export function calculateWeekOfYearForFirstDay(year, month) {
+ // 当月第一天
+ const firstDay = new Date(year, month - 1, 1);
+
+ // 复制一份,避免污染原日期
+ const target = new Date(firstDay);
+ const WEEK_START = 1;
+
+ const day = target.getDay();
+ const offset = (day + 7 - WEEK_START) % 7;
+ target.setDate(target.getDate() - offset);
+
+ // 当年 1 月 1 日
+ const yearStart = new Date(year, 0, 1);
+ const yearStartDay = yearStart.getDay();
+ const yearStartOffset = (yearStartDay + 7 - WEEK_START) % 7;
+
+ yearStart.setDate(yearStart.getDate() - yearStartOffset);
+
+ const delta = firstDay - yearStart; // 毫秒
+ const week = Math.floor(delta / (7 * 24 * 3600 * 1000)) + 1;
+
+ return week;
+}
+
+//计算当前状态的年月日
+export function getTodayDate() {
+ const date = new Date();
+ return {
+ year: date.getFullYear(),
+ month: date.getMonth() + 1,
+ day: date.getDate(),
+ };
+}
+
+//对比函数,targetDate > baseDate ? true : false
+export function compareDate(baseDate, targetDate, type) {
+ if (!baseDate || !targetDate) return false;
+ let baseDateObj;
+ let targetDateObj;
+ if (Object.prototype.toString.call(targetDate).slice(8, -1) === "String")
+ targetDateObj = formatDateToObject(targetDate, "", type);
+ else targetDateObj = targetDate;
+ if (Object.prototype.toString.call(baseDate).slice(8, -1) === "String")
+ baseDateObj = formatDateToObject(baseDate, "", type);
+ else baseDateObj = baseDate;
+
+ switch (type) {
+ case "date": {
+ if (targetDateObj.year > baseDateObj.year) {
+ return true;
+ } else if (
+ targetDateObj.year === baseDateObj.year &&
+ targetDateObj.month > baseDateObj.month
+ ) {
+ return true;
+ } else if (
+ targetDateObj.year === baseDateObj.year &&
+ targetDateObj.month === baseDateObj.month &&
+ targetDateObj.day >= baseDateObj.day
+ ) {
+ return true;
+ }
+ break;
+ }
+ case "week": {
+ if (targetDateObj.year > baseDateObj.year) {
+ return true;
+ } else if (
+ targetDateObj.year === baseDateObj.year &&
+ targetDateObj.week >= baseDateObj.week
+ ) {
+ return true;
+ }
+ break;
+ }
+ case "month": {
+ if (targetDateObj.year > baseDateObj.year) {
+ return true;
+ } else if (
+ targetDateObj.year === baseDateObj.year &&
+ targetDateObj.month >= baseDateObj.month
+ ) {
+ return true;
+ }
+ break;
+ }
+ case "quarter": {
+ if (targetDateObj.year > baseDateObj.year) {
+ return true;
+ } else if (
+ targetDateObj.year === baseDateObj.year &&
+ targetDateObj.quarter >= baseDateObj.quarter
+ ) {
+ return true;
+ }
+ break;
+ }
+ case "year": {
+ return targetDateObj.year >= baseDateObj.year;
+ }
+ }
+
+ return false;
+}
+
+export function isEqualedDate(stringBaseDate, objTargetDate, type) {
+ if (!stringBaseDate) return false;
+ const objBaseDate = formatDateToObject(stringBaseDate, "", type);
+ if (type === "week") console.log(111);
+ switch (type) {
+ case "date": {
+ return (
+ objBaseDate.year === objTargetDate.year &&
+ objBaseDate.month === objTargetDate.month &&
+ objBaseDate.day === objTargetDate.day
+ );
+ }
+ case "week": {
+ console.log(
+ stringBaseDate,
+ objTargetDate,
+ objBaseDate.year === objTargetDate.year &&
+ objBaseDate.week === objTargetDate.week
+ );
+ return (
+ objBaseDate.year === objTargetDate.year &&
+ objBaseDate.week === objTargetDate.week
+ );
+ }
+ case "month": {
+ return (
+ objBaseDate.year === objTargetDate.year &&
+ objBaseDate.month === objTargetDate.month
+ );
+ }
+ case "quarter": {
+ return (
+ objBaseDate.year === objTargetDate.year &&
+ objBaseDate.quarter === objTargetDate.quarter
+ );
+ }
+ case "year": {
+ return objBaseDate.year === objTargetDate.year;
+ }
+ }
+ return false;
+}
+
+const defaultString = (item, type) => {
+ switch (type) {
+ case "date":
+ return `${item.year}-${item.month}-${item.day}`;
+ case "week":
+ return `${item.year}-${item.week}周`;
+ case "month":
+ return `${item.year}-${item.month}`;
+ case "quarter":
+ return `${item.year}-Q${item.quarter}`;
+ case "year":
+ return `${item.year}`;
+ }
+};
+
+export function isSelected(
+ selectValue,
+ confirmValue,
+ startConfirmValue,
+ endConfirmValue,
+ defaultValue,
+ hoverValue,
+ focusState,
+ item,
+ type
+) {
+ if (type === "week" || item.isThisTitleRange) return false;
+
+ if (selectValue) {
+ return selectValue === defaultString(item, type);
+ } else {
+ if (confirmValue) {
+ return isEqualedDate(confirmValue, item, type);
+ }
+ if (startConfirmValue) {
+ if (focusState === "10" && hoverValue) return false;
+ return isEqualedDate(startConfirmValue, item, type);
+ }
+ if (endConfirmValue) {
+ if (focusState === "01" && hoverValue) return false;
+ return isEqualedDate(endConfirmValue, item, type);
+ }
+ if (defaultValue) {
+ return isEqualedDate(defaultValue, item, type);
+ }
+ }
+}
+
+// range样式计算函数
+export function isInRangeDate(
+ focusState,
+ rangeHoverValue,
+ startConfirmValue,
+ endConfirmValue,
+ startSelectValue,
+ endSelectValue,
+ item,
+ type
+) {
+ if (type === "week" || !item.isThisTitleRange) return false;
+ if (!rangeHoverValue) {
+ if (startSelectValue && endSelectValue) {
+ return (
+ (compareDate(startSelectValue, item, type) &&
+ compareDate(item, endSelectValue, type)) ||
+ (compareDate(endSelectValue, item, type) &&
+ compareDate(item, startSelectValue, type))
+ );
+ }
+ if (startSelectValue) {
+ return (
+ (compareDate(startSelectValue, item, type) &&
+ compareDate(item, endConfirmValue, type)) ||
+ (compareDate(endConfirmValue, item, type) &&
+ compareDate(item, startSelectValue, type))
+ );
+ } else if (endSelectValue) {
+ return (
+ (compareDate(startConfirmValue, item, type) &&
+ compareDate(item, endSelectValue, type)) ||
+ (compareDate(endSelectValue, item, type) &&
+ compareDate(item, startConfirmValue, type))
+ );
+ }
+ return (
+ compareDate(startConfirmValue, item, type) &&
+ compareDate(item, endConfirmValue, type)
+ );
+ } else {
+ if (focusState === "01") {
+ return (
+ (compareDate(rangeHoverValue, startConfirmValue, type) &&
+ compareDate(rangeHoverValue, item, type) &&
+ compareDate(item, startConfirmValue, type)) ||
+ (compareDate(startConfirmValue, rangeHoverValue, type) &&
+ compareDate(startConfirmValue, item, type) &&
+ compareDate(item, rangeHoverValue, type))
+ );
+ } else if (focusState === "10") {
+ return (
+ (compareDate(rangeHoverValue, endConfirmValue, type) &&
+ compareDate(rangeHoverValue, item, type) &&
+ compareDate(item, endConfirmValue, type)) ||
+ (compareDate(endConfirmValue, rangeHoverValue, type) &&
+ compareDate(endConfirmValue, item, type) &&
+ compareDate(item, rangeHoverValue, type))
+ );
+ }
+ }
+}
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/utils/formatFunc.js b/packages/inula2-ui/library_code/src/components/datepicker2/utils/formatFunc.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/packages/inula2-ui/library_code/src/components/datepicker2/utils/index.js b/packages/inula2-ui/library_code/src/components/datepicker2/utils/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f3a07947e00c9a086d53dc7357e2b5319a1145c
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/datepicker2/utils/index.js
@@ -0,0 +1,43 @@
+import {
+ calculateDaysInYearMonth,
+ calculateFirstWeekDayInYearMonth,
+ calculateCurWeek,
+ calculateRenderDateItems,
+ calculateRenderYQMItems,
+ calculateRenderWeekItems,
+<<<<<<< HEAD
+=======
+ calculateDateWeek,
+ calculateNextRange,
+>>>>>>> 0cc3e56 (bug: 修复datepicker选择逻辑bug,初始化rangepicker)
+ getTodayDate,
+ compareDate,
+ isEqualedDate,
+ isInRangeDate,
+ isSelected,
+} from "./calculateFunc";
+
+export {
+ calculateDaysInYearMonth,
+ calculateFirstWeekDayInYearMonth,
+ calculateCurWeek,
+ calculateRenderDateItems,
+ calculateRenderYQMItems,
+ calculateRenderWeekItems,
+<<<<<<< HEAD
+ getTodayDate,
+=======
+ calculateDateWeek,
+ calculateNextRange,
+ getTodayDate,
+ formatDate,
+ compareDate,
+ isEqualedDate,
+ isInRangeDate,
+ isSelected,
+ formatDateToYYYYMM,
+ parseDefaultToFormat,
+ formatDateToObject,
+ formatDateToYearMonth,
+>>>>>>> 0cc3e56 (bug: 修复datepicker选择逻辑bug,初始化rangepicker)
+};
diff --git a/packages/inula2-ui/library_code/src/components/icon/demo.jsx b/packages/inula2-ui/library_code/src/components/icon/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..d0cf25e7fdc29cc39aab4df7c29a5de2d93e527a
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demo.jsx
@@ -0,0 +1,28 @@
+import Icon from './index.jsx';
+import demo1 from './demos/demo1.jsx';
+import demo2 from './demos/demo2.jsx';
+import demo3 from './demos/demo3.jsx';
+import demo4 from './demos/demo4.jsx';
+import demo5 from './demos/demo5.jsx';
+
+function IconDemo() {
+ return (
+
+
+
基本Icon
+
支持实体、品牌图标,可改大小、颜色、旋转角度,支持旋转动画
+
+
+
+
+
+
+
Icon表
+
点击复制value和theme
+
+
+
+ );
+}
+
+export default IconDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..85c7d20e57999c057ecbdc9979d46f84a512ceb9
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo1.jsx
@@ -0,0 +1,22 @@
+import Icon from "../index.jsx";
+
+function IconDemo() {
+ return (
+
+
+
+ user默认实体
+
+
+
+ user实体
+
+
+
+ user实体蓝色
+
+
+ );
+}
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..f6983d5ea42b7cf0b70c90250ba149adea493834
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo2.jsx
@@ -0,0 +1,30 @@
+import Icon from "../index.jsx";
+
+function IconDemo() {
+ return (
+
+
+
+ 下箭头默认实体
+
+ {/*
+
+ 下箭头线条
+
*/}
+
+
+ 下箭头实体
+
+ {/*
+
+ 下箭头双色
+
*/}
+
+
+ 下箭头实体32px
+
+
+ );
+}
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4fc1276784063e180c3a4a2f4593a3585c2d84bc
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo3.jsx
@@ -0,0 +1,30 @@
+import Icon from "../index.jsx";
+
+function IconDemo() {
+ return (
+
+
+
+ caret-left默认实体
+
+
+
+ caret-left实体
+
+
+
+ caret-left实体蓝色
+
+
+
+ caret-left实体天蓝色旋转45
+
+
+
+ caret-left实体天蓝色旋转
+
+
+ );
+}
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7029006126c185963e6a0957d0be36fc4b121d8e
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo4.jsx
@@ -0,0 +1,30 @@
+import Icon from "../index.jsx";
+
+function IconDemo() {
+ return (
+
+
+
+ 苹果品牌图标
+
+
+
+ 苹果品牌图标32px
+
+
+
+ 苹果品牌图标绿色
+
+
+
+ 苹果品牌图标绿色旋转120度
+
+
+
+ 苹果品牌图标绿色旋转
+
+
+ );
+}
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..6a474b0d38c0a293b404a4610e1d8f1d03aeff7f
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo5.jsx
@@ -0,0 +1,51 @@
+import Icon from "../index.jsx";
+import { success, error } from "../../Notification/index.jsx";
+import "../index.css";
+import { filledIconValueList } from "./iconlist.ts";
+import Tag from "../../tag/index.jsx";
+
+const handleCopy = async (text) => {
+ try {
+ await navigator.clipboard.writeText(text);
+ success({ message: "Copy success!", placement: "top" });
+ } catch (err) {
+ error({ message: "Copy failed!", placement: "top" });
+ }
+};
+
+const IconItem = ({ value, theme }) => {
+ const text = ``;
+ return (
+ handleCopy(text)}>
+
+
+
+
{value}
+
+ );
+};
+
+const IconDemo = () => {
+ return (
+
+
+ 实体图标表
+
+
+
+ {filledIconValueList.map((value) => (
+
+ ))}
+
+
+
+ );
+};
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/demo6.jsx b/packages/inula2-ui/library_code/src/components/icon/demos/demo6.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..2c59e1d23d6fb650c560d61f4675ec6369a975b1
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/demo6.jsx
@@ -0,0 +1,43 @@
+import Icon from "../index.jsx";
+import { success, error } from "../../Notification/index.jsx";
+import "../index.css";
+import { brandIconValueList } from "./iconlist.ts";
+import Tag from "../../tag/index.jsx";
+
+const handleCopy = async (text) => {
+ try {
+ await navigator.clipboard.writeText(text);
+ success({ message: "Copy success!", placement: "top" });
+ } catch (err) {
+ error({ message: "Copy failed!", placement: "top" });
+ }
+};
+
+const IconItem = ({ value, theme }) => {
+ const text = ``;
+ return (
+ handleCopy(text)}>
+
+
+
+
{value}
+
+ );
+};
+
+const IconDemo = () => {
+ return (
+
+
+ 品牌图标表
+
+
+ {brandIconValueList.map((value) => (
+
+ ))}
+
+
+ );
+};
+
+export default IconDemo;
diff --git a/packages/inula2-ui/library_code/src/components/icon/demos/iconlist.ts b/packages/inula2-ui/library_code/src/components/icon/demos/iconlist.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90beba0aff624a7487fc4f7cdf588211274d6a5f
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/demos/iconlist.ts
@@ -0,0 +1,1852 @@
+const filledIconValueList = [
+ "house",
+ "circle-user",
+ "image",
+ "file",
+ "camera",
+ "calendar",
+ "cloud",
+ "truck",
+ "thumbs-up",
+ "face-smile",
+ "headphones",
+ "bell",
+ "user",
+ "comment",
+ "envelope",
+ "magnifying-glass",
+ "check",
+ "download",
+ "font-awesome",
+ "web-awesome",
+ "phone",
+ "bars",
+ "star",
+ "location-dot",
+ "music",
+ "wand-magic-sparkles",
+ "heart",
+ "arrow-right",
+ "circle-xmark",
+ "bomb",
+ "poo",
+ "camera-retro",
+ "x",
+ "xmark",
+ "caret-up",
+ "truck-fast",
+ "pen-nib",
+ "arrow-up",
+ "hippo",
+ "calendar-days",
+ "paperclip",
+ "shield-halved",
+ "cart-shopping",
+ "clipboard",
+ "filter",
+ "circle-info",
+ "arrow-up-from-bracket",
+ "bolt",
+ "car",
+ "ghost",
+ "mug-hot",
+ "pen",
+ "umbrella",
+ "gift",
+ "film",
+ "list",
+ "gear",
+ "trash",
+ "circle-up",
+ "circle-down",
+ "inbox",
+ "rotate-right",
+ "lock",
+ "barcode",
+ "tag",
+ "book",
+ "bookmark",
+ "print",
+ "a",
+ "font",
+ "video",
+ "circle-half-stroke",
+ "droplet",
+ "pen-to-square",
+ "share-from-square",
+ "plus",
+ "minus",
+ "share",
+ "circle-exclamation",
+ "fire",
+ "eye",
+ "eye-slash",
+ "plane",
+ "magnet",
+ "hand",
+ "folder",
+ "folder-open",
+ "money-bill",
+ "thumbs-down",
+ "comments",
+ "lemon",
+ "key",
+ "thumbtack",
+ "paper-plane",
+ "code",
+ "globe",
+ "city",
+ "ticket",
+ "tree",
+ "wifi",
+ "paint-roller",
+ "bicycle",
+ "sliders",
+ "brush",
+ "hashtag",
+ "flask",
+ "briefcase",
+ "compass",
+ "dumpster-fire",
+ "person",
+ "person-dress",
+ "address-book",
+ "bath",
+ "handshake",
+ "snowflake",
+ "right-to-bracket",
+ "earth-americas",
+ "cloud-arrow-up",
+ "binoculars",
+ "palette",
+ "layer-group",
+ "users",
+ "gamepad",
+ "business-time",
+ "feather",
+ "sun",
+ "link",
+ "pen-fancy",
+ "fish",
+ "bug",
+ "shop",
+ "mug-saucer",
+ "landmark",
+ "poo-storm",
+ "chart-simple",
+ "shirt",
+ "anchor",
+ "quote-left",
+ "bag-shopping",
+ "code-compare",
+ "user-secret",
+ "stethoscope",
+ "car-side",
+ "hand-holding-heart",
+ "truck-front",
+ "cable-car",
+ "mountain-sun",
+ "location-pin",
+ "info",
+ "user-minus",
+ "cart-plus",
+ "clock",
+ "circle",
+ "play",
+ "cross",
+ "backward",
+ "handshake-slash",
+ "chevron-up",
+ "passport",
+ "question",
+ "pencil",
+ "phone-volume",
+ "upload",
+ "strikethrough",
+ "credit-card",
+ "street-view",
+ "database",
+ "copy",
+ "mobile",
+ "square",
+ "sort",
+ "forward",
+ "hourglass-start",
+ "newspaper",
+ "notes-medical",
+ "table",
+ "building",
+ "stop",
+ "store",
+ "flag",
+ "file-excel",
+ "network-wired",
+ "cash-register",
+ "file-export",
+ "hand-point-up",
+ "angle-up",
+ "shield",
+ "address-card",
+ "expand",
+ "flag-checkered",
+ "quote-right",
+ "tags",
+ "server",
+ "user-nurse",
+ "video-slash",
+ "arrow-down",
+ "blog",
+ "school",
+ "file-invoice",
+ "rocket",
+ "spinner",
+ "tty",
+ "exclamation",
+ "water",
+ "registered",
+ "signature",
+ "laptop",
+ "restroom",
+ "power-off",
+ "sitemap",
+ "icons",
+ "desktop",
+ "moon",
+ "calendar-week",
+ "pause",
+ "file-word",
+ "vials",
+ "language",
+ "door-open",
+ "brain",
+ "hotel",
+ "marker",
+ "star-of-life",
+ "leaf",
+ "walkie-talkie",
+ "shower",
+ "caret-down",
+ "file-import",
+ "place-of-worship",
+ "wallet",
+ "slash",
+ "award",
+ "toggle-on",
+ "ship",
+ "chalkboard",
+ "hands",
+ "signal",
+ "motorcycle",
+ "arrow-up-right-from-square",
+ "audio-description",
+ "square",
+ "seedling",
+ "closed-captioning",
+ "train",
+ "arrow-left",
+ "wrench",
+ "microchip",
+ "record-vinyl",
+ "trophy",
+ "hammer",
+ "diamond",
+ "robot",
+ "file-pdf",
+ "hospital",
+ "file-contract",
+ "square-xmark",
+ "square-check",
+ "crown",
+ "user-plus",
+ "virus",
+ "child",
+ "repeat",
+ "cube",
+ "copyright",
+ "medal",
+ "bullseye",
+ "mask",
+ "circle-check",
+ "radio",
+ "reply",
+ "chair",
+ "route",
+ "plug",
+ "calculator",
+ "dragon",
+ "certificate",
+ "fingerprint",
+ "road",
+ "crosshairs",
+ "heading",
+ "percent",
+ "user-tie",
+ "square-minus",
+ "i-cursor",
+ "church",
+ "joint",
+ "comments-dollar",
+ "truck-monster",
+ "recycle",
+ "warehouse",
+ "ruler",
+ "soap",
+ "scroll",
+ "wind",
+ "coins",
+ "baby",
+ "voicemail",
+ "puzzle-piece",
+ "keyboard",
+ "clone",
+ "eraser",
+ "wine-bottle",
+ "dice",
+ "receipt",
+ "ring",
+ "unlock",
+ "solar-panel",
+ "ruler-vertical",
+ "circle-notch",
+ "people-arrows",
+ "dollar-sign",
+ "tablet",
+ "not-equal",
+ "glasses",
+ "headset",
+ "code-branch",
+ "gopuram",
+ "images",
+ "window-restore",
+ "industry",
+ "stamp",
+ "microphone-slash",
+ "cookie-bite",
+ "otter",
+ "chevron-down",
+ "kiwi-bird",
+ "viruses",
+ "umbrella-beach",
+ "subscript",
+ "tablets",
+ "microphone",
+ "border-none",
+ "dumbbell",
+ "plane-departure",
+ "yin-yang",
+ "yen-sign",
+ "xmarks-lines",
+ "x-ray",
+ "worm",
+ "won-sign",
+ "wine-glass-empty",
+ "wine-glass",
+ "window-minimize",
+ "window-maximize",
+ "whiskey-glass",
+ "wheelchair-move",
+ "wheelchair",
+ "wheat-awn-circle-exclamation",
+ "wheat-awn",
+ "weight-scale",
+ "weight-hanging",
+ "wave-square",
+ "water-ladder",
+ "wand-magic",
+ "vr-cardboard",
+ "wand-sparkles",
+ "volume-xmark",
+ "volume-off",
+ "volume-low",
+ "volume-high",
+ "volleyball",
+ "volcano",
+ "virus-slash",
+ "virus-covid-slash",
+ "virus-covid",
+ "vihara",
+ "vial-virus",
+ "vial-circle-check",
+ "vial",
+ "vest-patches",
+ "vest",
+ "venus-mars",
+ "venus-double",
+ "venus",
+ "vector-square",
+ "vault",
+ "van-shuttle",
+ "utensils",
+ "users-viewfinder",
+ "users-slash",
+ "users-rectangle",
+ "users-rays",
+ "users-line",
+ "users-gear",
+ "users-between-lines",
+ "user-xmark",
+ "user-tag",
+ "user-slash",
+ "user-shield",
+ "user-pen",
+ "user-ninja",
+ "user-lock",
+ "user-large-slash",
+ "user-large",
+ "user-injured",
+ "user-group",
+ "user-graduate",
+ "user-gear",
+ "user-doctor",
+ "user-clock",
+ "user-check",
+ "user-astronaut",
+ "up-right-from-square",
+ "up-right-and-down-left-from-center",
+ "up-long",
+ "up-down-left-right",
+ "up-down",
+ "unlock-keyhole",
+ "universal-access",
+ "underline",
+ "turn-up",
+ "turn-down",
+ "turkish-lira-sign",
+ "truck-ramp-box",
+ "truck-plane",
+ "truck-pickup",
+ "truck-moving",
+ "truck-medical",
+ "truck-field-un",
+ "truck-field",
+ "truck-droplet",
+ "truck-arrow-right",
+ "trowel-bricks",
+ "trowel",
+ "triangle-exclamation",
+ "tree-city",
+ "trash-can-arrow-up",
+ "trash-can",
+ "trash-arrow-up",
+ "transgender",
+ "train-tram",
+ "train-subway",
+ "trailer",
+ "traffic-light",
+ "tractor",
+ "tower-observation",
+ "tower-cell",
+ "tower-broadcast",
+ "tornado",
+ "torii-gate",
+ "tooth",
+ "toolbox",
+ "toilets-portable",
+ "toilet-portable",
+ "toilet-paper-slash",
+ "toilet-paper",
+ "toilet",
+ "toggle-off",
+ "timeline",
+ "ticket-simple",
+ "thumbtack-slash",
+ "thermometer",
+ "text-width",
+ "text-slash",
+ "text-height",
+ "terminal",
+ "tents",
+ "tent-arrows-down",
+ "tent-arrow-turn-left",
+ "tent-arrow-left-right",
+ "tent-arrow-down-to-line",
+ "tent",
+ "tenge-sign",
+ "temperature-three-quarters",
+ "temperature-quarter",
+ "temperature-low",
+ "temperature-high",
+ "temperature-half",
+ "temperature-full",
+ "temperature-empty",
+ "temperature-arrow-up",
+ "temperature-arrow-down",
+ "teeth-open",
+ "teeth",
+ "taxi",
+ "tarp-droplet",
+ "tarp",
+ "tape",
+ "tachograph-digital",
+ "tablet-screen-button",
+ "tablet-button",
+ "table-tennis-paddle-ball",
+ "table-list",
+ "table-columns",
+ "table-cells-row-unlock",
+ "table-cells-row-lock",
+ "table-cells-large",
+ "table-cells-column-lock",
+ "table-cells",
+ "syringe",
+ "synagogue",
+ "superscript",
+ "swatchbook",
+ "sun-plant-wilt",
+ "suitcase-rolling",
+ "suitcase-medical",
+ "suitcase",
+ "stroopwafel",
+ "store-slash",
+ "stopwatch-20",
+ "stopwatch",
+ "sterling-sign",
+ "star-of-david",
+ "star-half-stroke",
+ "star-half",
+ "star-and-crescent",
+ "stapler",
+ "stairs",
+ "staff-snake",
+ "square-virus",
+ "square-up-right",
+ "square-share-nodes",
+ "square-rss",
+ "square-root-variable",
+ "square-poll-vertical",
+ "square-poll-horizontal",
+ "square-plus",
+ "square-phone-flip",
+ "square-phone",
+ "square-person-confined",
+ "square-pen",
+ "square-parking",
+ "square-nfi",
+ "square-h",
+ "square-full",
+ "square-envelope",
+ "square-caret-up",
+ "square-binary",
+ "square-caret-down",
+ "square-caret-right",
+ "square-caret-left",
+ "square-arrow-up-right",
+ "spray-can-sparkles",
+ "spray-can",
+ "splotch",
+ "spider",
+ "spell-check",
+ "spaghetti-monster-flying",
+ "sort-up",
+ "sort-down",
+ "socks",
+ "snowplow",
+ "snowman",
+ "smoking",
+ "smog",
+ "sleigh",
+ "skull-crossbones",
+ "skull",
+ "sink",
+ "sim-card",
+ "signs-post",
+ "sign-hanging",
+ "shuttle-space",
+ "shuffle",
+ "shrimp",
+ "shop-slash",
+ "shop-lock",
+ "shoe-prints",
+ "shield-virus",
+ "shield-heart",
+ "shield-dog",
+ "shield-cat",
+ "shekel-sign",
+ "sheet-plastic",
+ "share-nodes",
+ "shapes",
+ "section",
+ "sd-card",
+ "scroll-torah",
+ "screwdriver-wrench",
+ "screwdriver",
+ "scissors",
+ "school-lock",
+ "school-flag",
+ "school-circle-exclamation",
+ "school-circle-xmark",
+ "school-circle-check",
+ "scale-unbalanced-flip",
+ "scale-unbalanced",
+ "scale-balanced",
+ "satellite-dish",
+ "satellite",
+ "sailboat",
+ "sack-xmark",
+ "sack-dollar",
+ "rupiah-sign",
+ "rupee-sign",
+ "ruler-horizontal",
+ "ruler-combined",
+ "ruble-sign",
+ "rug",
+ "rss",
+ "rotate-left",
+ "rotate",
+ "road-spikes",
+ "road-lock",
+ "road-circle-xmark",
+ "road-circle-exclamation",
+ "road-circle-check",
+ "road-bridge",
+ "road-barrier",
+ "right-long",
+ "right-left",
+ "right-from-bracket",
+ "ribbon",
+ "retweet",
+ "republican",
+ "reply-all",
+ "rectangle-xmark",
+ "rectangle-list",
+ "rectangle-ad",
+ "ranking-star",
+ "rainbow",
+ "radiation",
+ "qrcode",
+ "pump-medical",
+ "prescription-bottle-medical",
+ "prescription-bottle",
+ "prescription",
+ "podcast",
+ "plus-minus",
+ "plug-circle-xmark",
+ "plug-circle-plus",
+ "plug-circle-minus",
+ "plug-circle-exclamation",
+ "plug-circle-check",
+ "plug-circle-bolt",
+ "plate-wheat",
+ "plant-wilt",
+ "plane-up",
+ "plane-slash",
+ "plane-lock",
+ "plane-circle-xmark",
+ "plane-circle-exclamation",
+ "plane-circle-check",
+ "plane-arrival",
+ "pizza-slice",
+ "pills",
+ "piggy-bank",
+ "photo-film",
+ "phone-slash",
+ "phone-flip",
+ "peso-sign",
+ "peseta-sign",
+ "person-walking-with-cane",
+ "person-walking-luggage",
+ "person-walking-dashed-line-arrow-right",
+ "person-walking-arrow-right",
+ "person-walking-arrow-loop-left",
+ "person-walking",
+ "person-through-window",
+ "person-swimming",
+ "person-snowboarding",
+ "person-skiing-nordic",
+ "person-skiing",
+ "person-skating",
+ "person-shelter",
+ "person-running",
+ "person-rifle",
+ "person-rays",
+ "person-praying",
+ "person-military-to-person",
+ "person-pregnant",
+ "person-military-rifle",
+ "person-military-pointing",
+ "person-hiking",
+ "person-harassing",
+ "person-half-dress",
+ "person-falling-burst",
+ "person-falling",
+ "person-drowning",
+ "person-dress-burst",
+ "person-dots-from-line",
+ "person-digging",
+ "person-circle-xmark",
+ "person-circle-question",
+ "person-circle-exclamation",
+ "person-circle-plus",
+ "person-circle-minus",
+ "person-circle-check",
+ "person-chalkboard",
+ "person-cane",
+ "person-burst",
+ "person-breastfeeding",
+ "person-booth",
+ "person-biking",
+ "person-arrow-up-from-line",
+ "person-arrow-down-to-line",
+ "pepper-hot",
+ "people-roof",
+ "people-robbery",
+ "people-pulling",
+ "people-line",
+ "people-group",
+ "people-carry-box",
+ "pen-ruler",
+ "pen-clip",
+ "peace",
+ "paw",
+ "paste",
+ "parachute-box",
+ "pallet",
+ "paragraph",
+ "panorama",
+ "paintbrush",
+ "pager",
+ "outdent",
+ "oil-well",
+ "oil-can",
+ "object-ungroup",
+ "object-group",
+ "note-sticky",
+ "neuter",
+ "naira-sign",
+ "mountain-city",
+ "mountain",
+ "mound",
+ "mosquito-net",
+ "mosquito",
+ "mosque",
+ "mortar-pestle",
+ "monument",
+ "money-check-dollar",
+ "money-check",
+ "money-bills",
+ "money-bill-wheat",
+ "money-bill-wave",
+ "money-bill-trend-up",
+ "money-bill-transfer",
+ "money-bill-1-wave",
+ "money-bill-1",
+ "mobile-screen-button",
+ "mobile-screen",
+ "mobile-retro",
+ "mobile-button",
+ "mitten",
+ "minimize",
+ "mill-sign",
+ "microscope",
+ "microphone-lines-slash",
+ "microphone-lines",
+ "meteor",
+ "message",
+ "mercury",
+ "menorah",
+ "memory",
+ "maximize",
+ "mattress-pillow",
+ "masks-theater",
+ "mask-ventilator",
+ "mask-face",
+ "martini-glass-empty",
+ "martini-glass-citrus",
+ "martini-glass",
+ "mars-stroke-up",
+ "mars-stroke-right",
+ "mars-stroke",
+ "mars-double",
+ "mars-and-venus-burst",
+ "mars-and-venus",
+ "mars",
+ "map-pin",
+ "map-location-dot",
+ "map-location",
+ "map",
+ "manat-sign",
+ "magnifying-glass-plus",
+ "magnifying-glass-minus",
+ "magnifying-glass",
+ "magnifying-glass-dollar",
+ "magnifying-glass-chart",
+ "magnifying-glass-arrow-right",
+ "lungs-virus",
+ "lungs",
+ "locust",
+ "lock-open",
+ "location-pin-lock",
+ "location-crosshairs",
+ "location-arrow",
+ "litecoin-sign",
+ "list-ul",
+ "list-ol",
+ "list-check",
+ "lira-sign",
+ "link-slash",
+ "lines-leaning",
+ "life-ring",
+ "less-than-equal",
+ "less-than",
+ "left-right",
+ "left-long",
+ "lari-sign",
+ "laptop-medical",
+ "laptop-file",
+ "laptop-code",
+ "landmark-flag",
+ "landmark-dome",
+ "land-mine-on",
+ "kitchen-set",
+ "kit-medical",
+ "kip-sign",
+ "khanda",
+ "kaaba",
+ "jug-detergent",
+ "jet-fighter-up",
+ "jet-fighter",
+ "jedi",
+ "jar-wheat",
+ "jar",
+ "italic",
+ "infinity",
+ "indian-rupee-sign",
+ "indent",
+ "image-portrait",
+ "igloo",
+ "id-card-clip",
+ "id-card",
+ "id-badge",
+ "icicles",
+ "ice-cream",
+ "hurricane",
+ "hryvnia-sign",
+ "house-user",
+ "house-tsunami",
+ "house-signal",
+ "house-medical-flag",
+ "house-medical-circle-exclamation",
+ "house-medical-circle-xmark",
+ "house-medical-circle-check",
+ "house-medical",
+ "house-flood-water-circle-arrow-right",
+ "house-lock",
+ "house-laptop",
+ "house-flood-water",
+ "house-flag",
+ "house-fire",
+ "house-crack",
+ "house-circle-xmark",
+ "house-circle-exclamation",
+ "house-circle-check",
+ "house-chimney-window",
+ "house-chimney-user",
+ "house-chimney-medical",
+ "house-chimney-crack",
+ "house-chimney",
+ "hourglass-half",
+ "hourglass-end",
+ "hourglass",
+ "hotdog",
+ "hot-tub-person",
+ "hospital-user",
+ "horse-head",
+ "horse",
+ "holly-berry",
+ "hockey-puck",
+ "hill-rockslide",
+ "hill-avalanche",
+ "highlighter",
+ "hexagon-nodes-bolt",
+ "hexagon-nodes",
+ "helmet-un",
+ "helmet-safety",
+ "helicopter-symbol",
+ "helicopter",
+ "heart-pulse",
+ "heart-crack",
+ "heart-circle-xmark",
+ "heart-circle-plus",
+ "heart-circle-minus",
+ "heart-circle-exclamation",
+ "headphones-simple",
+ "heart-circle-check",
+ "heart-circle-bolt",
+ "head-side-virus",
+ "head-side-mask",
+ "head-side-cough-slash",
+ "head-side-cough",
+ "hat-wizard",
+ "hat-cowboy-side",
+ "hat-cowboy",
+ "hard-drive",
+ "hanukiah",
+ "handshake-simple-slash",
+ "handshake-simple",
+ "handshake-angle",
+ "hands-praying",
+ "hands-holding-circle",
+ "hands-holding-child",
+ "hands-holding",
+ "hands-clapping",
+ "hands-bubbles",
+ "hands-bound",
+ "hands-asl-interpreting",
+ "handcuffs",
+ "hand-spock",
+ "hand-sparkles",
+ "hand-scissors",
+ "hand-pointer",
+ "hand-point-right",
+ "hand-point-left",
+ "hand-point-down",
+ "hand-peace",
+ "hand-middle-finger",
+ "hand-lizard",
+ "hand-holding-medical",
+ "hand-holding-hand",
+ "hand-holding-droplet",
+ "hand-holding-dollar",
+ "hand-holding",
+ "hand-fist",
+ "hand-dots",
+ "hand-back-fist",
+ "hamsa",
+ "gun",
+ "guitar",
+ "guarani-sign",
+ "group-arrows-rotate",
+ "grip-vertical",
+ "grip-lines-vertical",
+ "grip-lines",
+ "grip",
+ "greater-than-equal",
+ "greater-than",
+ "graduation-cap",
+ "golf-ball-tee",
+ "glass-water-droplet",
+ "glass-water",
+ "gifts",
+ "genderless",
+ "gem",
+ "gavel",
+ "gauge-simple-high",
+ "gauge-simple",
+ "gauge-high",
+ "gas-pump",
+ "futbol",
+ "frog",
+ "franc-sign",
+ "forward-step",
+ "forward-fast",
+ "football",
+ "folder-tree",
+ "folder-plus",
+ "folder-minus",
+ "folder-closed",
+ "florin-sign",
+ "floppy-disk",
+ "flask-vial",
+ "flag-usa",
+ "fish-fins",
+ "fire-flame-simple",
+ "fire-flame-curved",
+ "fire-extinguisher",
+ "fire-burner",
+ "filter-circle-xmark",
+ "filter-circle-dollar",
+ "fill-drip",
+ "fill",
+ "file-zipper",
+ "file-waveform",
+ "file-video",
+ "file-signature",
+ "file-shield",
+ "file-prescription",
+ "file-powerpoint",
+ "file-pen",
+ "file-medical",
+ "file-lines",
+ "file-invoice-dollar",
+ "file-image",
+ "file-half-dashed",
+ "file-fragment",
+ "file-csv",
+ "file-code",
+ "file-circle-xmark",
+ "file-circle-question",
+ "file-circle-plus",
+ "file-circle-minus",
+ "file-circle-exclamation",
+ "file-circle-check",
+ "file-audio",
+ "file-arrow-up",
+ "file-arrow-down",
+ "ferry",
+ "feather-pointed",
+ "fax",
+ "faucet-drip",
+ "faucet",
+ "fan",
+ "face-tired",
+ "face-surprise",
+ "face-smile-wink",
+ "face-smile-beam",
+ "face-sad-tear",
+ "face-sad-cry",
+ "face-rolling-eyes",
+ "face-meh-blank",
+ "face-meh",
+ "face-laugh-wink",
+ "face-laugh-squint",
+ "face-laugh-beam",
+ "face-laugh",
+ "face-kiss-wink-heart",
+ "face-kiss-beam",
+ "face-kiss",
+ "face-grin-wink",
+ "face-grin-wide",
+ "face-grin-tongue-wink",
+ "face-grin-tongue-squint",
+ "face-grin-tongue",
+ "face-grin-tears",
+ "face-grin-stars",
+ "face-grin-squint-tears",
+ "face-grin-squint",
+ "face-grin-hearts",
+ "face-grin-beam-sweat",
+ "face-grin-beam",
+ "face-grin",
+ "face-grimace",
+ "face-frown-open",
+ "face-frown",
+ "face-flushed",
+ "face-dizzy",
+ "face-angry",
+ "eye-low-vision",
+ "eye-dropper",
+ "explosion",
+ "euro-sign",
+ "ethernet",
+ "equals",
+ "envelopes-bulk",
+ "envelope-open-text",
+ "envelope-open",
+ "envelope-circle-check",
+ "ellipsis-vertical",
+ "ellipsis",
+ "elevator",
+ "eject",
+ "egg",
+ "earth-oceania",
+ "earth-europe",
+ "earth-asia",
+ "earth-africa",
+ "ear-listen",
+ "ear-deaf",
+ "dungeon",
+ "drumstick-bite",
+ "drum",
+ "dumpster",
+ "drum-steelpan",
+ "droplet-slash",
+ "draw-polygon",
+ "down-long",
+ "down-left-and-up-right-to-center",
+ "dove",
+ "door-closed",
+ "dong-sign",
+ "dolly",
+ "dog",
+ "dna",
+ "divide",
+ "display",
+ "disease",
+ "dice-two",
+ "dice-three",
+ "dice-six",
+ "dice-one",
+ "dice-four",
+ "dice-five",
+ "dice-d6",
+ "dice-d20",
+ "diamond-turn-right",
+ "diagram-successor",
+ "diagram-project",
+ "diagram-predecessor",
+ "diagram-next",
+ "dharmachakra",
+ "democrat",
+ "delete-left",
+ "cubes-stacked",
+ "cubes",
+ "cruzeiro-sign",
+ "crutch",
+ "crow",
+ "crop-simple",
+ "crop",
+ "cow",
+ "couch",
+ "cookie",
+ "computer-mouse",
+ "computer",
+ "compress",
+ "compass-drafting",
+ "compact-disc",
+ "comment-sms",
+ "comment-slash",
+ "comment-nodes",
+ "comment-medical",
+ "comment-dots",
+ "comment-dollar",
+ "colon-sign",
+ "code-pull-request",
+ "code-merge",
+ "code-fork",
+ "code-commit",
+ "clover",
+ "cloud-sun-rain",
+ "cloud-sun",
+ "cloud-showers-water",
+ "cloud-showers-heavy",
+ "cloud-rain",
+ "cloud-moon-rain",
+ "cloud-moon",
+ "cloud-meatball",
+ "cloud-bolt",
+ "cloud-arrow-down",
+ "clock-rotate-left",
+ "clipboard-user",
+ "clipboard-question",
+ "clipboard-list",
+ "clipboard-check",
+ "clapperboard",
+ "circle-stop",
+ "circle-right",
+ "circle-radiation",
+ "circle-question",
+ "circle-plus",
+ "circle-play",
+ "circle-pause",
+ "circle-nodes",
+ "circle-minus",
+ "circle-left",
+ "circle-h",
+ "circle-dot",
+ "circle-dollar-to-slot",
+ "circle-chevron-up",
+ "circle-chevron-right",
+ "circle-chevron-left",
+ "circle-chevron-down",
+ "circle-arrow-up",
+ "circle-arrow-right",
+ "circle-arrow-left",
+ "circle-arrow-down",
+ "children",
+ "child-reaching",
+ "child-dress",
+ "child-combatant",
+ "chevron-right",
+ "chevron-left",
+ "chess-rook",
+ "chess-queen",
+ "chess-pawn",
+ "chess-knight",
+ "chess-king",
+ "chess-board",
+ "chess-bishop",
+ "chess",
+ "cheese",
+ "check-to-slot",
+ "check-double",
+ "chart-pie",
+ "chart-line",
+ "chart-gantt",
+ "chart-diagram",
+ "chart-column",
+ "chart-bar",
+ "chart-area",
+ "charging-station",
+ "champagne-glasses",
+ "chalkboard-user",
+ "cent-sign",
+ "cedi-sign",
+ "cat",
+ "cart-flatbed-suitcase",
+ "cart-flatbed",
+ "cart-arrow-down",
+ "carrot",
+ "caret-right",
+ "caret-left",
+ "caravan",
+ "car-tunnel",
+ "car-rear",
+ "car-on",
+ "car-burst",
+ "car-battery",
+ "capsules",
+ "cannabis",
+ "candy-cane",
+ "campground",
+ "camera-rotate",
+ "calendar-xmark",
+ "calendar-plus",
+ "calendar-minus",
+ "calendar-day",
+ "calendar-check",
+ "cake-candles",
+ "bus-simple",
+ "bus",
+ "burst",
+ "burger",
+ "bullhorn",
+ "building-wheat",
+ "building-user",
+ "building-un",
+ "building-shield",
+ "building-ngo",
+ "building-lock",
+ "building-flag",
+ "building-columns",
+ "building-circle-xmark",
+ "building-circle-exclamation",
+ "building-circle-check",
+ "building-circle-arrow-right",
+ "bugs",
+ "bug-slash",
+ "bucket",
+ "broom-ball",
+ "broom",
+ "briefcase-medical",
+ "bridge-water",
+ "bridge-lock",
+ "bridge-circle-xmark",
+ "bridge-circle-exclamation",
+ "bridge-circle-check",
+ "bridge",
+ "brazilian-real-sign",
+ "braille",
+ "bread-slice",
+ "boxes-stacked",
+ "boxes-packing",
+ "box-tissue",
+ "box-open",
+ "box-archive",
+ "box",
+ "bowling-ball",
+ "bowl-rice",
+ "bowl-food",
+ "bottle-water",
+ "bottle-droplet",
+ "bore-hole",
+ "border-top-left",
+ "border-all",
+ "book-tanakh",
+ "book-skull",
+ "book-quran",
+ "book-open-reader",
+ "book-open",
+ "book-medical",
+ "book-journal-whills",
+ "book-bookmark",
+ "book-bible",
+ "book-atlas",
+ "bong",
+ "bone",
+ "bolt-lightning",
+ "bold",
+ "blender-phone",
+ "blender",
+ "bitcoin-sign",
+ "biohazard",
+ "bezier-curve",
+ "bell-slash",
+ "bell-concierge",
+ "beer-mug-empty",
+ "bed-pulse",
+ "bed",
+ "battery-three-quarters",
+ "battery-quarter",
+ "battery-half",
+ "battery-full",
+ "battery-empty",
+ "basketball",
+ "basket-shopping",
+ "baseball-bat-ball",
+ "baseball",
+ "bars-staggered",
+ "bars-progress",
+ "bangladeshi-taka-sign",
+ "bandage",
+ "ban-smoking",
+ "ban",
+ "baht-sign",
+ "bahai",
+ "bacterium",
+ "bacteria",
+ "bacon",
+ "backward-step",
+ "backward-fast",
+ "baby-carriage",
+ "austral-sign",
+ "atom",
+ "asterisk",
+ "arrows-up-to-line",
+ "arrows-up-down-left-right",
+ "arrows-up-down",
+ "arrows-turn-to-dots",
+ "arrows-turn-right",
+ "arrows-to-eye",
+ "arrows-to-dot",
+ "arrows-to-circle",
+ "arrows-split-up-and-left",
+ "arrows-spin",
+ "arrows-rotate",
+ "arrows-left-right-to-line",
+ "arrows-left-right",
+ "arrows-down-to-people",
+ "arrows-down-to-line",
+ "arrow-up-z-a",
+ "arrow-up-wide-short",
+ "arrow-up-short-wide",
+ "arrow-up-right-dots",
+ "arrow-up-long",
+ "arrow-up-from-water-pump",
+ "arrow-up-from-ground-water",
+ "arrow-up-a-z",
+ "arrow-up-9-1",
+ "arrow-up-1-9",
+ "arrow-turn-up",
+ "arrow-turn-down",
+ "arrow-trend-up",
+ "arrow-trend-down",
+ "arrow-rotate-right",
+ "arrow-rotate-left",
+ "arrow-right-to-city",
+ "arrow-right-to-bracket",
+ "arrow-right-long",
+ "arrow-right-from-bracket",
+ "arrow-right-arrow-left",
+ "arrow-pointer",
+ "arrow-left-long",
+ "arrow-down-up-across-line",
+ "arrow-down-z-a",
+ "arrow-down-wide-short",
+ "arrow-down-up-lock",
+ "arrow-down-short-wide",
+ "arrow-down-long",
+ "arrow-down-a-z",
+ "arrow-down-9-1",
+ "arrow-down-1-9",
+ "archway",
+ "apple-whole",
+ "ankh",
+ "angles-up",
+ "angles-right",
+ "angles-left",
+ "angles-down",
+ "angle-right",
+ "angle-left",
+ "angle-down",
+ "anchor-lock",
+ "anchor-circle-xmark",
+ "anchor-circle-exclamation",
+ "anchor-circle-check",
+ "align-right",
+ "align-left",
+ "align-justify",
+ "align-center",
+ "a",
+ "9",
+ "8",
+ "7",
+ "6",
+ "5",
+ "4",
+ "3",
+ "2",
+ "1",
+ "0",
+];
+
+const brandIconValueList = [
+ "font-awesome",
+ "web-awesome",
+ "github",
+ "bluesky",
+ "facebook",
+ "linkedin",
+ "discord",
+ "slack",
+ "algolia",
+ "figma",
+ "youtube",
+ "apple",
+ "google",
+ "pied-piper-hat",
+ "kickstarter",
+ "docker",
+ "instagram",
+ "tiktok",
+ "wordpress",
+ "stripe",
+ "windows",
+ "paypal",
+ "stack-overflow",
+ "dribbble",
+ "dropbox",
+ "squarespace",
+ "android",
+ "shopify",
+ "medium",
+ "codepen",
+ "cloudflare",
+ "airbnb",
+ "vimeo",
+ "whatsapp",
+ "intercom",
+ "wix",
+ "line",
+ "behance",
+ "openid",
+ "product-hunt",
+ "internet-explorer",
+ "pagelines",
+ "teamspeak",
+ "html5",
+ "telegram",
+ "pinterest",
+ "dashcube",
+ "ideal",
+ "salesforce",
+ "readme",
+ "free-code-camp",
+ "soundcloud",
+ "square-twitter",
+ "accessible-icon",
+ "visa",
+ "cc-visa",
+ "goodreads-g",
+ "google-play",
+ "react",
+ "wikipedia-w",
+ "square-js",
+ "square-pinterest",
+ "python",
+ "skype",
+ "linux",
+ "node",
+ "rebel",
+ "etsy",
+ "discourse",
+ "amazon",
+ "glide-g",
+ "gitlab",
+ "spotify",
+ "think-peaks",
+ "microsoft",
+ "elementor",
+ "square-youtube",
+ "cc-mastercard",
+ "facebook-messenger",
+ "atlassian",
+ "playstation",
+ "fly",
+ "meetup",
+ "twitch",
+ "waze",
+ "zhihu",
+ "yoast",
+ "yelp",
+ "yarn",
+ "yandex-international",
+ "yandex",
+ "yammer",
+ "yahoo",
+ "y-combinator",
+ "xing",
+ "xbox",
+ "x-twitter",
+ "wpressr",
+ "wpforms",
+ "wpexplorer",
+ "wpbeginner",
+ "wordpress-simple",
+ "wolf-pack-battalion",
+ "wodu",
+ "wizards-of-the-coast",
+ "wirsindhandwerk",
+ "whmcs",
+ "weixin",
+ "weibo",
+ "weebly",
+ "webflow",
+ "watchman-monitoring",
+ "vuejs",
+ "vine",
+ "vimeo-v",
+ "viber",
+ "viadeo",
+ "viacoin",
+ "vaadin",
+ "ussunnah",
+ "usb",
+ "upwork",
+ "untappd",
+ "unsplash",
+ "unity",
+ "uniregistry",
+ "uncharted",
+ "umbraco",
+ "uikit",
+ "ubuntu",
+ "uber",
+ "typo3",
+ "twitter",
+ "tumblr",
+ "trello",
+ "trade-federation",
+ "threads",
+ "themeisle",
+ "themeco",
+ "the-red-yeti",
+ "tencent-weibo",
+ "symfony",
+ "swift",
+ "suse",
+ "supple",
+ "superpowers",
+ "stumbleupon-circle",
+ "stumbleupon",
+ "studiovinari",
+ "stubber",
+ "stripe-s",
+ "strava",
+ "sticker-mule",
+ "steam-symbol",
+ "steam",
+ "staylinked",
+ "stackpath",
+ "stack-exchange",
+ "square-xing",
+ "square-x-twitter",
+ "square-whatsapp",
+ "square-web-awesome-stroke",
+ "square-web-awesome",
+ "square-vimeo",
+ "square-viadeo",
+ "square-upwork",
+ "square-tumblr",
+ "square-threads",
+ "square-steam",
+ "square-snapchat",
+ "square-reddit",
+ "square-pied-piper",
+ "square-odnoklassniki",
+ "square-lastfm",
+ "square-letterboxd",
+ "square-instagram",
+ "square-hacker-news",
+ "square-google-plus",
+ "square-gitlab",
+ "square-github",
+ "git",
+ "square-git",
+ "square-font-awesome-stroke",
+ "square-font-awesome",
+ "square-facebook",
+ "square-dribbble",
+ "square-bluesky",
+ "square-behance",
+ "speaker-deck",
+ "speakap",
+ "space-awesome",
+ "sourcetree",
+ "snapchat",
+ "slideshare",
+ "skyatlas",
+ "sketch",
+ "sitrox",
+ "sith",
+ "sistrix",
+ "simplybuilt",
+ "signal-messenger",
+ "shopware",
+ "shoelace",
+ "shirtsinbulk",
+ "servicestack",
+ "sellsy",
+ "sellcast",
+ "searchengin",
+ "scribd",
+ "screenpal",
+ "schlix",
+ "safari",
+ "rust",
+ "rockrms",
+ "rocketchat",
+ "resolving",
+ "researchgate",
+ "replyd",
+ "renren",
+ "redhat",
+ "reddit-alien",
+ "reddit",
+ "red-river",
+ "reacteurope",
+ "ravelry",
+ "raspberry-pi",
+ "r-project",
+ "quinscape",
+ "quora",
+ "pushed",
+ "pixiv",
+ "pix",
+ "pinterest-p",
+ "pied-piper-pp",
+ "pied-piper-alt",
+ "pied-piper",
+ "php",
+ "phoenix-squadron",
+ "phoenix-framework",
+ "phabricator",
+ "periscope",
+ "perbyte",
+ "patreon",
+ "palfed",
+ "page4",
+ "padlet",
+ "osi",
+ "orcid",
+ "optin-monster",
+ "opera",
+ "opensuse",
+ "opencart",
+ "old-republic",
+ "odysee",
+ "odnoklassniki",
+ "octopus-deploy",
+ "nutritionix",
+ "ns8",
+ "npm",
+ "node-js",
+ "nimblr",
+ "nfc-directional",
+ "neos",
+ "napster",
+ "monero",
+ "modx",
+ "mizuni",
+ "mixer",
+ "mixcloud",
+ "mix",
+ "mintbit",
+ "microblog",
+ "meta",
+ "mendeley",
+ "megaport",
+ "medrt",
+ "medapps",
+ "mdb",
+ "maxcdn",
+ "mastodon",
+ "markdown",
+ "mandalorian",
+ "mailchimp",
+ "magento",
+ "lyft",
+ "linode",
+ "linkedin-in",
+ "letterboxd",
+ "less",
+ "leanpub",
+ "lastfm",
+ "laravel",
+ "korvue",
+ "kickstarter-k",
+ "keycdn",
+ "keybase",
+ "kaggle",
+ "jxl",
+ "jsfiddle",
+ "joomla",
+ "joget",
+ "jira",
+ "jenkins",
+ "jedi-order",
+ "itunes-note",
+ "itunes",
+ "itch-io",
+ "ioxhost",
+ "invision",
+ "instalod",
+ "imdb",
+ "hubspot",
+ "houzz",
+ "hotjar",
+ "hornbill",
+ "hooli",
+ "hive",
+ "hire-a-helper",
+ "hips",
+ "hashnode",
+ "hackerrank",
+ "hacker-news",
+ "gulp",
+ "guilded",
+ "grunt",
+ "gripfire",
+ "gratipay",
+ "google-wallet",
+ "google-scholar",
+ "google-plus-g",
+ "google-plus",
+ "google-pay",
+ "google-drive",
+ "goodreads",
+ "golang",
+ "glide",
+ "gofore",
+ "gitter",
+ "gitkraken",
+ "github-alt",
+ "git-alt",
+ "git",
+ "gg-circle",
+ "get-pocket",
+ "galactic-senate",
+ "galactic-republic",
+ "fulcrum",
+ "freebsd",
+ "foursquare",
+ "forumbee",
+ "font-awesome-alt",
+ "fort-awesome",
+ "fonticons-fi",
+ "fonticons",
+ "flutter",
+ "flipboard",
+ "flickr",
+ "firstdraft",
+ "first-order-alt",
+ "first-order",
+ "firefox-browser",
+ "firefox",
+ "files-pinwheel",
+ "fedora",
+ "fedex",
+ "fantasy-flight-games",
+ "facebook-f",
+ "expeditedssl",
+ "evernote",
+ "ethereum",
+ "erlang",
+ "envira",
+ "empire",
+ "ember",
+ "ello",
+ "edge-legacy",
+ "edge",
+ "ebay",
+ "earlybirds",
+ "dyalog",
+ "drupal",
+ "draft2digital",
+ "dochub",
+ "digital-ocean",
+ "digg",
+ "diaspora",
+ "dhl",
+ "deviantart",
+ "dev",
+ "deskpro",
+ "deploydog",
+ "delicious",
+ "deezer",
+ "debian",
+ "dart-lang",
+ "dailymotion",
+ "d-and-d-beyond",
+ "d-and-d",
+ "cuttlefish",
+ "css3-alt",
+ "critical-role",
+ "creative-commons-zero",
+ "creative-commons-share",
+ "creative-commons-sampling-plus",
+ "creative-commons-sampling",
+ "creative-commons-remix",
+ "creative-commons-pd",
+ "creative-commons-nd",
+ "creative-commons-nc-jp",
+ "creative-commons-nc-eu",
+ "creative-commons-nc",
+ "creative-commons-by",
+ "creative-commons",
+ "cpanel",
+ "cotton-bureau",
+ "contao",
+ "connectdevelop",
+ "confluence",
+ "codiepie",
+ "cloudversify",
+ "cloudsmith",
+ "cloudscale",
+ "chromecast",
+ "chrome",
+ "centos",
+ "centercode",
+ "cc-stripe",
+ "cc-paypal",
+ "cc-jcb",
+ "cc-discover",
+ "cc-diners-club",
+ "cc-apple-pay",
+ "cc-amex",
+ "cc-amazon-pay",
+ "canadian-maple-leaf",
+ "buysellads",
+ "buy-n-large",
+ "buromobelexperte",
+ "buffer",
+ "btc",
+ "brave-reverse",
+ "brave",
+ "bootstrap",
+ "bluetooth",
+ "blogger",
+ "blackberry",
+ "black-tie",
+ "bity",
+ "bitcoin",
+ "bitbucket",
+ "bimobject",
+ "bilibili",
+ "battle-net",
+ "bandcamp",
+ "aws",
+ "aviato",
+ "avianex",
+ "autoprefixer",
+ "audible",
+ "asymmetrik",
+ "artstation",
+ "apple-pay",
+ "apper",
+ "app-store-ios",
+ "app-store",
+ "angular",
+ "angrycreative",
+ "angellist",
+ "amilia",
+ "amazon-pay",
+ "alipay",
+ "affiliatetheme",
+ "adversal",
+ "adn",
+ "accusoft",
+ "500px",
+ "42-group",
+];
+
+export { filledIconValueList, brandIconValueList };
diff --git a/packages/inula2-ui/library_code/src/components/icon/index.css b/packages/inula2-ui/library_code/src/components/icon/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..dd58a0e4a56968c94caafb9bb167d369f8b27e6d
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/index.css
@@ -0,0 +1,54 @@
+.inula-icon {
+ font-size: 24px;
+ color: var(--inula-icon-default);
+}
+
+@keyframes icon-spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+.inula-icon-spin {
+ animation: icon-spin 1.5s linear infinite;
+ transform-origin: center center;
+}
+
+/* Icon表样式 */
+.inula-icon-table {
+ width: 80%;
+ height: 600px;
+ overflow-y: scroll;
+ border: 1px solid #f0f0f0;
+ background-color: #fAf8f9;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ align-items: flex-start;
+ padding: 20px;
+ gap:20px;
+}
+
+.inula-icon-item {
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ border-radius: 1px solid #f0f0f0;
+ height: 90px;
+ width: 10%;
+ padding: 20px;
+ justify-content: flex-start;
+ gap: 20px;
+ border-radius: 8px;
+}
+
+.inula-icon-item:hover {
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ transform: scale(1.01);
+ transition: all 0.3s ease-in-out;
+ cursor: pointer;
+}
+
+.inula-icon-item-text {
+ font-size: 16px;
+ font-family: "宋体";
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/icon/index.jsx b/packages/inula2-ui/library_code/src/components/icon/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..a36f246478fb3cfa9415120eb99dba32951ef826
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/icon/index.jsx
@@ -0,0 +1,65 @@
+import "./index.css";
+
+const Icon = ({
+ value,
+ // theme = "outline", // outline, filled, twoTone
+ theme = "filled", // filled, brand
+ size, //number
+ color, //string
+ rotate, //number
+ spin = false,
+ style,
+ onClick,
+ ...rest
+}) => {
+ // const iconTheme = (theme) => {
+ // switch (theme) {
+ // case "filled":
+ // return "fas";
+ // case "twoTone":
+ // return "fad";
+ // default:
+ // return "fal";
+ // }
+ // };
+ const iconTheme = (theme) => {
+ switch (theme) {
+ case "filled":
+ return "fas";
+ case "brand":
+ return "fab";
+ default:
+ alert(`Invalid theme: ${theme}`);
+ return "";
+ }
+ };
+
+ const classNames = [
+ "inula-icon",
+ iconTheme(theme),
+ value ? `fa-${value}` : "",
+ spin ? "inula-icon-spin" : "" // 新增动画类
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const styles = {
+ ...style,
+ ...(rotate && { transform: `rotate(${rotate}deg)` }),
+ fontSize: `${size}px`,
+ color: `${color}`,
+ }
+
+ // console.log("Icon props:", rest);
+
+ return (
+
+ );
+};
+
+export default Icon;
diff --git a/packages/inula2-ui/library_code/src/components/spin/demo.jsx b/packages/inula2-ui/library_code/src/components/spin/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..3900520b2666258d1d739589b25a032cbf77f117
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demo.jsx
@@ -0,0 +1,36 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+import demo4 from "./demos/demo4.jsx";
+import demo5 from "./demos/demo5.jsx";
+
+const SpinDemo = () => {
+ return (
+
+
+
+
+
嵌套状态样式
+
包裹子组件且不为全屏状态情况,加载覆盖子组件、自定义tip
+
+
+
+
带delay延迟触发加载动画
+
+
+
+
全屏覆盖加载动画
+
+
+
+
永不停止的进度条加载
+
+
+
+ )
+}
+
+export default SpinDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/spin/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/spin/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..72e5e53d7c01dd223515effa367bdbda7babe6e2
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demos/demo1.jsx
@@ -0,0 +1,21 @@
+import Spin from "../index.jsx";
+
+const SpinDemo = () => {
+
+ return (
+
+
+ 最简单的Spin
+
+
+
+ 小中大的Spin
+
+
+
+
+
+ );
+};
+
+export default SpinDemo;
diff --git a/packages/inula2-ui/library_code/src/components/spin/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/spin/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..8a71b7a0f6d21ef9db7a8b795b6edf95e4068f1a
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demos/demo2.jsx
@@ -0,0 +1,74 @@
+import Spin from "../index.jsx";
+import Switch from "../../switch/index.jsx";
+const SpinDemo = () => {
+ let loading = false;
+
+ return (
+
+
+
简单嵌套状态
+
+
+ 这是子组件
+
+
+
(loading = !loading)} />
+ 切换嵌套组件的加载状态
+
+
+
自定义tip的Spin,小中大样式
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SpinDemo;
diff --git a/packages/inula2-ui/library_code/src/components/spin/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/spin/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..2585139086d967ca15c31ae45e951e10240b095e
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demos/demo3.jsx
@@ -0,0 +1,41 @@
+import Spin from "../index.jsx";
+import Switch from "../../switch/index.jsx";
+const SpinDemo = () => {
+ let loading = false;
+
+ return (
+
+
+
+ 点击延迟一秒触发加载
+
+
+
+ 这是子组件
+
+
+
(loading = !loading)} />
+ 延迟触发切换状态按钮
+
+
+ );
+};
+
+export default SpinDemo;
diff --git a/packages/inula2-ui/library_code/src/components/spin/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/spin/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..9a213e56afeb194b976a5dcdd7411477e7dbac5c
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demos/demo4.jsx
@@ -0,0 +1,29 @@
+import Spin from "../index.jsx";
+import Button from "../../button/index.jsx";
+const SpinDemo = () => {
+ let showFullScreen = false;
+ let percent = -100;
+
+ const showLoader = () => {
+ showFullScreen = true;
+ const interval = setInterval(() => {
+ percent += 10;
+ if (percent >= 100) {
+ clearInterval(interval);
+ showFullScreen = false;
+ percent = -100;
+ }
+ }, 100);
+ };
+
+ return (
+
+ );
+};
+
+export default SpinDemo;
diff --git a/packages/inula2-ui/library_code/src/components/spin/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/spin/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1a5d904e1511426f0aee4cc6ebd2dcb2b5e1d6cb
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/demos/demo5.jsx
@@ -0,0 +1,54 @@
+import Spin from "../index.jsx";
+import Switch from "../../switch/index.jsx";
+const SpinDemo = () => {
+ let auto = false;
+ let percent = -50;
+
+ watch(() => {
+ if (auto) {
+ percent = "auto";
+ return;
+ } else {
+ percent = -50;
+ const interval = setInterval(() => {
+ percent += 10;
+ if (percent >= 100) {
+ percent = -50;
+ }
+ }, 100);
+
+ return () => {
+ clearInterval(interval);
+ };
+ }
+ });
+
+ return (
+
+
+
+
+
+
+
+ (auto = !auto)}
+ unCheckedChildren="auto"
+ checkedChildren="auto"
+ />
+ 点击切换auto,进度条永不停止
+
+
+ );
+};
+
+export default SpinDemo;
diff --git a/packages/inula2-ui/library_code/src/components/spin/index.css b/packages/inula2-ui/library_code/src/components/spin/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..6153477f72f347f950107eeff262dfb61b5bcdd9
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/index.css
@@ -0,0 +1,211 @@
+.inula-spin-wrapper {
+ position: relative;
+}
+
+.inula-spin-fullscreen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.6);
+ z-index: 100;
+ display: none;
+}
+
+.inula-spin-fullscreen-show {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.inula-spin-indicator {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 5px;
+}
+
+/* 旋转动画 */
+.inula-spin-indicator-rotate {
+ position: relative;
+ animation: inula-spin-rotate 1.2s linear infinite;
+}
+
+@keyframes inula-spin-rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/* 尺寸适配 */
+.inula-spin-indicator-rotate-default {
+ width: 20px;
+ height: 20px;
+}
+
+.inula-spin-indicator-rotate-small {
+ width: 14px;
+ height: 14px;
+}
+
+.inula-spin-indicator-rotate-large {
+ width: 32px;
+ height: 32px;
+}
+
+.inula-spin-indicator-dot {
+ position: absolute;
+ width: 36%;
+ height: 36%;
+ border-radius: 50%;
+}
+
+/* 四个点的位置、动画 */
+.inula-spin-indicator-dot0 {
+ top: 0;
+ left: 0;
+ background-color: #3b8cff;
+}
+
+.inula-spin-indicator-dot1 {
+ top: 0;
+ right: 0;
+ background-color: #3388ff;
+}
+
+.inula-spin-indicator-dot2 {
+ bottom: 0;
+ left: 0;
+ background-color: #81b5ff;
+}
+
+.inula-spin-indicator-dot3 {
+ bottom: 0;
+ right: 0;
+ background-color: #b0d1ff;
+}
+
+/* 新增提示样式 */
+.inula-spin-tip {
+ font-size: 16px;
+ color: var(--inula-color-primary);
+}
+
+/* 带children的spin */
+.loading-container {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 255, 255, 0.6);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ position: absolute;
+ z-index: 10;
+ top: 0;
+ left: 0;
+}
+
+/* 进度条 */
+.inula-spin-progress {
+ position: relative;
+ width: 44px;
+ height: 10px;
+ border-radius: 5px;
+ background-color: #f5f5f5;
+}
+
+.inula-spin-progres-small {
+ width: 32px;
+ height: 6px;
+ border-radius: 3px;
+}
+
+.inula-spin-progress-large {
+ width: 64px;
+ height: 14px;
+ border-radius: 7px;
+}
+
+.inula-spin-progress-track {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ background-color: var(--inula-color-primary);
+ z-index: 10;
+ border-radius: 5px;
+}
+
+.inula-spin-progress-track-small {
+ border-radius: 3px;
+}
+
+.inula-spin-progress-track-large {
+ border-radius: 7px;
+}
+
+
+/* .outer {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.6);
+ z-index: 100;
+ display: none;
+}
+
+.left {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow: hidden;
+}
+
+.leftcircle {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 160px;
+ height: 160px;
+ border: 20px solid #999;
+ border-radius: 50%;
+ border-bottom-color: yellowgreen;
+ border-left-color: yellowgreen;
+ transform: rotate(-135deg);
+
+ transition: transform 0.05s;
+}
+
+.right {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow: hidden;
+}
+
+.rightcircle {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 160px;
+ height: 160px;
+ border: 20px solid #999;
+ border-radius: 50%;
+ border-top-color: yellowgreen;
+ border-right-color: yellowgreen;
+ transform: rotate(-135deg);
+
+ transition: transform 0.05s;
+} */
diff --git a/packages/inula2-ui/library_code/src/components/spin/index.jsx b/packages/inula2-ui/library_code/src/components/spin/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..950faf180305277d298ec9979f682017915ed32a
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/spin/index.jsx
@@ -0,0 +1,182 @@
+import "./index.css";
+
+// 防抖函数
+const debounce = (delay, fn) => {
+ let timer = null;
+ return function () {
+ const context = this;
+ const args = arguments;
+ clearTimeout(timer);
+ timer = setTimeout(() => {
+ fn.apply(context, args);
+ }, delay);
+ };
+};
+
+function shouldDelay(spinning, delay) {
+ return !!spinning && !!delay && !Number.isNaN(Number(delay));
+}
+
+const Spin = ({
+ delay,
+ fullscreen = false,
+ indicator,
+ percent, //number | "auto"
+ size = "default",
+ spinning = true,
+ tip,
+ wrapperClassName,
+ className,
+ children,
+ style,
+ maxProgressWidth = 44,
+ ...rest
+}) => {
+ let isNestedPattern = typeof children !== "undefined" && !fullscreen;
+ let customSpinning = spinning && !shouldDelay(spinning, delay);
+
+ let infiniteProgress = percent === "auto" ? 0 : null;
+
+ if (size === "large") {
+ maxProgressWidth = 64;
+ } else if (size === "small") {
+ maxProgressWidth = 32;
+ }
+
+ // let rightTransform =
+ // percent * 3.6 >= 0
+ // ? `rotate(${-135 + Math.min(percent * 3.6, 180)}deg)`
+ // : "rotate(-135deg)";
+ // let leftTransform =
+ // percent * 3.6 >= 180 + 150
+ // ? `rotate(${-135 + Math.min(percent * 3.6 - 180, 180)}deg)`
+ // : "rotate(-135deg)";
+
+ watch(() => {
+ if (percent === "auto") {
+ const interval = setInterval(() => {
+ infiniteProgress = (infiniteProgress + 1) % 100;
+ }, 100);
+
+ return () => {
+ clearInterval(interval);
+ };
+ }
+
+ if (spinning && delay) {
+ const showSpinning = debounce(delay, () => {
+ customSpinning = true;
+ });
+
+ showSpinning();
+
+ return () => {
+ showSpinning?.cancel();
+ customSpinning = false;
+ };
+ }
+ });
+
+ const classNames = [
+ "inula-spin-wrapper",
+ wrapperClassName,
+ fullscreen && "inula-spin-fullscreen",
+ fullscreen && customSpinning && "inula-spin-fullscreen-show",
+ ]
+ .filter(Boolean)
+ .join(" ");
+ const styles = { ...style };
+
+ const SpinIndicator = () => {
+ if (indicator) {
+ return indicator;
+ }
+ if (percent >= 0 || percent === "auto") {
+ return (
+
+ //
+ );
+ }
+
+ const itemClassNames = (index) => {
+ return ["inula-spin-indicator-dot", `inula-spin-indicator-dot${index}`]
+ .filter(Boolean)
+ .join(" ");
+ };
+
+ const rotateContainerClassNames = [
+ "inula-spin-indicator-rotate",
+ `inula-spin-indicator-rotate-${size}`,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+
+
+ {Array(4)
+ .fill(0)
+ .map((_, index) => (
+
+ ))}
+
+ {tip && (isNestedPattern || fullscreen) ? (
+
{tip}
+ ) : null}
+
+ );
+ };
+
+ if (isNestedPattern) {
+ return (
+
+ {customSpinning && (
+
+
+
+ )}
+ {children}
+
+ );
+ }
+
+ if (fullscreen) {
+ return (
+
+ {customSpinning && }
+
+ );
+ }
+
+ return (
+
+ {customSpinning && }
+
+ );
+};
+
+export default Spin;
diff --git a/packages/inula2-ui/library_code/src/components/switch/demo.jsx b/packages/inula2-ui/library_code/src/components/switch/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..a88a5b86a038fd41875ce13de6521516c5d4751f
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/demo.jsx
@@ -0,0 +1,26 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+
+const SwitchDemo = () => {
+ return (
+
+ )
+}
+
+export default SwitchDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/switch/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/switch/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..dc1c9a1305b48f059a7944eb021b97b8a2aa8ae0
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/demos/demo1.jsx
@@ -0,0 +1,53 @@
+import Switch from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const SwitchDemo = () => {
+ let checked = false;
+
+ return (
+
+
+ 默认型号、小号开关
+
+ 默认型号
+
+ 小号
+
+
+ 默认选中
+
+ 默认选中
+
+
+ 禁用开关
+
+ 默认选中禁用
+
+ 禁用
+
+
+ );
+};
+
+export default SwitchDemo;
diff --git a/packages/inula2-ui/library_code/src/components/switch/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/switch/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..3c17a13673672905419ccc7150b636f531f9ec1e
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/demos/demo2.jsx
@@ -0,0 +1,28 @@
+import Switch from "../index.jsx";
+import Button from "../../button/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const SwitchDemo = () => {
+ let checked = false;
+
+ return (
+
+
+ 外部受控开关
+
+ 选中
+
+
+
+
+ );
+};
+
+export default SwitchDemo;
diff --git a/packages/inula2-ui/library_code/src/components/switch/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/switch/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1a9cc3934b4ec5a1bcd66ded10e4a93db09b5bed
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/demos/demo3.jsx
@@ -0,0 +1,33 @@
+import Switch from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const SwitchDemo = () => {
+ return (
+
+
+ 带内容的开关
+
+
+ }
+ unCheckedChildren={}
+ defaultChecked
+ />
+
+
+ );
+};
+
+export default SwitchDemo;
diff --git a/packages/inula2-ui/library_code/src/components/switch/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/switch/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7caa21699919f77ad0df9c290994cdb567cd6f23
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/demos/demo4.jsx
@@ -0,0 +1,23 @@
+import Switch from "../index.jsx";
+import Tag from "../../tag/index.jsx";
+
+const SwitchDemo = () => {
+ return (
+
+ );
+};
+
+export default SwitchDemo;
diff --git a/packages/inula2-ui/library_code/src/components/switch/index.css b/packages/inula2-ui/library_code/src/components/switch/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..c3b0cdcee8a9d421a5e2a4f68624415a3b8f8f45
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/index.css
@@ -0,0 +1,146 @@
+.inula-switch,
+.inula-switch-default {
+ min-width: 48px;
+ height: 22px;
+ border-radius: 11px;
+ background-color: var(--inula-switch-default-bg);
+ position: relative;
+}
+
+.inula-switch:hover {
+ cursor: pointer;
+ background-color: var(--inula-switch-default-hover-bg);
+ transition: background-color 0.2s ease-in-out;
+}
+
+.inula-switch-expand {
+ min-width: 100%;
+ opacity: 0;
+ padding: 0 13px;
+}
+
+/* 切换手柄按钮 */
+.inula-switch-btn {
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background-color: #fff;
+ position: absolute;
+ top: 2px;
+ left: 2px;
+ transition: all 0.3s ease-in-out;
+ box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
+}
+
+.inula-switch-btn-checked {
+ left: calc(100% - 20px);
+}
+
+/* 非选中禁用状态 */
+.inula-switch-disabled {
+ background-color: var(--inula-switch-disabled-bg);
+ cursor: not-allowed;
+}
+
+.inula-switch-disabled:hover {
+ background-color: var(--inula-switch-disabled-bg);
+ cursor: not-allowed;
+}
+
+/* 选中状态 */
+.inula-switch-checked {
+ background-color: var(--inula-switch-checked-bg);
+ transition: background-color 0.3s ease-in-out;
+}
+
+.inula-switch-checked:hover {
+ background-color: var(--inula-switch-checked-hover-bg);
+}
+
+/* 选中禁用状态 */
+.inula-switch-checked-disabled {
+ background-color: var(--inula-switch-checked-disabled-bg);
+ cursor: not-allowed !important;
+}
+
+.inula-switch-checked-disabled:hover {
+ background-color: var(--inula-switch-checked-disabled-bg);
+}
+
+.inula-switch-content {
+ width: calc(100% - 18px);
+ text-align: center;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 12px;
+ color: #fff;
+ right: 0;
+ transition: transform 0.3s;
+}
+
+.inula-switch-content-checked {
+ right: unset;
+ left: 0;
+}
+
+/* loading样式 */
+.inula-switch-loading:hover {
+ cursor: not-allowed;
+ background-color: var(--inula-switch-default-bg) !important;
+}
+
+.inula-switch-checked-loading:hover {
+ cursor: not-allowed;
+ background-color: var(--inula-switch-checked-bg) !important;
+}
+
+.inula-switch-loading-circle {
+ position: absolute;
+ width: 12px;
+ height: 12px;
+ border: 1px solid var(--inula-switch-checked-disabled-bg);
+ border-top-color: #fff;
+ border-bottom-color: #fff;
+ border-left-color: #fff;
+ border-radius: 50%;
+ animation: inula-switch-spin 0.8s linear infinite;
+ top: 2px;
+ left: 2px;
+}
+
+@keyframes inula-switch-spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+
+/* 小尺寸开关 */
+.inula-switch-small {
+ min-width: 28px;
+ height: 16px;
+ border-radius: 8px;
+}
+
+.inula-switch-small .inula-switch-btn {
+ width: 12px;
+ height: 12px;
+}
+
+.inula-switch-small .inula-switch-btn-checked {
+ left: calc(100% - 14px);
+}
+
+.inula-switch-small .inula-switch-content {
+ width: calc(100% - 12px);
+ font-size: 10px;
+}
+
+.inula-switch-small .inula-switch-loading-circle {
+ width: 8px;
+ height: 8px;
+}
diff --git a/packages/inula2-ui/library_code/src/components/switch/index.jsx b/packages/inula2-ui/library_code/src/components/switch/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..92ea639270e0d1504c5a65c6d50c97769ab09146
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/switch/index.jsx
@@ -0,0 +1,109 @@
+import "./index.css";
+
+const Switch = ({
+ defaultChecked = false,
+ defaultValue = defaultChecked,
+ disabled = false,
+ loading = false,
+ size = "default", //default, small
+ checked,
+ onChange,
+ onClick,
+ className,
+ style,
+ checkedChildren,
+ unCheckedChildren,
+}) => {
+ let isChecked = checked !== undefined ? checked : defaultChecked || defaultValue;
+
+ const classNames = (
+ isChecked
+ ? [
+ "inula-switch",
+ "inula-switch-checked",
+ size && `inula-switch-${size}`,
+ disabled && "inula-switch-checked-disabled",
+ loading && "inula-switch-checked-loading",
+ className,
+ ]
+ : [
+ "inula-switch",
+ size && `inula-switch-${size}`,
+ disabled && "inula-switch-disabled",
+ loading && "inula-switch-loading",
+ className,
+ ]
+ )
+ .filter(Boolean)
+ .join(" ");
+
+ // console.log("classNames", classNames);
+
+ const btnClassNames = [
+ "inula-switch-btn",
+ isChecked ? "inula-switch-btn-checked" : "",
+ loading && "inula-switch-loading"
+ ].filter(Boolean).join(" ");
+
+ const contentClassNames = [
+ "inula-switch-content",
+ isChecked ? "inula-switch-content-checked" : "",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const styles = {
+ ...style,
+ };
+
+ const handleSwitchChange = (e) => {
+
+ if (disabled || loading) return;
+
+ if (checked !== undefined) {
+ e.target.checked = checked;
+ isChecked = checked;
+ if (onChange) {
+ onChange(e);
+ }
+ if (onClick) {
+ onClick(e);
+ }
+ return;
+ }
+
+ isChecked = e.target.checked;
+ if (onChange) {
+ onChange(e);
+ }
+ if (onClick) {
+ onClick(e);
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default Switch;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demo.jsx b/packages/inula2-ui/library_code/src/components/tabs/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..e373bfc1d720a73eb91d4861875169b8906c9b34
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demo.jsx
@@ -0,0 +1,105 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+import demo4 from "./demos/demo4.jsx";
+import demo5 from "./demos/demo5.jsx";
+import demo6 from "./demos/demo6.jsx";
+import demo7 from "./demos/demo7.jsx";
+import demo8 from "./demos/demo8.jsx";
+import demo9 from "./demos/demo9.jsx";
+import demo10 from "./demos/demo10.jsx";
+import demo11 from "./demos/demo11.jsx";
+
+const TabsDemo = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
指示条
+
设置 indicator 属性,自定义指示条宽度和对齐方式。
+
+
+
+
+
+
位置
+
有四个位置,tabPosition="left|right|top|bottom"。
+
+
+
+
+
+
大小
+
有三种大小,size="small|middle|large"。
+
+
+
+
+
+
新增和关闭标签
+
只有卡片样式的页签支持新增和关闭选项。使用 closable={false} 禁止关闭。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TabsDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..d48b2a5383b7089268ee37de2f2acf4a204aa43c
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo1.jsx
@@ -0,0 +1,39 @@
+import Tabs from "../index.jsx";
+
+const TabsDemo = () => {
+
+ const onChange = (key) => {
+ console.log(key);
+ };
+
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+
+ return (
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo10.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo10.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1ee34271960a87a7992710d006d6d9176e8b9521
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo10.jsx
@@ -0,0 +1,43 @@
+import Tabs from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+import Button from "../../button/index.jsx";
+
+const LeftExtraContent = ;
+const RightExtraContent = ;
+
+const TabsDemo = () => {
+ let tabBarExtraContent = { left: LeftExtraContent, right: RightExtraContent };
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ icon: ,
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+ return (
+
+ );
+};
+
+export default TabsDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo11.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo11.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4694809e469da837b4323bcabdf45b032a1ec786
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo11.jsx
@@ -0,0 +1,40 @@
+import Tabs from "../index.jsx";
+import Button from "../../button/index.jsx";
+
+const TabsDemo = () => {
+ let mode = "top";
+
+ return (
+
+
+ {
+ const id = String(i);
+ return {
+ label: `Tab-${id}`,
+ key: id,
+ disabled: i === 28,
+ children: `Content of tab ${id}`,
+ };
+ })}
+ />
+
+
+
+
+
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..96a9f0fb6a3d021aad92d4975ffaf29541aa27c1
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo2.jsx
@@ -0,0 +1,39 @@
+import Tabs from "../index.jsx";
+
+const TabsDemo = () => {
+ const onChange = (key) => {
+ console.log(key);
+ };
+
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ disabled: true,
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+
+ return (
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..dfd34cda3dbc0778f135fea1f02f0a49eeb572d4
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo3.jsx
@@ -0,0 +1,35 @@
+import Tabs from "../index.jsx";
+
+const TabsDemo = () => {
+ const onChange = (key) => {
+ console.log(key);
+ };
+ return (
+
+
+ {
+ const id = String(i + 1);
+ return {
+ label: `Tab ${id}`,
+ key: id,
+ children: `Content of Tab Pane ${id}`,
+ };
+ })}
+ centered
+ defaultActiveKey="1"
+ onChange={onChange}
+ />
+
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..8ac43876c9d967978be5f5bfd7c2178cb28204bc
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo4.jsx
@@ -0,0 +1,35 @@
+import Tabs from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+
+const TabsDemo = () => {
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ icon: ,
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ icon: ,
+ },
+ ];
+ return (
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..0baabf0864a5f50ab34de0a6e8c85d682a4e9169
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo5.jsx
@@ -0,0 +1,47 @@
+import Tabs from "../index.jsx";
+import Button from "../../button/index.jsx";
+
+const TabsDemo = () => {
+ let indicator = "center"; // start | center | end | { size?: number | (origin: number) => number; align: start | center | end; } 自定义指示器长度和对齐方式
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+ return (
+
+
+ origin - 20, align: indicator }} />
+
+
+
+
+
+
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo6.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo6.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..26fec0e9636eaf3d11b18285ee4e37b27a260b39
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo6.jsx
@@ -0,0 +1,48 @@
+import Tabs from "../index.jsx";
+import Button from "../../button/index.jsx";
+
+const TabsDemo = () => {
+ let pos = "top"; // top | bottom | left | right
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo7.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo7.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..065371dc273fedb753da445603c5cdc8be8a8ca7
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo7.jsx
@@ -0,0 +1,55 @@
+import Tabs from "../index.jsx";
+import Button from "../../button/index.jsx";
+
+const TabsDemo = () => {
+ let size = "default"; //small | default | large
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3" },
+ ];
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo8.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo8.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..5b7b040374987d577ba96989fcad0974c7ab1a86
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo8.jsx
@@ -0,0 +1,27 @@
+import Tabs from "../index.jsx";
+
+const TabsDemo = () => {
+ const items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ { key: "3", label: "Tab 3", children: "Content of Tab Pane 3", closable: false },
+ ];
+
+ return (
+
+ )
+}
+
+export default TabsDemo;
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/components/tabs/demos/demo9.jsx b/packages/inula2-ui/library_code/src/components/tabs/demos/demo9.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..8f33bee439b804f356425d3a4137db5ccfca24e4
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/demos/demo9.jsx
@@ -0,0 +1,80 @@
+import Button from "../../button/index.jsx";
+import Tabs from "../index.jsx";
+
+const TabsDemo = () => {
+ let items = [
+ {
+ key: "1",
+ label: "Tab 1",
+ children: "Content of Tab Pane 1",
+ },
+ {
+ key: "2",
+ label: "Tab 2",
+ children: "Content of Tab Pane 2",
+ },
+ {
+ key: "3",
+ label: "Tab 3",
+ children: "Content of Tab Pane 3",
+ closable: false,
+ },
+ ];
+ let MyActiveKey;
+ let newTabIndex = 0;
+
+ const add = () => {
+ const newMyActiveKey = `newTab${newTabIndex++}`;
+ items.push({
+ label: "New Tab",
+ children: "New Tab Pane",
+ key: newMyActiveKey,
+ });
+ MyActiveKey = newMyActiveKey;
+ };
+
+ const remove = (targetKey) => {
+ const targetIndex = items.findIndex((item) => item.key === targetKey);
+ const newItems = items.filter((item) => item.key !== targetKey);
+ const index =
+ targetIndex === newItems.length ? targetIndex - 1 : targetIndex;
+ MyActiveKey =
+ items.length && targetKey === MyActiveKey
+ ? items[index].key
+ : MyActiveKey;
+ items = newItems;
+ };
+
+ const onEdit = (targetKey, action) => {
+ if (action === "add") {
+ add();
+ } else {
+ remove(targetKey);
+ }
+ };
+ return (
+
+ );
+};
+
+export default TabsDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tabs/index.css b/packages/inula2-ui/library_code/src/components/tabs/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..f906caedfbade1ffc8e49d7118fe622e8d59d422
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/index.css
@@ -0,0 +1,381 @@
+.inula-tabs {
+ max-width: 100%;
+ min-height: 150px;
+ display: flex;
+}
+
+/* 选项卡bar布局 */
+.inula-tabs-bar {
+ display: flex;
+ justify-content: flex-start;
+ max-width: 100%;
+ /* type=line */
+ gap: 32px;
+ transition: all 0.3s ease-in-out;
+}
+
+.inula-tabs-bar text {
+ transition: all 0.3s ease-in-out;
+}
+
+/* 选项卡额外内容布局 */
+.inula-tabs-bar-extra-content-left {
+ height: 100%;
+ display: flex;
+ align-items: center;
+}
+
+.inula-tabs-bar-extra-content-left.inula-tabs-bar-pos-left,
+.inula-tabs-bar-extra-content-left.inula-tabs-bar-pos-right {
+ width: 100%;
+ justify-content: center;
+}
+
+.inula-tabs-bar-extra-content-right {
+ height: 100%;
+ display: flex;
+ flex: 1;
+ align-items: center;
+ justify-content: flex-end;
+}
+
+.inula-tabs-bar-extra-content-right.inula-tabs-bar-pos-left,
+.inula-tabs-bar-extra-content-right.inula-tabs-bar-pos-right {
+ width: 100%;
+ align-items: flex-end;
+ justify-content: center;
+}
+
+/* 选项卡相对bar位置布局 */
+.inula-tabs-bar.inula-tabs-bar-left {
+ justify-content: flex-start;
+}
+
+.inula-tabs-bar.inula-tabs-bar-center {
+ justify-content: center;
+}
+
+.inula-tabs-bar.inula-tabs-bar-right {
+ justify-content: flex-end;
+}
+
+/* 选项卡整体位置布局 */
+.inula-tabs-bar.inula-tabs-bar-pos-top,
+.inula-tabs-bar.inula-tabs-bar-pos-bottom {
+ max-width: 100%;
+ height: 48px;
+ flex-direction: row;
+
+ overflow-x: scroll;
+ overflow-y: hidden;
+ /* 隐藏滚动条 */
+ scrollbar-width: none;
+}
+
+.inula-tabs-bar.inula-tabs-bar-pos-left,
+.inula-tabs-bar.inula-tabs-bar-pos-right {
+ max-height: 100%;
+ min-width: 80px;
+ flex-direction: column;
+
+ overflow-x: hidden;
+ overflow-y: scroll;
+ /* 隐藏滚动条 */
+ scrollbar-width: none;
+}
+
+.inula-tabs-bar.inula-tabs-bar-pos-top {
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.inula-tabs-bar.inula-tabs-bar-pos-bottom {
+ border-top: 1px solid #f0f0f0;
+}
+
+.inula-tabs-bar.inula-tabs-bar-pos-left {
+ border-right: 1px solid #f0f0f0;
+}
+
+.inula-tabs-bar.inula-tabs-bar-pos-right {
+ border-left: 1px solid #f0f0f0;
+}
+
+.inula-tabs.inula-tabs-bar-pos-top {
+ flex-direction: column;
+ justify-content: flex-start;
+}
+
+.inula-tabs.inula-tabs-bar-pos-bottom {
+ flex-direction: column-reverse;
+ justify-content: flex-end;
+}
+
+.inula-tabs.inula-tabs-bar-pos-left {
+ flex-direction: row;
+ justify-content: flex-start;
+}
+
+.inula-tabs.inula-tabs-bar-pos-right {
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+}
+
+/* 选项卡item */
+.inula-tabs-bar-item {
+ display: flex;
+ align-items: center;
+ white-space: nowrap;
+ gap: 14px;
+ color: rgba(0, 0, 0, 0.88);
+}
+
+.inula-tabs-bar-item-content {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-pos-top,
+.inula-tabs-bar-item.inula-tabs-bar-pos-bottom {
+ height: 100%;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-pos-left,
+.inula-tabs-bar-item.inula-tabs-bar-pos-right {
+ width: 100%;
+ justify-content: center;
+}
+
+.inula-tabs-bar-item .inula-icon {
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.88);
+}
+
+/* 选项卡item hover状态样式 */
+.inula-tabs-bar-item-content:hover > .inula-icon,
+.inula-tabs-bar-item-content:hover text {
+ cursor: pointer;
+ color: var(--inula-color-primary-hover);
+ transition: color 0.1s ease-in-out;
+}
+
+/* 选项卡item disabled状态样式 */
+.inula-tabs-bar-item.inula-tabs-bar-item-disabled .inula-icon,
+.inula-tabs-bar-item.inula-tabs-bar-item-disabled text {
+ color: rgba(0, 0, 0, 0.25);
+ cursor: not-allowed;
+}
+
+/** ---type=line--- **/
+/* 选项卡item active状态样式 */
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active
+ .inula-icon,
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active text {
+ color: var(--inula-color-primary);
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active {
+ position: relative;
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active::after {
+ content: "";
+ position: absolute;
+ background-color: var(--inula-color-text);
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-top::after {
+ bottom: 0;
+ left: 0;
+ width: var(--indicator-size);
+ height: 2px;
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom::after {
+ top: 0;
+ left: 0;
+ width: var(--indicator-size);
+ height: 2px;
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-left::after {
+ top: 0;
+ right: 0;
+ height: var(--indicator-size);
+ width: 2px;
+}
+
+.inula-tabs-bar-item-line.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-right::after {
+ top: 0;
+ left: 0;
+ height: var(--indicator-size);
+ width: 2px;
+}
+
+/**--- indicator ---**/
+/**--- indicator ---**/
+/* 水平方向对齐 */
+.inula-tabs-bar-indicator-start.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-top::after,
+.inula-tabs-bar-indicator-start.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom::after {
+ left: 0;
+}
+
+.inula-tabs-bar-indicator-center.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-top::after,
+.inula-tabs-bar-indicator-center.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom::after {
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+.inula-tabs-bar-indicator-end.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-top::after,
+.inula-tabs-bar-indicator-end.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom::after {
+ left: unset;
+ right: 0;
+}
+
+/* 垂直方向对齐 */
+.inula-tabs-bar-indicator-start.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-left::after,
+.inula-tabs-bar-indicator-start.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-right::after {
+ top: 0;
+}
+
+.inula-tabs-bar-indicator-center.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-left::after,
+.inula-tabs-bar-indicator-center.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-right::after {
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.inula-tabs-bar-indicator-end.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-left::after,
+.inula-tabs-bar-indicator-end.inula-tabs-bar-item-line.inula-tabs-bar-item-active.inula-tabs-bar-pos-right::after {
+ bottom: 0;
+}
+
+/** ---type=card || editable-card--- **/
+.inula-tabs-bar.inula-tabs-bar-card,
+.inula-tabs-bar.inula-tabs-bar-editable-card {
+ gap: 2px;
+}
+
+.inula-tabs-bar.inula-tabs-bar-card.inula-tabs-bar-pos-top,
+.inula-tabs-bar.inula-tabs-bar-card.inula-tabs-bar-pos-bottom,
+.inula-tabs-bar.inula-tabs-bar-editable-card.inula-tabs-bar-pos-top,
+.inula-tabs-bar.inula-tabs-bar-editable-card.inula-tabs-bar-pos-bottom {
+ height: 32px;
+}
+
+.inula-tabs-bar.inula-tabs-bar-card.inula-tabs-bar-pos-left,
+.inula-tabs-bar.inula-tabs-bar-card.inula-tabs-bar-pos-right,
+.inula-tabs-bar.inula-tabs-bar-editable-card.inula-tabs-bar-pos-left,
+.inula-tabs-bar.inula-tabs-bar-editable-card.inula-tabs-bar-pos-right {
+ min-width: 80px;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-card,
+.inula-tabs-bar-item.inula-tabs-bar-item-editable-card {
+ background-color: #fafafa;
+ border: 1px solid #f0f0f0;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-card.inula-tabs-bar-pos-top,
+.inula-tabs-bar-item.inula-tabs-bar-item-editable-card.inula-tabs-bar-pos-top {
+ border-radius: 8px 8px 0 0;
+ padding: 0 16px;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-card.inula-tabs-bar-pos-bottom,
+.inula-tabs-bar-item.inula-tabs-bar-item-editable-card.inula-tabs-bar-pos-bottom {
+ border-radius: 0 0 8px 8px;
+ padding: 0 16px;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-card.inula-tabs-bar-pos-left,
+.inula-tabs-bar-item.inula-tabs-bar-item-editable-card.inula-tabs-bar-pos-left {
+ border-radius: 8px 0 0 8px;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-card.inula-tabs-bar-pos-right,
+.inula-tabs-bar-item.inula-tabs-bar-item-editable-card.inula-tabs-bar-pos-right {
+ border-radius: 0 8px 8px 0;
+}
+
+/* 选项卡item active状态样式 */
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active,
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active
+ .inula-tabs-bar-item-content
+ > .inula-icon,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active
+ .inula-tabs-bar-item-content
+ > .inula-icon {
+ background-color: #fff;
+ color: var(--inula-color-text);
+}
+
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-top,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-top {
+ border-bottom: 1px solid #fff;
+}
+
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-bottom {
+ border-top: 1px solid #fff;
+}
+
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-left,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-left {
+ border-right: 1px solid #fff;
+}
+
+.inula-tabs-bar-item-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-right,
+.inula-tabs-bar-item-editable-card.inula-tabs-bar-item.inula-tabs-bar-item-active.inula-tabs-bar-pos-right {
+ border-left: 1px solid #fff;
+}
+
+/** ---type=editable-card--- **/
+.inula-tabs-bar-item-close:hover i {
+ color: #000 !important;
+ cursor: pointer;
+ transition: all 0.3s ease-in-out;
+}
+
+.inula-tabs-bar-item.inula-tabs-bar-item-disabled
+ .inula-tabs-bar-item-close:hover
+ i {
+ color: #8c8c8c !important;
+ cursor: not-allowed;
+}
+
+.inula-tabs-bar-item-add {
+ display: flex;
+ align-items: center;
+ border: 1px solid #f0f0f0;
+ padding: 0 8px;
+ height: 100%;
+ border-radius: 8px 8px 0 0;
+}
+
+.inula-tabs-bar-item-add i {
+ color: #000;
+}
+
+.inula-tabs-bar-item-add:hover i {
+ color: var(--inula-color-primary-hover);
+ cursor: pointer;
+ transition: all 0.1s ease-in-out;
+}
+
+/**--- size:small, default, large ---**/
+.inula-tabs-bar-small {
+ gap: 16px;
+}
+
+.inula-tabs-bar-small .inula-tabs-bar-item-content text {
+ font-size: 14px;
+}
+
+.inula-tabs-bar-large {
+ gap: 36px;
+}
+
+.inula-tabs-bar-large .inula-tabs-bar-item-content text {
+ font-size: 18px;
+}
diff --git a/packages/inula2-ui/library_code/src/components/tabs/index.jsx b/packages/inula2-ui/library_code/src/components/tabs/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..c262011af96c47c6d233b36bda161cb25d0a0ead
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tabs/index.jsx
@@ -0,0 +1,247 @@
+import "./index.css";
+import Icon from "../icon/index.jsx";
+import { watch } from "@openinula/next";
+
+/**
+TabProps: {
+ key: string; // 选项卡唯一标识
+ label: ReactNode; // 选项卡头显示文字
+ disabled?: boolean; // 是否禁用该选项卡,默认为 false
+ forceRender?: boolean; // 被隐藏时是否渲染 DOM,默认为 false
+ destoryOnHide?: boolean; // 被隐藏时是否销毁 DOM,默认为 false
+ closeIcon?: ReactNode; // 关闭按钮,只在 type="editable-card" 时有效, 设置为null或false时不显示关闭按钮
+ closable?: boolean; // 是否显示关闭按钮,只在 type="editable-card" 时有效
+ icon?: ReactNode; // 选项卡图标
+ children?: ReactNode; // 选项卡内容
+}
+**/
+
+const Tabs = ({
+ type = "line", // line | card | editable-card
+ size = "default", // default | large | small
+ tabPosition = "top", // top | bottom | left | right
+ centered = false, // true | false
+ // animated = false, // true | false
+ // destoryOnHide = false, // true | false
+ addIcon = , // ReactNode,只在 type="editable-card" 时有效
+ hideAdd = false, // true | false 只在 type="editable-card" 时有效
+ // removeIcon = , // ReactNode,只在 type="editable-card" 时有效
+ indicator, //{ size?: number | (origin: number) => number; align: start | center | end; } 自定义指示器长度和对齐方式
+ // renderTabBar, // (props: TabBarProps) => ReactNode; 自定义 TabBar 内容
+ items, // TabProps[]; 选项卡列表
+ activeKey, // string; 当前选中的选项卡的 key
+ defaultActiveKey = items[0].key, // string; 默认选中的选项卡的 key
+ tabBarExtraContent, // ReactNode | {left?: ReactNode, right?: ReactNode},TabBar 额外内容
+ tabBarGutter, // number; TabBar 的间隔距离,单位为 px
+ tabBarStyle, // CSSProperties; TabBar 的样式
+ className, // string
+ style, // CSSProperties; 选项卡的样式
+ onChange, // (key: string) => void; 选项卡切换时的回调函数
+ onTabClick, // (key: string, e: React.MouseEvent) => void; 选项卡点击时的回调函数
+ onEdit, // (targetKey: string, action: 'add' | 'remove') => void; 选项卡编辑时的回调函数, 只在 type="editable-card" 时有效
+ onTabScroll, // ({ direction: left | right | top | bottom }) => void 选项卡滚动时的回调函数
+}) => {
+ let customActiveKey = activeKey || defaultActiveKey;
+ let customItems = items || [];
+
+ watch(() => {
+ // console.log(activeKey);
+ customItems = items || [];
+ // customActiveKey = activeKey || defaultActiveKey;
+ });
+
+ function addItem(item) {
+ customItems.push(item);
+ customActiveKey = item.key;
+ }
+
+ function removeItem(key) {
+ const targetIndex = customItems.findIndex((item) => item.key === key);
+ customItems = customItems.filter((item) => item.key !== key);
+ const index =
+ targetIndex === customItems.length ? targetIndex - 1 : targetIndex;
+ customActiveKey =
+ customItems.length && key === customActiveKey
+ ? customItems[index].key
+ : customActiveKey;
+ }
+
+ function setActiveKey(key) {
+ customActiveKey = key;
+ }
+
+ const classNames = [
+ "inula-tabs",
+ `inula-tabs-bar-pos-${tabPosition}`,
+ className,
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const tabBarClassNames = [
+ "inula-tabs-bar",
+ `inula-tabs-bar-pos-${tabPosition}`,
+ `inula-tabs-bar-${type}`,
+ `inula-tabs-bar-${size}`,
+ centered ? "inula-tabs-bar-center" : "",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ const tabBarStyles = {
+ ...tabBarStyle,
+ ...{ gap: `${tabBarGutter}px` },
+ };
+
+ const indictorSize = () => {
+ if (indicator && indicator.size) {
+ if (typeof indicator.size === "number") {
+ return `${indicator.size}px`;
+ } else if (typeof indicator.size === "function") {
+ const value = indicator.size(0);
+ const sign = value > 0 ? "+" : value < 0 ? "- " : "";
+ return `calc(100% ${sign} ${Math.abs(value)}px)`;
+ }
+ } else {
+ return "100%";
+ }
+ };
+
+ const handleTabClick = (item, e) => {
+ if (item.disabled) return;
+ if (activeKey) {
+ setActiveKey(item.key);
+ onChange && onChange(item.key, e);
+ onTabClick && onTabClick(item.key, e);
+ } else {
+ setActiveKey(item.key);
+ console.log(activeKey);
+ onChange && onChange(item.key, e);
+ onTabClick && onTabClick(item.key, e);
+ }
+ };
+
+ const handleEdit = (targetKey, action, isDisabled = false) => {
+ if (isDisabled) return;
+ if (onEdit) {
+ //受控,直接返回
+ if (!onEdit) throw new Error("受控模式没有onEdit");
+ onEdit(targetKey, action);
+ return;
+ }
+
+ if (action === "add") {
+ addItem({
+ key: `tab_${Date.now()}`, // 使用时间戳生成唯一key
+ label: "New Tab",
+ children: "New Tab Content",
+ });
+ } else if (action === "remove") {
+ removeItem(targetKey);
+ }
+ };
+
+ return (
+
+ {/* tabBar */}
+
+ {/* tabBar左侧额外内容 */}
+ {tabBarExtraContent && tabBarExtraContent.left && (
+
+ {tabBarExtraContent.left}
+
+ )}
+
+ {/* 标签项 */}
+
+ {(item) => {
+ return (
+
+
handleTabClick(item, e)}
+ >
+ {item.icon}
+ {item.label}
+
+
+
+ handleEdit(item.key, "remove", item.disabled)
+ }
+ >
+ {item.closeIcon
+ ? item.closeIcon
+ : new Icon({
+ value: "close",
+ size: 16,
+ color: "#8c8c8c",
+ })}
+
+
+
+ );
+ }}
+
+
+ {/* 可编辑卡片类型时,添加按钮位置在最后一个标签后面 */}
+ {type === "editable-card" && !hideAdd && (
+
handleEdit(`${customItems.length + 1}`, "add")}
+ >
+ {addIcon}
+
+ )}
+
+ {/* tabBar右侧额外内容 */}
+ {tabBarExtraContent && tabBarExtraContent.right && (
+
+ {tabBarExtraContent.right}
+
+ )}
+
+
+ {/* 内容区域 */}
+
+
+ {(item) => {
+ return (
+
+ {item.children}
+
+ );
+ }}
+
+
+
+ );
+};
+
+export default Tabs;
diff --git a/packages/inula2-ui/library_code/src/components/tag/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/tag/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..bc03da5090e6ea4dcc1917146049aeef64ab3d60
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tag/demos/demo1.jsx
@@ -0,0 +1,23 @@
+import "../index.css";
+import Tag from "../index.jsx";
+
+const Demo1 = () => {
+ return (
+
+ );
+};
+
+export default Demo1;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demo.jsx b/packages/inula2-ui/library_code/src/components/tree/demo.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7e9bc750edafab4b3dce9f4c91698641b6ad8083
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demo.jsx
@@ -0,0 +1,58 @@
+import demo1 from "./demos/demo1.jsx";
+import demo2 from "./demos/demo2.jsx";
+import demo3 from "./demos/demo3.jsx";
+import demo4 from "./demos/demo4.jsx";
+import demo5 from "./demos/demo5.jsx";
+
+const TreeDemo = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
自定义图标、连接线
+
可以自定义文字前的图标以及展开折叠图标,展示连接线
+
+
+
+
+
+
异步加载数据
+
+ 异步加载数据,需设置loadData属性,返回Promise对象,返回值为树节点数据
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demos/demo1.jsx b/packages/inula2-ui/library_code/src/components/tree/demos/demo1.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..86f3a95922308e2998e961e6e9eb61fced701348
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demos/demo1.jsx
@@ -0,0 +1,71 @@
+import Tree from "../index.jsx";
+
+const TreeDemo = () => {
+ const onSelect = (selectedKeys, info) => {
+ console.log("selected", selectedKeys, info);
+ };
+
+ const onCheck = (checkedKeys, info) => {
+ console.log("onCheck", checkedKeys, info);
+ };
+ const treeData = [
+ {
+ title: "parent 1",
+ key: "0-0",
+ children: [
+ {
+ title: "parent 1-0",
+ key: "0-0-0",
+ disabled: true,
+ children: [
+ {
+ title: "leaf",
+ key: "0-0-0-0",
+ disableCheckbox: true,
+ },
+ {
+ title: "leaf",
+ key: "0-0-0-1",
+ },
+ ],
+ },
+ {
+ title: "parent 1-1",
+ key: "0-0-1",
+ children: [
+ {
+ title: sss,
+ key: "0-0-1-0",
+ },
+ ],
+ },
+ { title: "parent 1-0", key: "0-0-2" },
+ ],
+ },
+ ];
+
+ return (
+
+ );
+};
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demos/demo2.jsx b/packages/inula2-ui/library_code/src/components/tree/demos/demo2.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..55a45ad46e8b775a3a2bc61559efa35cdf4b5007
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demos/demo2.jsx
@@ -0,0 +1,85 @@
+import Tree from "../index.jsx";
+
+const treeData = [
+ {
+ title: "0-0",
+ key: "0-0",
+ children: [
+ {
+ title: "0-0-0",
+ key: "0-0-0",
+ children: [
+ { title: "0-0-0-0", key: "0-0-0-0" },
+ { title: "0-0-0-1", key: "0-0-0-1" },
+ { title: "0-0-0-2", key: "0-0-0-2" },
+ ],
+ },
+ {
+ title: "0-0-1",
+ key: "0-0-1",
+ children: [
+ { title: "0-0-1-0", key: "0-0-1-0" },
+ { title: "0-0-1-1", key: "0-0-1-1" },
+ { title: "0-0-1-2", key: "0-0-1-2" },
+ ],
+ },
+ {
+ title: "0-0-2",
+ key: "0-0-2",
+ },
+ ],
+ },
+ {
+ title: "0-1",
+ key: "0-1",
+ children: [
+ { title: "0-1-0-0", key: "0-1-0-0" },
+ { title: "0-1-0-1", key: "0-1-0-1" },
+ { title: "0-1-0-2", key: "0-1-0-2" },
+ ],
+ },
+ {
+ title: "0-2",
+ key: "0-2",
+ },
+];
+
+const TreeDemo = () => {
+ let expandedKeys = ["0-0-0", "0-0-1"];
+ let checkedKeys = ["0-0-0"];
+ let selectedKeys = [];
+ let autoExpandParent = true;
+
+ const onExpand = (expandedKeysValue) => {
+ console.log("onExpand", expandedKeysValue);
+ expandedKeys = expandedKeysValue;
+ autoExpandParent = false;
+ };
+
+ const onCheck = (checkedKeysValue) => {
+ console.log("onCheck", checkedKeysValue);
+ checkedKeys = checkedKeysValue;
+ };
+
+ const onSelect = (selectedKeysValue, info) => {
+ console.log("onSelect", info);
+ selectedKeys = selectedKeysValue;
+ };
+
+ return (
+
+ );
+};
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demos/demo3.jsx b/packages/inula2-ui/library_code/src/components/tree/demos/demo3.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1e9ab958e4b34b17e311c54473fb2fdfc846ef9c
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demos/demo3.jsx
@@ -0,0 +1,125 @@
+import Tree from "../index.jsx";
+import Icon from "../../icon/index.jsx";
+
+const treeData1 = [
+ {
+ title: "parent 1",
+ key: "0-0",
+ icon: ,
+ children: [
+ {
+ title: "leaf",
+ key: "0-0-0",
+ icon: (
+
+ ),
+ },
+ {
+ title: "leaf",
+ key: "0-0-1",
+ // icon: ({ selected }) =>
+ // selected ? (
+ //
+ // ) : (
+ //
+ // ),
+ icon: ,
+ },
+ ],
+ },
+];
+
+const treeData2 = [
+ {
+ title: "parent 1",
+ key: "0-0",
+ children: [
+ {
+ title: "parent 1-0",
+ key: "0-0-0",
+ children: [
+ {
+ title: "leaf",
+ key: "0-0-0-0",
+ },
+ {
+ title: "leaf",
+ key: "0-0-0-1",
+ },
+ {
+ title: "leaf",
+ key: "0-0-0-2",
+ },
+ ],
+ },
+ {
+ title: "parent 1-1",
+ key: "0-0-1",
+ children: [
+ {
+ title: "leaf",
+ key: "0-0-1-0",
+ },
+ ],
+ },
+ {
+ title: "parent 1-2",
+ key: "0-0-2",
+ children: [
+ {
+ title: "leaf",
+ key: "0-0-2-0",
+ },
+ {
+ title: "leaf",
+ key: "0-0-2-1",
+ },
+ ],
+ },
+ ],
+ },
+];
+
+const TreeDemo = () => {
+ const onSelect = (selectedKeys, info) => {
+ console.log("selected", selectedKeys, info);
+ };
+ return (
+
+
+ }
+ treeData={treeData1}
+ />
+
+
+ }
+ defaultExpandedKeys={["0-0-0"]}
+ onSelect={onSelect}
+ treeData={treeData2}
+ />
+
+
+ );
+};
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demos/demo4.jsx b/packages/inula2-ui/library_code/src/components/tree/demos/demo4.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..e8963ecfc39c3e9355080c0996b6ad5b71fa10ce
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demos/demo4.jsx
@@ -0,0 +1,48 @@
+import Tree from "../index.jsx";
+
+const initTreeData = [
+ { title: "Expand to load", key: "0" },
+ { title: "Expand to load", key: "1" },
+ { title: "Tree Node", key: "2", isLeaf: true },
+];
+
+const updateTreeData = (list, key, children) =>
+ list.map((node) => {
+ if (node.key === key) {
+ return {
+ ...node,
+ children,
+ };
+ }
+ if (node.children) {
+ return {
+ ...node,
+ children: updateTreeData(node.children, key, children),
+ };
+ }
+ return node;
+ });
+
+const TreeDemo = () => {
+ let treeData = initTreeData;
+
+ const onLoadData = ({ key, children }) =>
+ new Promise((resolve) => {
+ if (children) {
+ resolve();
+ return;
+ }
+ setTimeout(() => {
+ treeData = updateTreeData(treeData, key, [
+ { title: "Child Node", key: `${key}-0` },
+ { title: "Child Node", key: `${key}-1` },
+ ]);
+
+ resolve();
+ }, 1000);
+ });
+
+ return ;
+};
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/demos/demo5.jsx b/packages/inula2-ui/library_code/src/components/tree/demos/demo5.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..786b0734547e2d3ed8076318ba07fc2201e95c18
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/demos/demo5.jsx
@@ -0,0 +1,37 @@
+import Tree from "../index.jsx";
+
+const dig = (path = "0", level = 3) => {
+ const list = [];
+ for (let i = 0; i < 10; i += 1) {
+ const key = `${path}-${i}`;
+ const treeNode = {
+ title: key,
+ key,
+ };
+
+ if (level > 0) {
+ treeNode.children = dig(key, level - 1);
+ }
+
+ list.push(treeNode);
+ }
+ return list;
+};
+
+const treeData = dig();
+
+const TreeDemo = () => (
+ {
+ const title = item.title;
+ return {title};
+ }}
+ />
+);
+
+export default TreeDemo;
diff --git a/packages/inula2-ui/library_code/src/components/tree/index.css b/packages/inula2-ui/library_code/src/components/tree/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..447a2f78c3a165ea104d6dfd7c6a9dddb0c8bea7
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/index.css
@@ -0,0 +1,191 @@
+.inula-tree {
+ list-style: none;
+}
+
+.inula-tree li {
+ list-style: none;
+}
+
+.inula-tree ul {
+ padding-left: 24px;
+}
+
+.inula-tree-node {
+ display: flex;
+ flex-direction: column;
+}
+
+/* 节点孩子样式 */
+.inula-tree-node .inula-tree-children {
+ position: relative;
+ opacity: 1;
+ /* max-height: var(--max-height); */
+ transition: all 0.3s ease-in-out;
+}
+
+.inula-tree-node .inula-tree-children.inula-tree-children-fold {
+ opacity: 0;
+ max-height: 0;
+ overflow: hidden;
+}
+
+/* 节点内容样式 */
+.inula-tree-node-content {
+ display: flex;
+ align-items: center;
+ gap: 2px;
+ margin-bottom: 12px;
+}
+
+/* switcher展开按钮样式 */
+.inula-tree-node .inula-tree-node-content .inula-icon {
+ transition: all 0.3s ease-in-out;
+}
+
+.inula-tree-node-content .inula-tree-node-content-switcher {
+ min-width: 24px;
+ min-height: 24px;
+ border-radius: 5px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.inula-tree-node-content .inula-tree-node-content-switcher:hover {
+ cursor: pointer;
+ background-color: rgba(0, 0, 0, 0.04);
+}
+
+.inula-tree-node-content .inula-tree-node-content-switcher.noSwitcher {
+ pointer-events: none;
+}
+
+/* 异步switcher加载 */
+.inula-tree-node-content-switcher.isLoading .inula-icon {
+ animation: spin 1s linear infinite;
+}
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+/* title: checkbox + text */
+.inula-tree-node-content-title {
+ display: flex;
+ position: relative;
+ gap: 4px;
+ align-items: center;
+ justify-content: center;
+}
+
+.inula-tree-node-content .inula-tree-node-content-title.indent {
+ margin-left: 24px;
+}
+
+/* 内容中文本样式 */
+.inula-tree-node-content .inula-tree-node-content-text {
+ display: flex;
+ gap: 4px;
+ align-items: center;
+ justify-content: center;
+ height: 24px;
+ width: max-content;
+ padding: 0 4px;
+ border-radius: 5px;
+}
+
+.inula-tree-node-content .inula-tree-node-content-text.isSelected {
+ background-color: #e6f4ff;
+}
+
+.inula-tree-node-content .inula-tree-node-content-text:hover {
+ cursor: pointer;
+ background-color: rgba(0, 0, 0, 0.04);
+}
+
+.inula-tree-node-content .inula-tree-node-content-text.disabled {
+ cursor: not-allowed;
+ background-color: rgba(0, 0, 0, 0);
+ color: var(--inula-select-disabled-text);
+}
+
+/* 连接线样式 */
+.inula-tree-node-content-title.showLine::before {
+ content: "";
+ position: absolute;
+ top: -12px;
+ height: calc(100% + 12px);
+ width: 8px;
+ border-left: 1px solid #d9d9d9;
+ left: -14px;
+}
+
+.inula-tree-node[data-leaf="true"]:last-child
+ .inula-tree-node-content-title.showLine::before {
+ content: "";
+ position: absolute;
+ top: -12px;
+ height: 24px;
+ width: 8px;
+ border-left: 1px solid #d9d9d9;
+ border-bottom: 1px solid #d9d9d9;
+ left: -14px;
+}
+
+.inula-tree-node[data-leaf="true"]:first-child
+ .inula-tree-node-content-title.showLine::before {
+ content: "";
+ position: absolute;
+ top: 0px;
+ height: 100%;
+ width: 8px;
+ border-left: 1px solid #d9d9d9;
+ left: -14px;
+}
+
+.inula-tree-node[data-leaf="true"]:first-child.inula-tree-node[data-leaf="true"]:last-child
+ .inula-tree-node-content-title.showLine::before {
+ content: "";
+ position: absolute;
+ top: 0px;
+ height: 12px;
+ width: 8px;
+ border-left: 1px solid #d9d9d9;
+ border-bottom: 1px solid #d9d9d9;
+ left: -14px;
+}
+
+.inula-tree-node .inula-tree-children.showLine::before {
+ content: "";
+ position: absolute;
+ left: -12px;
+ top: -4px;
+ height: 100%;
+ border-left: 1px solid #d9d9d9;
+}
+
+.inula-tree-node-content-line {
+ width: 8px;
+ height: 1px;
+ background-color: #d9d9d9;
+
+ position: absolute;
+ left: -14px;
+ top: 12px;
+ z-index: 1;
+
+ pointer-events: none;
+}
+
+/* 虚拟列表样式 */
+.virtual-list-container {
+ position: relative;
+ overflow-y: auto;
+ will-change: transform;
+}
+
+.virtual-list-content {
+ position: relative;
+ width: 100%;
+}
diff --git a/packages/inula2-ui/library_code/src/components/tree/index.jsx b/packages/inula2-ui/library_code/src/components/tree/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..e21a1d2728013c0943aa30a0481c7fb244faf2a7
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/index.jsx
@@ -0,0 +1,505 @@
+import "./index.css";
+import { Checkbox } from "../checkbox/index.jsx";
+import Icon from "../icon/index.jsx";
+import VirtualList from "./virtualList.jsx";
+import { didMount, watch } from "@openinula/next";
+import {
+ getKeyToTreeMap,
+ getAllRelatedChildKeys,
+ initialAllExpandedKeys,
+ initialCustomExpandedKeys,
+ initialCustomCheckedKeys,
+ initialCustomSelectedKeys,
+ calculateExpandKeys,
+ calculateCheckedKeys,
+ calculateSelectedKeys,
+ judgeHalfCheckedKeys,
+ flattenTreeData,
+} from "./utils/index.js";
+
+const Tree = ({
+ autoExpandParent = false, // 是否自动展开父节点
+ blockNode = false, //是否节点占据一行
+ checkable = false, // 是否显示复选框
+ checkedKeys = [], // 受控选中复选框的树节点,父节点设置时子节点自动选中,string[] | checkStrictly:{checked: string[], halfChecked: string[]}
+ checkStrictly = false, // 父子节点不再关联,完全受控
+ defaultCheckedKeys = [], // 默认选中的树节点
+ defaultExpandAll = false, // 默认展开所有树节点
+ defaultExpandParent = true, // 默认展开父节点
+ defaultExpandedKeys = [], // 默认展开指定的树节点
+ expandedKeys = [], // 受控展开的树节点
+ disabled = false, // 禁用树
+ fieldNames = {}, // 自定义字段名
+ filterTreeNode = () => true, // 按需筛选树节点
+ height, //设置虚拟滚动容器高度,设置后内部不再支持横向滚动
+ icon, //标题之前插入自定义图标,需设置showIcon为true
+ loadData, // 异步加载数据,需设置loadData属性,返回Promise对象,返回值为树节点数据
+ loadedKeys = [], // 受控已加载的树节点,用于控制异步加载,需配合loadData属性使用
+ multiple = false, // 是否支持多选
+ selectable = true, // 是否支持选中,为false时点击为check选中
+ defaultSelectedKeys = [], //默认选中的树节点,多选需配合multiple属性使用
+ selectedKeys = [], // 受控选中的树节点,多选需配合multiple属性使用
+ showIcon = false, // 是否显示图标
+ showLine = false, // 是否显示连接线
+ switcherIcon, // 自定义展开图标
+ switcherLoadingIcon, // 自定义加载中图标
+ titleRender, // 自定义渲染节点
+ rootStyle, //Tree最外层Style
+ treeData, // 树节点数据,array<{key, title, children, [disabled, selectable]}>
+ virtual = true, // 是否开启虚拟滚动,设置false关闭虚拟滚动
+ onCheck, // 点击复选框触发
+ onDrop, //drop事件触发
+ onExpand, // 展开/收起节点时触发
+ onLoad, // 异步加载数据时触发
+ onSelect, // 选中/取消选中节点时触发
+ onRightClick, // 右键点击节点时触发
+ className, // 自定义类名
+ ...rest
+}) => {
+ //选中、展开节点
+ let customCheckedKeys = [];
+ let customSelectedKeys = [];
+ let customExpandedKeys = [];
+ //节点树的相关信息
+ let keyToNodeInfoMap = new Map(); //nodeInfo: { node, parent, depth, isLast };
+ let maxDepth = 1; //树最大深度
+ //异步节点管理
+ let customLoadedKeys = loadedKeys;
+ let customLoadingKeys = [];
+ let flattenedTreeNodes = [];
+
+ /**
+ * 树节点展开控制
+ * 优先级:受控 > all > 默认
+ */
+ //初始化
+ const initialExpandedKeys = (currentTree) => {
+ if (expandedKeys.length > 0) {
+ return initialCustomExpandedKeys(
+ currentTree,
+ expandedKeys,
+ autoExpandParent || defaultExpandParent
+ );
+ }
+ if (defaultExpandAll) {
+ return initialAllExpandedKeys(currentTree);
+ }
+ if (!defaultExpandAll && defaultExpandedKeys.length > 0) {
+ return initialCustomExpandedKeys(
+ currentTree,
+ defaultExpandedKeys,
+ autoExpandParent || defaultExpandParent
+ );
+ }
+ return [];
+ };
+
+ /**
+ * 树节点选中控制
+ * 优先级:受控 > 默认
+ */
+ //checked选中
+ const initialCheckedKeys = (currentTree) => {
+ if (checkedKeys.length > 0) {
+ return initialCustomCheckedKeys(currentTree, checkedKeys, checkStrictly);
+ } else {
+ return initialCustomCheckedKeys(
+ currentTree,
+ defaultCheckedKeys,
+ checkStrictly
+ );
+ }
+ };
+
+ //selected选中
+ const initialSelectedKeys = () => {
+ if (selectedKeys.length > 0) {
+ return initialCustomSelectedKeys(selectedKeys, multiple);
+ } else {
+ return initialCustomSelectedKeys(defaultSelectedKeys, multiple);
+ }
+ };
+
+ /** 点击事件 */
+ //type = 'expand' | 'check' | 'select'
+ const hanldleClick = (target, type, e) => {
+ switch (type) {
+ case "expand": {
+ const isAlreadyLoaded = customLoadedKeys.includes(target.key);
+ const isLoading = customLoadingKeys.includes(target.key);
+ const shouldLoad = loadData && !isAlreadyLoaded && !isLoading;
+
+ if (shouldLoad) {
+ customLoadingKeys = [...customLoadingKeys, target.key];
+
+ loadData(target)
+ .then(() => {
+ customLoadingKeys = customLoadingKeys.filter(
+ (key) => key !== target.key
+ );
+ customLoadedKeys = [...customLoadedKeys, target.key];
+ })
+ .catch(() => {
+ customLoadingKeys = customLoadingKeys.filter(
+ (key) => key !== target.key
+ );
+ customLoadedKeys = [...customLoadedKeys, target.key];
+ });
+ }
+
+ customExpandedKeys = calculateExpandKeys(target, [
+ ...customExpandedKeys,
+ ]);
+ if (onExpand) onExpand(customExpandedKeys, e);
+ break;
+ }
+ case "check": {
+ const childKeys = getAllRelatedChildKeys(target);
+ customCheckedKeys = calculateCheckedKeys(
+ target,
+ [...customCheckedKeys],
+ keyToNodeInfoMap,
+ childKeys,
+ checkStrictly
+ );
+ if (onCheck) onCheck(customCheckedKeys, e);
+ break;
+ }
+ case "select": {
+ customSelectedKeys = calculateSelectedKeys(
+ target,
+ [...customSelectedKeys],
+ multiple
+ );
+ if (onSelect) onSelect(customSelectedKeys, e);
+ break;
+ }
+ default:
+ console.error("错误操作");
+ }
+ };
+
+ //样式控制
+ const classNames = ["inula-tree", className].filter(Boolean).join(" ");
+ const styles = {
+ ...rootStyle,
+ };
+
+ /** TreeNode节点组件 */
+ /*TreeNode Props
+ * title: 节点标题
+ * key: 节点唯一标识,必填
+ * isLeaf: 是否为叶子节点,默认false
+ * selectable: 是否可选,默认true,为false时点击为check选中
+ * disabled: 是否禁用,默认false
+ * children: 子节点,array
+ * icon: 自定义图标,ReactNode
+ * disableCheckbox: 是否禁用复选框,默认false
+ */
+ const TreeNode = ({ node }) => {
+ //是否为虚拟列表模式
+ const isVirtualMode = virtual && height;
+ //节点信息:{ node:节点, parent:父节点, depth:深度, isLast:是否为当前层最后一个节点 }
+ const nodeInfo = keyToNodeInfoMap.get(node.key);
+ //非叶子结点是否展开
+ const isExpanded = customExpandedKeys.includes(node.key);
+ //节点是否check选中,针对复选框
+ const isChecked = customCheckedKeys.includes(node.key);
+ //是否支持select选中
+ const isSelectable = selectable || node.isSelectable;
+ //节点是否select选中,针对text部分,需selectable为true
+ const isSelected = customSelectedKeys.includes(node.key) && isSelectable;
+ //checkbox禁用
+ const isCheckDisabled = node.disabled || node.disableCheckbox || disabled;
+ //select禁用
+ const isSelectDisabled = node.disabled || disabled;
+ //子节点部分选择
+ const isHalfChecked =
+ !isChecked &&
+ node.children &&
+ judgeHalfCheckedKeys(
+ node,
+ customCheckedKeys,
+ getAllRelatedChildKeys(node)
+ );
+ //是否为异步加载树的叶子节点
+ const isLoadLeafNode = loadData && node.isLeaf;
+ //是否为普通树的叶子节点
+ // const isSimpleLeafNode = !loadData && (node?.isLeaf || !node?.children);
+ //是否为叶子节点
+ // const isLeafNode = isLoadLeafNode || isSimpleLeafNode;
+ //是否为加载中节点
+ // const isLoading = customLoadingKeys.includes(node.key);
+
+ const isSimpleLeafNode = true;
+ // 是否为叶子节点
+ const isLeafNode = true;
+ // 是否为加载中节点
+ const isLoading = true;
+
+ //展开收起切换按钮
+ const Switcher = () => {
+ if (isLeafNode) return null; //叶子节点,不渲染
+ // loading状态,渲染loadingIcon
+ if (isLoading)
+ return (
+ <>
+ {switcherLoadingIcon || (
+
+ )}
+ >
+ );
+
+ //用户自定义swictherIcon优先渲染
+ if (switcherIcon) {
+ return (
+
+ {switcherIcon}
+
+ );
+ }
+
+ return (
+
+ );
+ };
+
+ //子节点渲染
+ const ChildrenRender = () => {
+ let contentRef;
+ if (isVirtualMode) return null; //虚拟列表模式只渲染本身
+
+ //如果为叶子节点或者没有孩子,不渲染
+ if (isLeafNode || node.children?.length === 0) return <>>;
+
+ return (
+
+ {node.children?.map((child) => (
+
+ ))}
+
+ );
+ };
+
+ //TreeNode样式计算
+ const treeNodeClassName = [
+ "inula-tree-node",
+ showLine && isLeafNode && "showLine",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ //展开收起按钮样式
+ const switcherClassNames = [
+ "inula-tree-node-content-switcher",
+ isLeafNode && "noSwitcher",
+ isLoading && "isLoading",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ //内容部分样式
+ const titleClassNames = [
+ "inula-tree-node-content-title",
+ nodeInfo?.depth === maxDepth && isLeafNode && "indent",
+ showLine && isLeafNode && "showLine",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ //内容中文字部分样式
+ const textClassNames = [
+ "inula-tree-node-content-text",
+ isSelected && "isSelected",
+ isSelectDisabled && "disabled",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ //子节点容器渲染样式
+ const childClassNames = [
+ "inula-tree-children",
+ !isExpanded ? "inula-tree-children-fold" : "",
+ showLine && !nodeInfo?.isLast && "showLine",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ // 虚拟列表模式渲染;
+ if (isVirtualMode) {
+ const { level } = node;
+ return (
+
+
+ {(nodeInfo?.depth !== maxDepth || loadData) && (
+
hanldleClick(node, "expand", e)}
+ >
+
+
+ )}
+
+
+ {showLine && isSimpleLeafNode && !nodeInfo?.isLast && (
+
+ )}
+
+ {checkable && (
+
hanldleClick(node, "check", e)}
+ />
+ )}
+
+ {
+ if (isCheckDisabled) return;
+ if (isSelectable) hanldleClick(node, "select", e);
+ else hanldleClick(node, "check", e);
+ }}
+ >
+ {showIcon && (node.icon || icon) && <>{node.icon || icon}>}
+ {titleRender ? titleRender(node) : <>{node.title}>}
+
+
+
+
+ );
+ }
+
+ //普通模式渲染
+ return (
+
+
+ {(nodeInfo?.depth !== maxDepth || loadData) && (
+
hanldleClick(node, "expand", e)}
+ >
+
+
+ )}
+
+
+ {/* 连接线 */}
+ {showLine && isLeafNode && !nodeInfo?.isLast && (
+
+ )}
+
+ {/* 复选框,需checkable为true */}
+ {checkable && (
+
hanldleClick(node, "check", e)}
+ />
+ )}
+
+ {/* 文字部分,支持自定义图标和自定义文字 */}
+ {
+ if (isCheckDisabled) return;
+ if (isSelectable) hanldleClick(node, "select", e);
+ else hanldleClick(node, "check", e);
+ }}
+ >
+ {showIcon && (node.icon || icon) && <>{node.icon || icon}>}
+ {titleRender ? titleRender(node) : <>{node.title}>}
+
+
+
+
+ {/* 子节点渲染 */}
+
+
+ );
+ };
+
+ // 初始化,以及受控初始化
+ // didMount(() => {
+ // onLoad && onLoad();
+ // customExpandedKeys = initialExpandedKeys(treeData);
+ // customCheckedKeys = initialCheckedKeys(treeData);
+ // customSelectedKeys = initialSelectedKeys(treeData);
+ // });
+
+ watch(() => {
+ onLoad && onLoad();
+ customExpandedKeys = initialExpandedKeys(treeData);
+ customCheckedKeys = initialCheckedKeys(treeData);
+ customSelectedKeys = initialSelectedKeys(treeData);
+ });
+
+ watch(() => {
+ if (treeData) {
+ const { map, depth } = getKeyToTreeMap(treeData);
+ keyToNodeInfoMap = map;
+ maxDepth = depth;
+ }
+ // const { map, depth } = getKeyToTreeMap(treeData);
+ // keyToNodeInfoMap = map;
+ // maxDepth = depth;
+ });
+
+ // 虚拟列表扁平化
+ watch(() => {
+ flattenedTreeNodes = flattenTreeData(
+ treeData,
+ customExpandedKeys,
+ keyToNodeInfoMap
+ );
+ });
+
+ return (
+
+ {virtual && height ? (
+ }
+ >
+ ) : (
+
+ {treeData.map((node) => (
+
+ ))}
+
+ )}
+
+ );
+};
+
+export default Tree;
diff --git a/packages/inula2-ui/library_code/src/components/tree/utils/calculateCustomKeys.js b/packages/inula2-ui/library_code/src/components/tree/utils/calculateCustomKeys.js
new file mode 100644
index 0000000000000000000000000000000000000000..a38133bf5fd15b55528aaf57c792cbfc2d61257a
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/utils/calculateCustomKeys.js
@@ -0,0 +1,124 @@
+/*--- 用于点击事件计算 ---*/
+/**
+ * 计算展开节点:
+ * 能够点击当前节点,其父节点一定是展开节点,且父子不影响,所以无需考虑父节点
+ * 而父节点不影响子节点是否展开,所以直接添加删除即可
+ */
+export function calculateExpandKeys(cur = {}, preKeys = []) {
+ if (preKeys.includes(cur.key)) {
+ return preKeys.filter((key) => key !== cur.key);
+ } else {
+ return [...preKeys, cur.key];
+ }
+}
+
+/**
+ * 计算checked选择节点:
+ * 非严格模式:
+ * 1. 对于父节点:
+ * · 如果选择当前节点使父节点子节点全选,选择父节点,否则为半选节点
+ * · 如果取消当前节点,如果父节点还有已选择的子节点,则为半选节点,否则不选
+ * · 半选节点无需在意,在渲染时判断即可
+ * 2. 对于子节点:
+ * · 如果未全选子节点,则选择该节点及其全部子节点
+ * · 如果全选子节点,则取消该节点及其全部子节点
+ * 3. 如果当前节点是叶子节点,看是否在preKey即可
+ * 严格模式:看是否在preKey即可
+ */
+export function calculateCheckedKeys(
+ cur = {},
+ preKeys = [],
+ keyToNodeInfoMap = new Map(),
+ childKeys = [],
+ isCheckStrictly = false
+) {
+ let newKeys = [...preKeys];
+ /* 先处理子节点,看当前节点时选择还是取消,可以同时处理严格模式 */
+ if (!cur.children || isCheckStrictly) {
+ //叶子节点情况
+ if (newKeys.includes(cur.key)) {
+ newKeys = newKeys.filter((key) => key !== cur.key);
+ } else {
+ newKeys.push(cur.key);
+ }
+ if (isCheckStrictly) return newKeys; //严格模式直接返回newKeys
+ } else {
+ //非叶子节点情况
+ let isChildAllChecked = preKeys.includes(cur.key);
+ /**
+ * 等价写法
+ * cur.children.every((child) =>
+ * preKeys.includes(child.key)
+ * );
+ */
+ childKeys.push(cur.key); //因为操作都需要cur.key本身,可以先直接push进去
+ if (isChildAllChecked) {
+ newKeys = newKeys.filter((key) => !childKeys.includes(key));
+ } else {
+ childKeys.forEach((key) => {
+ if (!newKeys.includes(key)) {
+ newKeys.push(key);
+ }
+ });
+ }
+ }
+
+ /* 然后根据newKeys处理父节点:*/
+ let curr = cur;
+ while (true) {
+ const parent = keyToNodeInfoMap.get(curr.key).parent ?? null;
+ if (!parent) break; //代表第一层都处理完了,结束。
+ if (parent.disableCheckbox || parent.disabled) break; //disabled节点不会改变状态,也直接结束
+
+ let isChangeParent = false; //记录父节点状态是否变化,变化了则继续向上,否则结束
+ if (
+ parent.children.every(
+ (child) =>
+ newKeys.includes(child.key) || child.disabled || child.disableCheckbox
+ ) &&
+ !newKeys.includes(parent.key)
+ ) {
+ isChangeParent = true;
+ newKeys.push(parent.key);
+ } else if (!newKeys.includes(curr.key) && newKeys.includes(parent.key)) {
+ isChangeParent = true;
+ newKeys = newKeys.filter((key) => key !== parent.key);
+ }
+
+ if (isChangeParent) {
+ curr = parent;
+ } else {
+ break;
+ }
+ }
+
+ return newKeys;
+}
+
+/**
+ * 判断半选节点
+ * 所有不是disabled的及其子节点的子节点中有选中的即为半选节点
+ */
+export function judgeHalfCheckedKeys(cur = {}, nowKeys = [], childKeys = []) {
+ if (!cur.children) return false;
+ return childKeys.some((key) => nowKeys.includes(key));
+}
+
+/**
+ * 计算select选择节点:
+ * 多选模式:看是否在preKeys即可
+ * 单选模式:返回[cur.key]
+ */
+export function calculateSelectedKeys(
+ cur = {},
+ preKeys = [],
+ isMultipleMode = false
+) {
+ if (isMultipleMode) {
+ if (preKeys.includes(cur.key))
+ return preKeys.filter((key) => key !== cur.key);
+ else {
+ return [...preKeys, cur.key];
+ }
+ } else return [cur.key];
+}
diff --git a/packages/inula2-ui/library_code/src/components/tree/utils/flattendTreeData.js b/packages/inula2-ui/library_code/src/components/tree/utils/flattendTreeData.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5ec3d3f26d65253ea5a85e2cfcf4e5f02d7dd44
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/utils/flattendTreeData.js
@@ -0,0 +1,35 @@
+export const flattenTreeData = (
+ treeData,
+ expandedKeys,
+ keyToNodeInfoMap,
+ level = 0,
+ index = 0
+) => {
+ if (!treeData || treeData.length === 0) return [];
+
+ let flattenedItems = [];
+ let currentIndex = index;
+
+ treeData.forEach((node) => {
+ const nodeInfo = keyToNodeInfoMap.get(node.key) || {};
+ flattenedItems.push({ ...node, level, index: currentIndex++, ...nodeInfo });
+
+ if (
+ expandedKeys.includes(node.key) &&
+ node.children &&
+ node.children.length > 0
+ ) {
+ const childItems = flattenTreeData(
+ node.children,
+ expandedKeys,
+ keyToNodeInfoMap,
+ level + 1,
+ currentIndex
+ );
+ flattenedItems = flattenedItems.concat(childItems);
+ currentIndex = childItems[childItems.length - 1].index + 1;
+ }
+ });
+
+ return flattenedItems;
+};
diff --git a/packages/inula2-ui/library_code/src/components/tree/utils/getKeyToTree.js b/packages/inula2-ui/library_code/src/components/tree/utils/getKeyToTree.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4c174cff5d40531f1a2a1e79d8dd1303f4ecd08
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/utils/getKeyToTree.js
@@ -0,0 +1,87 @@
+/* 获得key到树节点的映射, 并打上深度标签和当前层最后一个元素的标签 */
+export function getKeyToTreeMap(treeData) {
+ const map = new Map();
+ let maxDepth = 1;
+ if (treeData.length === 0) return { map, depth: 0 };
+
+ const traverseTree = (currentTree, depth = 1, parent = null) => {
+ currentTree.forEach((node, index) => {
+ const nodeInfo = {
+ node: node,
+ parent: parent,
+ depth: depth,
+ isLast: index === currentTree.length - 1,
+ };
+
+ maxDepth = Math.max(maxDepth, depth);
+ map.set(node.key, nodeInfo);
+ if (node.children) {
+ traverseTree(node.children, depth + 1, node);
+ }
+ });
+ };
+
+ traverseTree(treeData, 1, null);
+ return { map: map, depth: maxDepth };
+}
+
+/* 获得节点所有孩子 */
+export function getAllChildKeys(curNode) {
+ const keys = [];
+
+ const traverseTree = (curr) => {
+ curr.forEach((node) => {
+ if (!keys.includes(node.key)) keys.push(node.key);
+ if (node.children) {
+ traverseTree(node.children);
+ }
+ });
+ };
+
+ if (curNode.children) {
+ traverseTree(curNode.children);
+ }
+
+ return keys;
+}
+
+/* 获得节点所有不包含disabled的节点及其子节点的孩子 */
+export function getAllRelatedChildKeys(curNode) {
+ const keys = [];
+
+ const traverseTree = (curr) => {
+ curr.forEach((node) => {
+ if (!keys.includes(node.key) && !node.disabled && !node.disableCheckbox)
+ keys.push(node.key);
+ if (node.children && !node.disabled && !node.disableCheckbox) {
+ traverseTree(node.children);
+ }
+ });
+ };
+
+ if (curNode.children) {
+ traverseTree(curNode.children);
+ }
+
+ return keys;
+}
+
+/* 获得节点到其父节点的映射 */
+export function getChildToParentMap(treeData) {
+ const map = new Map();
+ if (treeData.length === 0) return map;
+
+ const traverseTree = (curr) => {
+ curr.forEach((node) => {
+ if (node.children) {
+ node.children.forEach((child) => {
+ map.set(child.key, node);
+ });
+ traverseTree(node.children);
+ }
+ });
+ };
+
+ traverseTree(treeData);
+ return map;
+}
diff --git a/packages/inula2-ui/library_code/src/components/tree/utils/index.js b/packages/inula2-ui/library_code/src/components/tree/utils/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..9979d15ab39d5d8b0561f85b26f3a049e2a9c9ca
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/utils/index.js
@@ -0,0 +1,38 @@
+import {
+ getAllChildKeys,
+ getAllRelatedChildKeys,
+ getKeyToTreeMap,
+ getChildToParentMap,
+} from "./getKeyToTree.js";
+
+import {
+ initialAllExpandedKeys,
+ initialCustomExpandedKeys,
+ initialCustomCheckedKeys,
+ initialCustomSelectedKeys,
+} from "./initialCustomKeys.js";
+
+import {
+ calculateExpandKeys,
+ calculateCheckedKeys,
+ calculateSelectedKeys,
+ judgeHalfCheckedKeys,
+} from "./calculateCustomKeys.js";
+
+import { flattenTreeData } from "./flattendTreeData.js";
+
+export {
+ getAllChildKeys,
+ getAllRelatedChildKeys,
+ getKeyToTreeMap,
+ getChildToParentMap,
+ initialAllExpandedKeys,
+ initialCustomExpandedKeys,
+ initialCustomCheckedKeys,
+ initialCustomSelectedKeys,
+ calculateExpandKeys,
+ calculateCheckedKeys,
+ calculateSelectedKeys,
+ judgeHalfCheckedKeys,
+ flattenTreeData,
+};
diff --git a/packages/inula2-ui/library_code/src/components/tree/utils/initialCustomKeys.js b/packages/inula2-ui/library_code/src/components/tree/utils/initialCustomKeys.js
new file mode 100644
index 0000000000000000000000000000000000000000..3156ea35dc05d58f06706ae9772d9885cee845f3
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/utils/initialCustomKeys.js
@@ -0,0 +1,150 @@
+/**
+ * 初始化展开节点
+ * 优先级:受控 > all > default
+ */
+export function initialAllExpandedKeys(currentTree) {
+ let keys = [];
+ currentTree.forEach((node) => {
+ keys.push(node.key);
+ if (node.children) {
+ keys = keys.concat(initialAllExpandedKeys(node.children));
+ }
+ });
+ return keys;
+}
+
+/**
+ * 受控或默认初始化处理:
+ * 1.父节点是否展开不影响子节点
+ * 2.在isAutoExpandParent为true的情况下,直系子节点有展开的情况下父节点展开
+ * 3.从上到下两级两级互相影响,即没有传递影响,也就是参照物始终为initialKeys
+ */
+export function initialCustomExpandedKeys(
+ treeData,
+ initialKeys = [],
+ isAutoExpandParent = true
+) {
+ const keys = [];
+
+ const traverseTree = (curr) => {
+ curr.forEach((node) => {
+ if (initialKeys.includes(node.key) && !keys.includes(node.key))
+ keys.push(node.key);
+ if (node.children) {
+ if (isAutoExpandParent) {
+ const isChildrenAllExpand = node.children.some((child) =>
+ initialKeys.includes(child.key)
+ );
+ if (isChildrenAllExpand && !keys.includes(node.key))
+ keys.push(node.key);
+ }
+ traverseTree(node.children);
+ }
+ });
+ };
+
+ traverseTree(treeData);
+
+ return keys;
+}
+
+/**
+ * 树节点check选中控制
+ * 优先级:受控>默认
+ */
+
+/**
+ * 受控或默认初始化处理
+ * 1. 在非严格模式下:
+ * · 父节点选择,其所有子节点选择
+ * · 其所有子节点选择, 父节点选择
+ * · 从上到下所有级影响,即存在传递影响,也就是参照物为initialKeys和keys
+ * · 上述三规则不影响disabled节点
+ * 2. 在严格模式下:父子不互相影响
+ */
+export function initialCustomCheckedKeys(
+ treeData,
+ initialKeys = [],
+ isCheckStrictly = false
+) {
+ let keys = [];
+
+ const traverseTree = (curr) => {
+ curr.forEach((node) => {
+ if (!isCheckStrictly) {
+ if (initialKeys.includes(node.key) && !keys.includes(node.key))
+ keys.push(node.key);
+
+ //先处理子节点,因为父节点如果不在initialKeys中,要通过子节点是否选中来选择
+ if (node.children) {
+ if (keys.includes(node.key)) {
+ node.children.forEach((child) => {
+ const related =
+ !node.disabled &&
+ !node.disabledCheckbox &&
+ !child.disabled &&
+ !child.disabledCheckbox;
+ //非严格模式不包含disabled属性节点
+ if (related && !keys.includes(child.key)) {
+ keys.push(child.key);
+ }
+ });
+ }
+ traverseTree(node.children);
+ }
+
+ /**
+ * 此时由于上面先处理子节点,所以:
+ * 1.其直系子节点如果全选中,则后续子节点一定全选中,所以只需看直系
+ * 2.非严格模式规则不包含disabled的节点
+ */
+ if (
+ node.children &&
+ !node.disabled &&
+ !node.disabledCheckbox &&
+ node.children.every((child) => {
+ return (
+ keys.includes(child.key) ||
+ child.disabled ||
+ child.disabledCheckbox
+ );
+ }) &&
+ !keys.includes(node.key)
+ ) {
+ keys.push(node.key);
+ }
+ } else {
+ //严格模式,父子不干扰
+ if (initialKeys.includes(node.key) && !keys.includes(node.key))
+ keys.push(node.key);
+ if (node.children) {
+ traverseTree(node.children);
+ }
+ }
+ });
+ };
+
+ traverseTree(treeData);
+ return keys;
+}
+
+/**
+ * 树节点selected选中控制
+ * 优先级:受控>默认
+ */
+
+/**
+ * 受控或默认初始化处理
+ * 1. 在多选模式下:直接返回initialKeys
+ * 2. 在单选模式下:返回第一个元素
+ */
+export function initialCustomSelectedKeys(
+ initialKeys = [],
+ isMultipleMode = false
+) {
+ if (!isMultipleMode) {
+ return [initialKeys[0]];
+ } else {
+ return initialKeys;
+ }
+}
diff --git a/packages/inula2-ui/library_code/src/components/tree/virtualList.jsx b/packages/inula2-ui/library_code/src/components/tree/virtualList.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..9be1b604593ef146d8b1b5334d5f5253f3e79662
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/components/tree/virtualList.jsx
@@ -0,0 +1,93 @@
+import { watch } from "@openinula/next";
+import "./index.css";
+
+const VirtualList = ({
+ height = 400, //虚拟列表容器高度
+ itemHeight = 30, //节点高度
+ items = [], //数据源数组
+ renderItem, //渲染节点的函数
+ buffer = 5, //缓冲区节点个数
+ className = "",
+ style = {},
+}) => {
+ let containerRef;
+ let scrollTop = 0;
+ let visibleItems = [];
+
+ // 计算可见区域内的项目
+ const calculateVisibleItems = () => {
+ if (!containerRef) return;
+ console.log(containerRef, containerRef.scrollTop);
+
+ const currentScrollTop = containerRef.scrollTop;
+ scrollTop = currentScrollTop;
+
+ // 计算可见区域的起始和结束索引
+ const startIndex = Math.max(
+ 0,
+ Math.floor(currentScrollTop / itemHeight) - buffer
+ );
+ const visibleCount = Math.ceil(height / itemHeight) + 2 * buffer;
+ const endIndex = Math.min(items.length - 1, startIndex + visibleCount);
+
+ // 更新可见项目
+ const newVisibleItems = [];
+ for (let i = startIndex; i <= endIndex; i++) {
+ newVisibleItems.push({
+ index: i,
+ item: items[i],
+ style: {
+ position: "absolute",
+ top: `${i * itemHeight}px`,
+ height: `${itemHeight}px`,
+ width: "100%",
+ },
+ });
+ }
+
+ visibleItems = newVisibleItems;
+ };
+
+ // 监听滚动事件
+ watch(() => {
+ if (containerRef) {
+ calculateVisibleItems();
+
+ const handleScroll = () => {
+ requestAnimationFrame(calculateVisibleItems);
+ };
+
+ containerRef.addEventListener("scroll", handleScroll);
+ return () => containerRef.removeEventListener("scroll", handleScroll);
+ }
+ });
+
+ // // 当items变化时重新计算
+ watch(() => {
+ calculateVisibleItems();
+ }, [items]);
+
+ return (
+
+
+ {visibleItems.map(({ index, item, style }) => (
+
+ {renderItem(item, index)}
+
+ ))}
+
+
+ );
+};
+
+export default VirtualList;
diff --git a/packages/inula2-ui/library_code/src/index.css b/packages/inula2-ui/library_code/src/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..0d1e14c4b67f8b9c6dea84328860f9e7785c3632
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/index.css
@@ -0,0 +1,141 @@
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
+ background-color: #f0f4f8;
+ color: #333;
+}
+
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ padding: 20px;
+}
+
+.hero {
+ text-align: center;
+ margin-bottom: 40px;
+}
+
+.hero-title {
+ font-size: 3rem;
+ color: #1a73e8;
+ margin-bottom: 10px;
+}
+
+.hero-subtitle {
+ font-size: 1.5rem;
+ color: #666;
+}
+
+.content {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ justify-content: center;
+}
+
+.card {
+ background: white;
+ border-radius: 8px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ padding: 20px;
+ width: 300px;
+ text-align: center;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
+}
+
+.card h2 {
+ font-size: 1.5rem;
+ color: #1a73e8;
+ margin-bottom: 10px;
+}
+
+.card p {
+ font-size: 1rem;
+ color: #555;
+}
+
+.card a {
+ color: #1a73e8;
+ text-decoration: none;
+ font-weight: bold;
+}
+
+.card a:hover {
+ text-decoration: underline;
+}
+
+/* Animation delays */
+.animate__animated.animate__fadeInDown {
+ animation-delay: 0.2s;
+}
+
+.animate__animated.animate__fadeInUp {
+ animation-delay: 0.4s;
+}
+
+.animate__animated.animate__fadeInLeft {
+ animation-delay: 0.6s;
+}
+
+.animate__animated.animate__fadeInRight {
+ animation-delay: 0.8s;
+}
+
+/* 修改计数器相关的样式 */
+.counter-wrapper {
+ margin-top: 32px;
+ text-align: center;
+ animation-delay: 0.6s;
+}
+
+.counter-display {
+ font-size: 48px;
+ font-weight: 700;
+ color: #1a73e8;
+ margin-bottom: 16px;
+}
+
+.counter-display span {
+ display: inline-block;
+ min-width: 60px;
+}
+
+.counter-btn {
+ background: #1a73e8;
+ color: white;
+ border: none;
+ padding: 12px 28px;
+ border-radius: 24px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.counter-btn:hover {
+ background: #1557b0;
+ transform: translateY(-2px);
+}
+
+.counter-btn:active {
+ transform: translateY(0);
+}
+
+@keyframes numberPop {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.2); }
+ 100% { transform: scale(1); }
+}
+
+.number-pop {
+ animation: numberPop 0.3s ease-out;
+}
\ No newline at end of file
diff --git a/packages/inula2-ui/library_code/src/index.jsx b/packages/inula2-ui/library_code/src/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..75ed745a4c4d874375f9686c2942556629fc79c8
--- /dev/null
+++ b/packages/inula2-ui/library_code/src/index.jsx
@@ -0,0 +1,424 @@
+import { render } from "@openinula/next";
+import "./index.css";
+import "./colors.css";
+import Button from "./components/button/demo.jsx";
+import Icon from "./components/icon/demo.jsx";
+import Checkbox from "./components/checkbox/demo.jsx";
+import Switch from "./components/switch/demo.jsx";
+import Radio from "./components/radio/demo.jsx";
+import Tooltip from "./components/tooltip/demo.jsx";
+import Notification from "./components/Notification/demo.jsx";
+import Spin from "./components/spin/demo.jsx";
+window.render = render;
+import Select from "./components/select/demo.jsx";
+import Input from "./components/input/demo.jsx";
+import Modal from "./components/modal/demo.jsx";
+import DatePicker from "./components/datepicker2/demo.jsx";
+import Form from "./components/form/demo.jsx";
+import Tag from "./components/tag/demo.jsx";
+import { createHashRouter } from "./route.js";
+
+// button demos
+import ButtonDemo1 from "./components/button/demos/demo1.jsx";
+import ButtonDemo2 from "./components/button/demos/demo2.jsx";
+import ButtonDemo3 from "./components/button/demos/demo3.jsx";
+import ButtonDemo4 from "./components/button/demos/demo4.jsx";
+import ButtonDemo5 from "./components/button/demos/demo5.jsx";
+import ButtonDemo6 from "./components/button/demos/demo6.jsx";
+
+// card demos
+import CardDemo1 from "./components/card/demos/demo1.jsx";
+import CardDemo2 from "./components/card/demos/demo2.jsx";
+import CardDemo3 from "./components/card/demos/demo3.jsx";
+import CardDemo4 from "./components/card/demos/demo4.jsx";
+import CardDemo5 from "./components/card/demos/demo5.jsx";
+
+// checkbox demos
+import CheckboxDemo1 from "./components/checkbox/demos/demo1.jsx";
+import CheckboxDemo2 from "./components/checkbox/demos/demo2.jsx";
+import CheckboxDemo3 from "./components/checkbox/demos/demo3.jsx";
+
+// form demos
+import FormDemo1 from "./components/form/demos/demo1.jsx";
+import FormDemo2 from "./components/form/demos/demo2.jsx";
+import FormDemo3 from "./components/form/demos/demo3.jsx";
+import FormDemo4 from "./components/form/demos/demo4.jsx";
+import FormDemo5 from "./components/form/demos/demo5.jsx";
+import FormDemo6 from "./components/form/demos/demo6.jsx";
+import FormDemo7 from "./components/form/demos/demo7.jsx";
+
+// icon demos
+import IconDemo1 from "./components/icon/demos/demo1.jsx";
+import IconDemo2 from "./components/icon/demos/demo2.jsx";
+import IconDemo3 from "./components/icon/demos/demo3.jsx";
+import IconDemo4 from "./components/icon/demos/demo4.jsx";
+import IconDemo5 from "./components/icon/demos/demo5.jsx";
+import IconDemo6 from "./components/icon/demos/demo6.jsx";
+
+// input demos
+import InputDemo1 from "./components/input/demos/demo1.jsx";
+import InputDemo2 from "./components/input/demos/demo2.jsx";
+import InputDemo3 from "./components/input/demos/demo3.jsx";
+import InputDemo4 from "./components/input/demos/demo4.jsx";
+import InputDemo5 from "./components/input/demos/demo5.jsx";
+import InputDemo6 from "./components/input/demos/demo6.jsx";
+import InputDemo7 from "./components/input/demos/demo7.jsx";
+import InputDemo8 from "./components/input/demos/demo8.jsx";
+import InputDemo9 from "./components/input/demos/demo9.jsx";
+
+// modal demos
+import ModalDemo1 from "./components/modal/demos/demo1.jsx";
+import ModalDemo2 from "./components/modal/demos/demo2.jsx";
+import ModalDemo3 from "./components/modal/demos/demo3.jsx";
+import ModalDemo4 from "./components/modal/demos/demo4.jsx";
+import ModalDemo5 from "./components/modal/demos/demo5.jsx";
+import ModalDemo6 from "./components/modal/demos/demo6.jsx";
+import ModalDemo7 from "./components/modal/demos/demo7.jsx";
+
+// notification demos
+import NotificationDemo1 from "./components/notification/demos/demo1.jsx";
+import NotificationDemo2 from "./components/notification/demos/demo2.jsx";
+import NotificationDemo3 from "./components/notification/demos/demo3.jsx";
+import NotificationDemo4 from "./components/notification/demos/demo4.jsx";
+import NotificationDemo5 from "./components/notification/demos/demo5.jsx";
+
+// radio demos
+import RadioDemo1 from "./components/radio/demos/demo1.jsx";
+import RadioDemo2 from "./components/radio/demos/demo2.jsx";
+import RadioDemo3 from "./components/radio/demos/demo3.jsx";
+import RadioDemo4 from "./components/radio/demos/demo4.jsx";
+import RadioDemo5 from "./components/radio/demos/demo5.jsx";
+import RadioDemo6 from "./components/radio/demos/demo6.jsx";
+
+// select demos
+import SelectDemo1 from "./components/select/demos/demo1.jsx";
+import SelectDemo2 from "./components/select/demos/demo2.jsx";
+import SelectDemo3 from "./components/select/demos/demo3.jsx";
+import SelectDemo4 from "./components/select/demos/demo4.jsx";
+import SelectDemo5 from "./components/select/demos/demo5.jsx";
+import SelectDemo6 from "./components/select/demos/demo6.jsx";
+import SelectDemo7 from "./components/select/demos/demo7.jsx";
+import SelectDemo8 from "./components/select/demos/demo8.jsx";
+
+// spin demos
+import SpinDemo1 from "./components/spin/demos/demo1.jsx";
+import SpinDemo2 from "./components/spin/demos/demo2.jsx";
+import SpinDemo3 from "./components/spin/demos/demo3.jsx";
+import SpinDemo4 from "./components/spin/demos/demo4.jsx";
+import SpinDemo5 from "./components/spin/demos/demo5.jsx";
+
+// switch demos
+import SwitchDemo1 from "./components/switch/demos/demo1.jsx";
+import SwitchDemo2 from "./components/switch/demos/demo2.jsx";
+import SwitchDemo3 from "./components/switch/demos/demo3.jsx";
+import SwitchDemo4 from "./components/switch/demos/demo4.jsx";
+
+// tabs demos
+import TabsDemo1 from "./components/tabs/demos/demo1.jsx";
+import TabsDemo2 from "./components/tabs/demos/demo2.jsx";
+import TabsDemo3 from "./components/tabs/demos/demo3.jsx";
+import TabsDemo4 from "./components/tabs/demos/demo4.jsx";
+import TabsDemo5 from "./components/tabs/demos/demo5.jsx";
+import TabsDemo6 from "./components/tabs/demos/demo6.jsx";
+import TabsDemo7 from "./components/tabs/demos/demo7.jsx";
+import TabsDemo8 from "./components/tabs/demos/demo8.jsx";
+import TabsDemo9 from "./components/tabs/demos/demo9.jsx";
+import TabsDemo10 from "./components/tabs/demos/demo10.jsx";
+import TabsDemo11 from "./components/tabs/demos/demo11.jsx";
+
+// tag demos
+import TagDemo1 from "./components/tag/demos/demo1.jsx";
+import TagDemo2 from "./components/tag/demos/demo2.jsx";
+import TagDemo3 from "./components/tag/demos/demo3.jsx";
+import TagDemo4 from "./components/tag/demos/demo4.jsx";
+
+// tooltip demos
+import TooltipDemo1 from "./components/tooltip/demos/demo1.jsx";
+import TooltipDemo2 from "./components/tooltip/demos/demo2.jsx";
+import TooltipDemo3 from "./components/tooltip/demos/demo3.jsx";
+
+//datepicker demos
+import DatePickerDemo1 from "./components/datepicker2/demos/demo1.jsx";
+import DatePickerDemo2 from "./components/datepicker2/demos/demo2.jsx";
+import DatePickerDemo3 from "./components/datepicker2/demos/demo3.jsx";
+import DatePickerDemo4 from "./components/datepicker2/demos/demo4.jsx";
+import DatePickerDemo5 from "./components/datepicker2/demos/demo5.jsx";
+import DatePickerDemo6 from "./components/datepicker2/demos/demo6.jsx";
+import DatePickerDemo7 from "./components/datepicker2/demos/demo7.jsx";
+import DatePickerDemo8 from "./components/datepicker2/demos/demo8.jsx";
+
+//tree demos
+import TreeDemo1 from "./components/tree/demos/demo1.jsx";
+import TreeDemo2 from "./components/tree/demos/demo2.jsx";
+import TreeDemo3 from "./components/tree/demos/demo3.jsx";
+import TreeDemo4 from "./components/tree/demos/demo4.jsx";
+import TreeDemo5 from "./components/tree/demos/demo5.jsx";
+
+window.render = render;
+
+const routes = {
+ "/": () => (
+
+ {/*
欢迎使用 inula-next 组件库!
*/}
+ {/*
请选择一个组件查看示例
*/}
+ {/*
*/}
+
+ ),
+ "/button": Button,
+ "/button/demo1": ButtonDemo1,
+ "/button/demo2": ButtonDemo2,
+ "/button/demo3": ButtonDemo3,
+ "/button/demo4": ButtonDemo4,
+ "/button/demo5": ButtonDemo5,
+ "/button/demo6": ButtonDemo6,
+ "/icon": Icon,
+ "/icon/demo1": IconDemo1,
+ "/icon/demo2": IconDemo2,
+ "/icon/demo3": IconDemo3,
+ "/icon/demo4": IconDemo4,
+ "/icon/demo5": IconDemo5,
+ "/icon/demo6": IconDemo6,
+ "/checkbox": Checkbox,
+ "/checkbox/demo1": CheckboxDemo1,
+ "/checkbox/demo2": CheckboxDemo2,
+ "/checkbox/demo3": CheckboxDemo3,
+ "/switch": Switch,
+ "/switch/demo1": SwitchDemo1,
+ "/switch/demo2": SwitchDemo2,
+ "/switch/demo3": SwitchDemo3,
+ "/switch/demo4": SwitchDemo4,
+ "/radio": Radio,
+ "/radio/demo1": RadioDemo1,
+ "/radio/demo2": RadioDemo2,
+ "/radio/demo3": RadioDemo3,
+ "/radio/demo4": RadioDemo4,
+ "/radio/demo5": RadioDemo5,
+ "/radio/demo6": RadioDemo6,
+ "/tooltip": Tooltip,
+ "/tooltip/demo1": TooltipDemo1,
+ "/tooltip/demo2": TooltipDemo2,
+ "/tooltip/demo3": TooltipDemo3,
+ "/notification": Notification,
+ "/notification/demo1": NotificationDemo1,
+ "/notification/demo2": NotificationDemo2,
+ "/notification/demo3": NotificationDemo3,
+ "/notification/demo4": NotificationDemo4,
+ "/notification/demo5": NotificationDemo5,
+ "/spin": Spin,
+ "/spin/demo1": SpinDemo1,
+ "/spin/demo2": SpinDemo2,
+ "/spin/demo3": SpinDemo3,
+ "/spin/demo4": SpinDemo4,
+ "/spin/demo5": SpinDemo5,
+ "/card": Card,
+ "/card/demo1": CardDemo1,
+ "/card/demo2": CardDemo2,
+ "/card/demo3": CardDemo3,
+ "/card/demo4": CardDemo4,
+ "/card/demo5": CardDemo5,
+ "/tabs": Tabs,
+ "/tabs/demo1": TabsDemo1,
+ "/tabs/demo2": TabsDemo2,
+ "/tabs/demo3": TabsDemo3,
+ "/tabs/demo4": TabsDemo4,
+ "/tabs/demo5": TabsDemo5,
+ "/tabs/demo6": TabsDemo6,
+ "/tabs/demo7": TabsDemo7,
+ "/tabs/demo8": TabsDemo8,
+ "/tabs/demo9": TabsDemo9,
+ "/tabs/demo10": TabsDemo10,
+ "/tabs/demo11": TabsDemo11,
+ "/tree": Tree,
+ "/tree/demo1": TreeDemo1,
+ "/tree/demo2": TreeDemo2,
+ "/tree/demo3": TreeDemo3,
+ "/tree/demo4": TreeDemo4,
+ "/tree/demo5": TreeDemo5,
+ "/select": Select,
+ "/select/demo1": SelectDemo1,
+ "/select/demo2": SelectDemo2,
+ "/select/demo3": SelectDemo3,
+ "/select/demo4": SelectDemo4,
+ "/select/demo5": SelectDemo5,
+ "/select/demo6": SelectDemo6,
+ "/select/demo7": SelectDemo7,
+ "/select/demo8": SelectDemo8,
+ "/input": Input,
+ "/input/demo1": InputDemo1,
+ "/input/demo2": InputDemo2,
+ "/input/demo3": InputDemo3,
+ "/input/demo4": InputDemo4,
+ "/input/demo5": InputDemo5,
+ "/input/demo6": InputDemo6,
+ "/input/demo7": InputDemo7,
+ "/input/demo8": InputDemo8,
+ "/input/demo9": InputDemo9,
+ "/modal": Modal,
+ "/modal/demo1": ModalDemo1,
+ "/modal/demo2": ModalDemo2,
+ "/modal/demo3": ModalDemo3,
+ "/modal/demo4": ModalDemo4,
+ "/modal/demo5": ModalDemo5,
+ "/modal/demo6": ModalDemo6,
+ "/modal/demo7": ModalDemo7,
+ "/datepicker": DatePicker,
+ "/form": Form,
+ "/form/demo1": FormDemo1,
+ "/form/demo2": FormDemo2,
+ "/form/demo3": FormDemo3,
+ "/form/demo4": FormDemo4,
+ "/form/demo5": FormDemo5,
+ "/form/demo6": FormDemo6,
+ "/form/demo7": FormDemo7,
+ "/tag": Tag,
+ "/tag/demo1": TagDemo1,
+ "/tag/demo2": TagDemo2,
+ "/tag/demo3": TagDemo3,
+ "/tag/demo4": TagDemo4,
+ "/datepicker": DatePicker,
+ "/datepicker/demo1": DatePickerDemo1,
+ "/datepicker/demo2": DatePickerDemo2,
+ "/datepicker/demo3": DatePickerDemo3,
+ "/datepicker/demo4": DatePickerDemo4,
+ "/datepicker/demo5": DatePickerDemo5,
+ "/datepicker/demo6": DatePickerDemo6,
+ "/datepicker/demo7": DatePickerDemo7,
+ "/datepicker/demo8": DatePickerDemo8,
+};
+
+const router = createHashRouter(routes);
+
+function App() {
+ return (
+
+
+
+ 欢迎使用 inula-next 组件库!
+
+ {/*
+ Button 组件
+
+
+
+
+
+
+ Checkbox 组件
+
+
+
+
+
+ Switch 组件
+
+
+
+
+
+ Radio 组件
+
+
+
+
+
+ Tooltip 组件
+
+
+
+
+
+ Notification 通知组件
+
+
+
+
+
+ Spin 加载组件
+
+
+
+
+
+ Card 组件
+
+
+
+
+
+ Tabs 组件
+
+
+
+
+
+ Tree 组件
+
+
+
+
+
+ Select 选择器组件
+
+
+
+
+
+ Input 输入框组件
+
+
+
+
+
+ Modal 模态框组件
+
+
+
+
{" "}
+ */}
+
+ DatePicker 日期选择器组件
+
+
+
+
+
+ Icon 组件
+
+
+
+
+
+ Form 表单组件
+
+
+
+
+
+
+ );
+}
+
+const root = document.getElementById("root");
+function mount() {
+ render(, root);
+}
+router.onChange(mount);
+mount();
diff --git a/packages/inula2-ui/library_code/vite.config.js b/packages/inula2-ui/library_code/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbb1d80582b9bc99059e14021c0d1b2ed69b8fe6
--- /dev/null
+++ b/packages/inula2-ui/library_code/vite.config.js
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vite';
+import inula from '@openinula/unplugin/vite';
+
+export default defineConfig({
+ optimizeDeps: {
+ disabled: true,
+ },
+ plugins: [inula({ files: '**/*.{ts,js,tsx,jsx}' })],
+ esbuild: {
+ jsxFactory: 'Inula.createElement',
+ jsxFragment: 'Inula.Fragment',
+ jsxInject: `import * as Inula from '@openinula/next'`
+ }
+});
diff --git a/packages/website-next/.gitignore b/packages/website-next/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b967fc610bab874542dd510b2db30e0b672765ac
--- /dev/null
+++ b/packages/website-next/.gitignore
@@ -0,0 +1,52 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/openInula/node_modules
+/openInula/dist
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# env files (can opt-in for committing if needed)
+.env*
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+#IDE
+.idea/
+
+package-lock.json
+yarn.lock
+pnpm-lock.yaml
+
+_pagefind/
\ No newline at end of file
diff --git a/packages/website-next/README.md b/packages/website-next/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..af819872621a9e96615073d358bf9db16d94ee8c
--- /dev/null
+++ b/packages/website-next/README.md
@@ -0,0 +1,166 @@
+# OpenInula 官网(Next.js 版)
+
+## 项目简介
+
+OpenInula 是一个现代化的 JavaScript UI 框架,致力于提供极致性能和开发体验。本仓库为 OpenInula 新一代官网,基于 Next.js 13+(App Router)与 Tailwind CSS 构建,提供文档、教程、示例与 Playground 等站点能力。
+
+---
+
+## 核心特性
+
+- **编译优先**:在编译期完成大部分工作,缩短运行时开销
+- **细粒度响应式**:自动追踪依赖,减少不必要重渲染
+- **API 兼容性**:与 React 生态高度契合,平滑迁移
+- **模板增强**:内置 if/for 等模板指令
+- **站点体验**:深色模式、搜索、高亮、课程与示例、交互动效
+
+---
+
+## 环境要求
+
+- Node.js ≥ 18
+- 包管理器:推荐 pnpm(也可使用 yarn/npm)
+- 由于本仓库包含 `openInula` 子项目(Vite 应用),其 Vite 插件要求 Node ≥ 18
+
+---
+
+## 安装与启动
+
+1. 安装依赖(根项目):
+
+```bash
+pnpm install
+```
+
+2. 安装依赖(可选,openInula 子项目用于 Playground REPL 示例):
+
+```bash
+cd openInula && pnpm install
+```
+
+3. 本地开发:
+
+```bash
+# 在根目录启动 Next.js 开发服务器
+pnpm dev
+
+# 如需同时启动 openInula 子项目(可选)
+cd openInula && pnpm dev
+```
+4. 启用文档搜索
+```bash
+#首先构建项目
+pnpm build --no-lint
+
+#然后运行 postbuild 生成搜索索引
+pnpm postbuild
+```
+---
+
+## 构建与部署
+
+- 根站点构建:
+首先将openInula文件夹移到其他地方,不要在项目根目录。同时,也需要进入openInula文件夹进行一次pnpm build构建
+
+```bash
+pnpm build --no-lint
+pnpm postbuild
+```
+
+- 站点启动(生产):
+
+```bash
+pnpm start
+```
+
+- 构建后搜索索引:构建完成会自动执行 `postbuild`,用 Pagefind 生成到 `public/_pagefind`。
+
+- 注意事项(重要):
+ - 本仓库包含 `openInula/` 子目录(一个独立的 Vite 应用,仅供 REPL/Playground),默认情况下并不会影响 Next.js 的构建。但如果你的自定义流程将其纳入同一产物或分析,请避免把 `openInula` 误当作 Next.js 的子模块进行打包。
+
+---
+
+## 目录结构(节选)
+
+```
+website-next/
+├─ src/
+│ ├─ app/ # Next.js App Router 页面与路由
+│ │ ├─ docs/ # 文档(MDX)与文档页
+│ │ ├─ playground/ # 教学与 Playground 页面
+│ │ ├─ api/ # API 文档/说明页
+│ │ └─ ...
+│ ├─ components/ # 站点通用组件(含 HomePage、UI 组件等)
+│ └─ lib/ # 工具、hooks、性能与 utils
+├─ public/ # 静态资源(含 Pagefind 索引输出 _pagefind)
+├─ openInula/ # 独立 Vite 应用(用于 REPL/Playground 示例)
+├─ package.json
+└─ README.md
+```
+
+---
+
+## 常用脚本
+
+根目录 `package.json`:
+
+```json
+{
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "postbuild": "pagefind --site .next/server/app --output-path public/_pagefind"
+ }
+}
+```
+
+- **dev**: 启动 Next.js 开发服务器
+- **build**: 生产构建(会为 App Router 产出 `.next`)
+- **start**: 启动生产服务
+- **lint**: 运行 ESLint 检查
+- **postbuild**: 构建后生成 Pagefind 搜索索引
+
+`openInula/package.json`(子项目):
+
+```json
+{
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ }
+}
+```
+
+---
+
+## FAQ / 故障排查
+
+- **Pagefind 索引未生成或搜索无结果**
+ - 确认构建成功后已执行 `postbuild`。也可手动运行:
+ ```bash
+ pnpm build && pnpm exec pagefind --site .next/server/app --output-path public/_pagefind
+ ```
+- **本地开发页面加载缓慢或样式异常**
+ - 删除 `.next/` 与 `node_modules/` 重新安装依赖;检查 `tailwindcss` 版本与 PostCSS 配置是否匹配。
+- **Playground 示例不工作**
+ - `openInula/` 子项目需单独 `pnpm install` 与 `pnpm dev`;确保依赖 `openinula`、`inula-router` 正常安装。
+
+---
+
+## 贡献
+
+欢迎任何形式的贡献!
+
+1. Fork 本仓库并克隆到本地
+2. 从 `main` 切出特性分支进行开发
+3. 发起 MR 并补充说明变更点与动机
+
+详细流程与行为准则请参阅:
+
+- `src/app/docs/conventional/ContributingGuide/page.mdx`
+- `src/app/docs/conventional/CodeOfConduct/page.mdx`
+
+---
\ No newline at end of file
diff --git a/packages/website-next/components.json b/packages/website-next/components.json
new file mode 100644
index 0000000000000000000000000000000000000000..ffe928f5b6dfe484f57a5fd47d0487f21e164fa3
--- /dev/null
+++ b/packages/website-next/components.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "",
+ "css": "src/app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "iconLibrary": "lucide"
+}
\ No newline at end of file
diff --git a/packages/website-next/eslint.config.mjs b/packages/website-next/eslint.config.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..c85fb67c463f20d1ee449b0ffee725a61dfb9259
--- /dev/null
+++ b/packages/website-next/eslint.config.mjs
@@ -0,0 +1,16 @@
+import { dirname } from "path";
+import { fileURLToPath } from "url";
+import { FlatCompat } from "@eslint/eslintrc";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+ baseDirectory: __dirname,
+});
+
+const eslintConfig = [
+ ...compat.extends("next/core-web-vitals", "next/typescript"),
+];
+
+export default eslintConfig;
diff --git a/packages/website-next/index.d.ts b/packages/website-next/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90103deed549c74f25a4ca360162f0614163704e
--- /dev/null
+++ b/packages/website-next/index.d.ts
@@ -0,0 +1,461 @@
+import { ReactNode } from "react";
+
+// ==================== 通用类型 ====================
+export type Theme = "light" | "dark";
+
+// ==================== 导航相关接口 ====================
+export interface DropdownItem {
+ name: string;
+ href: string;
+}
+
+export interface DropdownMenuProps {
+ name: string;
+ href: string;
+ dropdown: DropdownItem[];
+ isActive: boolean;
+ isHovered: boolean;
+ onMouseEnter: () => void;
+ onMouseLeave: () => void;
+}
+
+export interface SearchBarProps {
+ placeholder?: string;
+ onSearch: (query: string) => void;
+}
+
+export interface CustomSearchProps {
+ onSearch: (query: string) => void;
+}
+
+// ==================== 首页相关接口 ====================
+export interface Partner {
+ name: string;
+ logo: string;
+ url: string;
+}
+
+export interface FeatureCardProps {
+ title: string;
+ description: string;
+ icon: ReactNode;
+ className?: string;
+}
+
+export interface ActivityProps {
+ tabItems?: string[];
+}
+
+export interface LoadMoreSectionProps {
+ title: string;
+ items: T[];
+ renderItem: (item: T) => ReactNode;
+ initialCount?: number;
+ step?: number;
+}
+
+// ==================== 活动、资讯组件相关接口 ====================
+export interface NewsItem {
+ key: number;
+ img: string;
+ title: string;
+ introduce: string;
+ time: string;
+}
+
+export interface ActivityItem {
+ key: number;
+ img: string;
+ name: string;
+ introduce: string;
+ beginTime: string;
+ endTime: string;
+ type: string;
+}
+
+// ==================== 博客相关接口 ====================
+export interface BlogItem {
+ key: number;
+ img?: string;
+ title: string;
+ time: string;
+ author: string;
+ type: string;
+ tags?: string[];
+}
+
+export interface BlogCardProps {
+ blog: BlogItem;
+ theme: string | undefined;
+}
+
+export interface BlogListProps {
+ blogs: BlogItem[];
+ theme: string | undefined;
+}
+
+export interface BlogFilterBarProps {
+ onFilterChange: (filter: string) => void;
+ activeFilter: string;
+}
+
+export interface BlogPaginationProps {
+ currentPage: number;
+ totalPages: number;
+ onPageChange: (page: number) => void;
+}
+
+// ==================== 贡献者相关接口 ====================
+export interface Contributor {
+ name: string;
+ avatar: string;
+ role: string;
+ description: string;
+ github?: string;
+ email?: string;
+}
+
+// ==================== 文档相关接口 ====================
+export interface DocumentItem {
+ id: string;
+ title: string;
+ url?: string;
+ description: string;
+}
+
+export interface DocumentSidebarProps {
+ documents: DocumentItem[];
+ defaultActiveId?: string;
+ title?: string;
+ onDocumentChange?: (docId: string) => void;
+ className?: string;
+ children?: (currentDoc: DocumentItem | undefined) => ReactNode;
+}
+
+// ==================== Playground相关接口 ====================
+export interface PlaygroundItem {
+ id: number;
+ title: string;
+ description: string;
+ category: string;
+ subcategory?: string;
+ slug: string;
+ content?: string;
+ code?: string;
+}
+
+export interface PlaygroundSidebarProps {
+ playgroundData: PlaygroundItem[];
+ selectedItem: PlaygroundItem | null;
+ isCollapsed: boolean;
+ onToggleCollapse: () => void;
+}
+
+export interface PlaygroundContentProps {
+ selectedItem: PlaygroundItem | null;
+}
+
+// ==================== 项目相关接口 ====================
+export interface Course {
+ id: string;
+ title: string;
+ description: string;
+ image: string;
+ duration: string;
+ level: string;
+ tags: string[];
+}
+
+// ==================== 页面组件接口 ====================
+export interface MDXDetailPageProps {
+ children: ReactNode;
+}
+
+export interface MarkdownPageProps {
+ title: string;
+ description?: string;
+ children: ReactNode;
+ className?: string;
+}
+
+// ==================== MagicUI组件接口 ====================
+export interface AuroraTextProps {
+ children: ReactNode;
+ className?: string;
+}
+
+export interface MeteorsProps {
+ number?: number;
+}
+
+export interface MagicCardProps {
+ children: ReactNode;
+ className?: string;
+ gradientColor?: string;
+}
+
+export interface CodeComparisonProps {
+ leftCode: string;
+ rightCode: string;
+ leftTitle?: string;
+ rightTitle?: string;
+ language?: string;
+}
+
+// ==================== 主题相关接口 ====================
+export interface ThemeToggleProps {
+ className?: string;
+}
+
+export interface ThemeScriptProps {
+ theme?: string;
+}
+
+// ==================== 性能相关接口 ====================
+export interface PerformanceMetrics {
+ renderTime: number;
+ memoryUsage: number;
+ bundleSize: number;
+}
+
+export interface PerformanceComparisonProps {
+ inulaMetrics: PerformanceMetrics;
+ reactMetrics: PerformanceMetrics;
+ vueMetrics: PerformanceMetrics;
+}
+
+// ==================== API相关接口 ====================
+export interface ApiResponse {
+ success: boolean;
+ data?: T;
+ message?: string;
+ error?: string;
+}
+
+export interface PaginationParams {
+ page: number;
+ limit: number;
+ total?: number;
+}
+
+export interface SearchParams {
+ query: string;
+ filters?: Record;
+ sortBy?: string;
+ sortOrder?: "asc" | "desc";
+}
+
+// ==================== 表单相关接口 ====================
+export interface FormField {
+ name: string;
+ label: string;
+ type:
+ | "text"
+ | "email"
+ | "password"
+ | "textarea"
+ | "select"
+ | "checkbox"
+ | "radio";
+ required?: boolean;
+ placeholder?: string;
+ options?: Array<{ value: string; label: string }>;
+ validation?: {
+ pattern?: RegExp;
+ message?: string;
+ minLength?: number;
+ maxLength?: number;
+ };
+}
+
+export interface FormProps {
+ fields: FormField[];
+ onSubmit: (data: Record) => void;
+ submitText?: string;
+ className?: string;
+}
+
+// ==================== 路由相关接口 ====================
+export interface RouteConfig {
+ path: string;
+ component: React.ComponentType;
+ exact?: boolean;
+ children?: RouteConfig[];
+ meta?: {
+ title?: string;
+ requiresAuth?: boolean;
+ roles?: string[];
+ };
+}
+
+// ==================== 国际化相关接口 ====================
+export interface LocaleConfig {
+ code: string;
+ name: string;
+ flag?: string;
+}
+
+export interface I18nContextType {
+ locale: string;
+ setLocale: (locale: string) => void;
+ t: (key: string, params?: Record) => string;
+}
+
+// ==================== 错误处理相关接口 ====================
+export interface ErrorBoundaryState {
+ hasError: boolean;
+ error?: Error;
+ errorInfo?: React.ErrorInfo;
+}
+
+export interface ErrorBoundaryProps {
+ children: ReactNode;
+ fallback?: React.ComponentType<{ error: Error; resetError: () => void }>;
+}
+
+// ==================== 动画相关接口 ====================
+export interface AnimationConfig {
+ duration: number;
+ easing: string;
+ delay?: number;
+ direction?: "normal" | "reverse" | "alternate" | "alternate-reverse";
+ fillMode?: "none" | "forwards" | "backwards" | "both";
+ iterationCount?: number | "infinite";
+}
+
+export interface AnimatedComponentProps {
+ animation: AnimationConfig;
+ children: ReactNode;
+ className?: string;
+ onAnimationEnd?: () => void;
+}
+
+// ==================== 存储相关接口 ====================
+export interface StorageConfig {
+ key: string;
+ defaultValue?: any;
+ serializer?: {
+ serialize: (value: any) => string;
+ deserialize: (value: string) => any;
+ };
+}
+
+export interface UseStorageReturn {
+ value: T;
+ setValue: (value: T | ((prev: T) => T)) => void;
+ removeValue: () => void;
+}
+
+// ==================== 网络请求相关接口 ====================
+export interface RequestConfig {
+ url: string;
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
+ headers?: Record;
+ body?: any;
+ timeout?: number;
+ retries?: number;
+ retryDelay?: number;
+}
+
+export interface UseRequestReturn {
+ data: T | null;
+ loading: boolean;
+ error: Error | null;
+ execute: (config?: Partial) => Promise;
+ reset: () => void;
+}
+
+// ==================== 工具函数类型 ====================
+export type DebounceFunction any> = (
+ func: T,
+ delay: number
+) => (...args: Parameters) => void;
+
+export type ThrottleFunction any> = (
+ func: T,
+ delay: number
+) => (...args: Parameters) => void;
+
+export type DeepPartial = {
+ [P in keyof T]?: T[P] extends object ? DeepPartial : T[P];
+};
+
+export type Optional = Omit & Partial>;
+
+export type Required = T & Required>;
+
+export type ValueOf = T[keyof T];
+
+export type ArrayElement = T extends Array ? U : never;
+
+// ==================== 事件相关接口 ====================
+export interface EventHandler {
+ (event: T): void;
+}
+
+export interface KeyboardEvent {
+ key: string;
+ code: string;
+ ctrlKey: boolean;
+ shiftKey: boolean;
+ altKey: boolean;
+ metaKey: boolean;
+}
+
+export interface MouseEvent {
+ x: number;
+ y: number;
+ button: number;
+ buttons: number;
+}
+
+// ==================== 媒体相关接口 ====================
+export interface MediaQuery {
+ query: string;
+ matches: boolean;
+}
+
+export interface UseMediaQueryReturn {
+ matches: boolean;
+ addListener: (callback: (matches: boolean) => void) => void;
+ removeListener: (callback: (callback: boolean) => void) => void;
+}
+
+// ==================== 时间相关接口 ====================
+export interface TimeConfig {
+ format: string;
+ timezone?: string;
+ locale?: string;
+}
+
+export interface UseTimerReturn {
+ time: Date;
+ start: () => void;
+ stop: () => void;
+ reset: () => void;
+ isRunning: boolean;
+}
+
+// ==================== 验证相关接口 ====================
+export interface ValidationRule {
+ required?: boolean;
+ minLength?: number;
+ maxLength?: number;
+ pattern?: RegExp;
+ custom?: (value: any) => boolean | string;
+}
+
+export interface ValidationResult {
+ isValid: boolean;
+ errors: string[];
+}
+
+export interface UseValidationReturn {
+ values: T;
+ errors: Partial>;
+ touched: Partial>;
+ handleChange: (field: keyof T, value: any) => void;
+ handleBlur: (field: keyof T) => void;
+ validate: () => ValidationResult;
+ reset: () => void;
+}
diff --git a/packages/website-next/next.config.ts b/packages/website-next/next.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a24f1be8c258094ed590dcec54bbe4e5d1695436
--- /dev/null
+++ b/packages/website-next/next.config.ts
@@ -0,0 +1,22 @@
+import type { NextConfig } from "next";
+import nextra from 'nextra'
+
+const nextConfig: NextConfig = {
+ pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'openinula-website.obs.ap-southeast-1.myhuaweicloud.com',
+ port: '',
+ pathname: '/img/**',
+ },
+ ],
+ },
+};
+
+const withNextra = nextra({
+ defaultShowCopyCode: true,
+})
+
+export default withNextra(nextConfig)
diff --git a/packages/website-next/openInula/README.md b/packages/website-next/openInula/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..542c363af9c0adaf5c7f2e51635204f0da16886f
--- /dev/null
+++ b/packages/website-next/openInula/README.md
@@ -0,0 +1,4 @@
+# openinula + vite
+
+该模板提供了 `openinula` 工作在 `vite`的基础配置。
+> 请注意由于Vite插件有node版本限制,请使用`node -v`命令确认node版本大于等于node v18。
\ No newline at end of file
diff --git a/packages/website-next/openInula/index.html b/packages/website-next/openInula/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..36465750d0be84de41dd2bd4b998348dd2a15865
--- /dev/null
+++ b/packages/website-next/openInula/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ PlayGround
+
+
+
+
+
+
+
diff --git a/packages/website-next/openInula/package.json b/packages/website-next/openInula/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d558964ea29e6748b6b0003a312df3ebfc73917d
--- /dev/null
+++ b/packages/website-next/openInula/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "inula-vite-app",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MulanPSL2",
+ "dependencies": {
+ "@babytian/openinula-repl-next": "^0.0.1",
+ "inula-router": "^1.0.16",
+ "openinula": "^0.1.1"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.21.4",
+ "@babel/preset-env": "^7.21.4",
+ "@babel/preset-react": "^7.18.6",
+ "@vitejs/plugin-react": "^3.1.0",
+ "@vitejs/plugin-react-refresh": "^1.3.6",
+ "babel-plugin-import": "^1.13.6",
+ "vite": "^4.2.1"
+ }
+}
diff --git a/packages/website-next/openInula/pnpm-workspace.yaml b/packages/website-next/openInula/pnpm-workspace.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..44c7411ca8b7024d569d4d4f4531c612cb301bc1
--- /dev/null
+++ b/packages/website-next/openInula/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+overrides:
+ openinula-repl-next: link:../../repl
diff --git a/packages/website-next/openInula/src/components/HomePage.jsx b/packages/website-next/openInula/src/components/HomePage.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..b0ffdb49d771c0d735f066dde01e17c908a9b4e4
--- /dev/null
+++ b/packages/website-next/openInula/src/components/HomePage.jsx
@@ -0,0 +1,32 @@
+
+import Inula, {useMemo, useRef} from 'openinula';
+import { Repl, Editor, Viewer } from '@babytian/openinula-repl-next'
+
+export default function App() {
+ const coded = useMemo(() => `
+import { render } from '@openinula/next';
+function HelloWorld() {
+ return Hello OpenInula_next!!
;
+}
+
+render(HelloWorld(), document.getElementById('app'));
+`, []);
+
+ const editorRef = useRef();
+ const viewerRef = useRef();
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/openInula/src/components/PlaygroundPage.jsx b/packages/website-next/openInula/src/components/PlaygroundPage.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..b6878492ac13f9c37fe763644a220ff92322d41e
--- /dev/null
+++ b/packages/website-next/openInula/src/components/PlaygroundPage.jsx
@@ -0,0 +1,79 @@
+import { useRef, useEffect, useState } from 'openinula';
+import { Repl, Editor, Viewer } from '@babytian/openinula-repl-next';
+import { getCodeById } from '../lib/code.ts';
+
+function PlaygroundPage() {
+ // 从 URL 查询参数获取初始代码 ID,避免首屏回退到 HelloWorld
+ let initialId = 1;
+ try {
+ const params = new URLSearchParams(window.location.search);
+ const idParam = params.get('id');
+ if (idParam) {
+ const parsed = Number(idParam);
+ if (!Number.isNaN(parsed)) initialId = parsed;
+ }
+ } catch (e) {
+ // 忽略解析错误,保持默认 id = 1
+ }
+
+ const initialCode = getCodeById(initialId) || getCodeById(1) || '';
+
+ const [code, setCode] = useState(initialCode);
+
+ useEffect(() => {
+ const handler = (event) => {
+ const { type, payload } = event.data || {};
+
+ // 处理传统的代码字符串方式(向下兼容)
+ if (type === "SET_CODE" && payload) {
+ setCode(payload);
+ }
+
+ // 处理新的代码ID方式
+ if (type === "SET_CODE_BY_ID" && payload) {
+ const codeFromId = getCodeById(payload);
+ if (codeFromId) {
+ console.log('Setting new code for ID:', payload);
+ setCode(codeFromId);
+ } else {
+ console.warn(`未找到ID为 ${payload} 的代码示例`);
+ }
+ }
+ };
+
+ // 添加消息监听器
+ window.addEventListener("message", handler);
+
+ // 通知父窗口 iframe 已就绪,方便外部在需要时重发
+ try {
+ window.parent?.postMessage({ type: 'IFRAME_READY' }, '*');
+ } catch (e) {}
+
+ return () => {
+ window.removeEventListener("message", handler);
+ };
+ }, []);
+
+ const editorRef = useRef();
+ const viewerRef = useRef();
+ const CustomEmptyMenu = () => ;
+
+ return (
+
+ );
+}
+
+export default PlaygroundPage;
diff --git a/packages/website-next/openInula/src/index.css b/packages/website-next/openInula/src/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..be0ab6c6d5bd3b1406afe759ae8a4e28518e64ce
--- /dev/null
+++ b/packages/website-next/openInula/src/index.css
@@ -0,0 +1,3 @@
+* {
+ box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/packages/website-next/openInula/src/index.jsx b/packages/website-next/openInula/src/index.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..3dfd911958cca17121502216bfaf57b9437b4dce
--- /dev/null
+++ b/packages/website-next/openInula/src/index.jsx
@@ -0,0 +1,19 @@
+import { BrowserRouter, Route, Switch } from 'inula-router';
+
+import HomePage from "./components/HomePage";
+import PlaygroundPage from "./components/PlaygroundPage";
+import Inula from "openinula";
+
+function App() {
+ return (
+
+
+
+
+ {/* 可以在这里添加更多路由 */}
+
+
+ );
+}
+
+Inula.render(, document.getElementById('root'));
diff --git a/packages/website-next/openInula/src/lib/code.ts b/packages/website-next/openInula/src/lib/code.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d34c813c6ba0a5c7c8a17c198b88771d88759a35
--- /dev/null
+++ b/packages/website-next/openInula/src/lib/code.ts
@@ -0,0 +1,199 @@
+export const codeSamples = [
+ {
+ id: 1,
+ title: "入门",
+ code: `import { render } from '@openinula/next';
+
+ function HelloWorld() {
+ return Hello World!
;
+}
+
+render(HelloWorld(), document.getElementById('app'));`,
+ },
+ {
+ id: 2,
+ title: "组件",
+ code: `import { render } from '@openinula/next';
+
+ function App() {
+ return This is my first component
;
+}
+
+render(App(), document.getElementById('app'));`,
+ },
+ {
+ id: 3,
+ title: "状态管理",
+ code: `import { render } from '@openinula/next';
+
+ function UserInput() {
+ let count = 0;
+ function incrementCount() {
+ count = count + 1;
+ }
+
+ return (
+ <>
+ {count}
+
+ >
+ );
+}
+
+render(UserInput(), document.getElementById('app'));
+`,
+ },
+ {
+ id: 4,
+ title: "计算属性",
+ code: `import { render } from '@openinula/next';
+
+ function DoubleCounter() {
+ let count = 0;
+ // 计算值:double 会自动随着 count 变化
+ const double = count * 2;
+
+ return (
+
+
当前计数:{count}
+
双倍值:{double}
+
+
+ );
+}
+
+render(, document.getElementById('app'));`,
+ },
+ {
+ id: 5,
+ title: "监听系统",
+ code: `import { render, watch} from '@openinula/next';
+
+ function MultiWatch() {
+ let a = 1;
+ let b = 2;
+
+ watch(() => {
+ console.log('a 变化:' + a);
+ });
+ watch(() => {
+ console.log('b 变化:' + b);
+ });
+
+ return (
+
+
+
+
+ );
+}
+
+render(, document.getElementById('app'));`,
+ },
+ {
+ id: 6,
+ title: "条件渲染",
+ code: `import { render } from '@openinula/next';
+
+function TrafficLight() {
+ let lightIndex = 0;
+
+ let light = lightIndex ? 'green' : 'red';
+
+ function nextLight() {
+ lightIndex = (lightIndex + 1) % 2;
+ }
+
+ return (
+ <>
+
+ Light is: {light}
+
+ You must:
+
+ STOP
+
+
+ GO
+
+
+ >
+ );
+}
+
+render(TrafficLight(), document.getElementById('app'));
+`,
+ },
+ {
+ id: 7,
+ title: "列表渲染",
+ code: `import { render } from '@openinula/next';
+
+function FruitList() {
+ const fruits = ['苹果', '香蕉', '橙子'];
+
+ return (
+
+
+ {(fruit) => - {fruit}
}
+
+
+ );
+}
+
+render(, document.getElementById('app'));`,
+ },
+ {
+ id: 8,
+ title: "事件处理",
+ code: `import { render } from '@openinula/next';
+
+function ClickCounter() {
+ let count = 0;
+
+ function handleClick() {
+ count++;
+ }
+
+ return (
+
+ );
+}
+
+render(, document.getElementById('app'));`,
+ },
+ {
+ id: 9,
+ title: "生命周期",
+ code: `import { render } from '@openinula/next';
+
+function PageTitle() {
+ let counts = 0;
+ didMount(() => {
+ counts = counts + 5;
+ });
+ return 页面标题:{counts}
;
+}
+
+render(, document.getElementById('app'));`,
+ },
+];
+
+export const getCodeById = (id: number): string | null => {
+ console.log(
+ "getCodeById called with ID:",
+ id,
+ "Available samples:",
+ codeSamples.map((s) => ({ id: s.id, title: s.title }))
+ );
+ const sample = codeSamples.find((sample) => sample.id === id);
+ if (sample) {
+ console.log("Found sample:", sample.title);
+ return sample.code;
+ } else {
+ console.warn("No sample found for ID:", id);
+ return null;
+ }
+};
diff --git a/packages/website-next/openInula/vite.config.js b/packages/website-next/openInula/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..ae06c555f366b930ab9ce77739109cd91d3f1629
--- /dev/null
+++ b/packages/website-next/openInula/vite.config.js
@@ -0,0 +1,58 @@
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+let alias = {
+ react: "openinula",
+ "react-dom": "openinula",
+ "react/jsx-dev-runtime": "openinula/jsx-dev-runtime",
+ "react/jsx-runtime": "openinula/jsx-runtime",
+ "@openinula/next": "openinula",
+};
+
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias,
+ },
+
+ build: {
+ outDir: "dist",
+ assetsDir: "assets",
+ sourcemap: false, // 禁用 sourcemap 以避免混淆问题
+ minify: false,
+
+ rollupOptions: {
+ input: {
+ main: "./index.html",
+ },
+ output: {
+ manualChunks: undefined,
+ globals: {
+ openinula: "Inula",
+ "inula-router": "InulaRouter",
+ },
+ },
+ },
+
+ target: "es2015",
+ cssCodeSplit: false,
+ chunkSizeWarningLimit: 1000,
+ lib: false,
+ ssr: false,
+ },
+
+ server: {
+ port: 5173,
+ open: true,
+ },
+
+ optimizeDeps: {
+ include: ["openinula", "inula-router", "@babytian/openinula-repl-next"],
+ force: true,
+ },
+
+ esbuild: {
+ keepNames: true,
+ legalComments: "none",
+ },
+});
diff --git a/packages/website-next/package.json b/packages/website-next/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..5591dd2028456ae3d5854766978feb6875bcfc09
--- /dev/null
+++ b/packages/website-next/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "website-next",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "postbuild": "pagefind --site .next/server/app --output-path public/_pagefind"
+ },
+ "dependencies": {
+ "@ant-design/icons": "^6.0.0",
+ "@mdx-js/loader": "^3.1.0",
+ "@mdx-js/react": "^3.1.0",
+ "@next/mdx": "^15.3.5",
+ "@shikijs/transformers": "^3.7.0",
+ "@types/mdx": "^2.0.13",
+ "antd": "^5.26.5",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "gsap": "^3.13.0",
+ "highlight.js": "^11.11.1",
+ "lucide-react": "^0.525.0",
+ "motion": "^12.23.6",
+ "next": "15.4.1",
+ "next-themes": "^0.4.6",
+ "nextra": "^4.2.17",
+ "nextra-theme-docs": "^4.2.17",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "react-intersection-observer": "^9.16.0",
+ "react-markdown": "^10.1.0",
+ "shiki": "^3.7.0",
+ "tailwind-merge": "^3.3.1"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3.3.1",
+ "@tailwindcss/postcss": "^4.1.11",
+ "@tailwindcss/typography": "^0.5.16",
+ "@types/node": "^20.19.4",
+ "@types/react": "^19.1.8",
+ "@types/react-dom": "^19.1.6",
+ "eslint": "^9.30.1",
+ "eslint-config-next": "15.3.4",
+ "pagefind": "^1.3.0",
+ "tailwindcss": "^4.1.11",
+ "tw-animate-css": "^1.3.5",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/packages/website-next/postcss.config.mjs b/packages/website-next/postcss.config.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..61e36849cf7cfa9f1f71b4a3964a4953e3e243d3
--- /dev/null
+++ b/packages/website-next/postcss.config.mjs
@@ -0,0 +1,7 @@
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+
+export default config;
diff --git a/packages/website-next/public/ContactUsPage/img.png b/packages/website-next/public/ContactUsPage/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd3cb3f338c83342008c0a5f389bdc0f765f3c6e
Binary files /dev/null and b/packages/website-next/public/ContactUsPage/img.png differ
diff --git a/packages/website-next/public/ContactUsPage/logo.normal.png b/packages/website-next/public/ContactUsPage/logo.normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..44cbadcb987df16e1a83a3d37ca305ff34f1e20b
Binary files /dev/null and b/packages/website-next/public/ContactUsPage/logo.normal.png differ
diff --git a/packages/website-next/public/ContactUsPage/map.png b/packages/website-next/public/ContactUsPage/map.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cdb5d3035ac0eb66d094c4725e0c12b350ac469
Binary files /dev/null and b/packages/website-next/public/ContactUsPage/map.png differ
diff --git a/packages/website-next/public/favicon.ico b/packages/website-next/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..b1919800714d1ce2b1266ce7b76e42c8088b5bd9
Binary files /dev/null and b/packages/website-next/public/favicon.ico differ
diff --git a/packages/website-next/public/file.svg b/packages/website-next/public/file.svg
new file mode 100644
index 0000000000000000000000000000000000000000..004145cddf3f9db91b57b9cb596683c8eb420862
--- /dev/null
+++ b/packages/website-next/public/file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/website-next/public/font/geist-v3-latin-regular.woff2 b/packages/website-next/public/font/geist-v3-latin-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..a190bc9f36ee8e3453fbe6324f940cd884c727bb
Binary files /dev/null and b/packages/website-next/public/font/geist-v3-latin-regular.woff2 differ
diff --git a/packages/website-next/public/footerIcon.bilibili.png b/packages/website-next/public/footerIcon.bilibili.png
new file mode 100644
index 0000000000000000000000000000000000000000..6445ea1850acbc4c7af12f7ec413e8bccb183b97
Binary files /dev/null and b/packages/website-next/public/footerIcon.bilibili.png differ
diff --git a/packages/website-next/public/footerIcon.gitee.png b/packages/website-next/public/footerIcon.gitee.png
new file mode 100644
index 0000000000000000000000000000000000000000..773358b6e3efbbed23ff81dc102bca97567aa7fc
Binary files /dev/null and b/packages/website-next/public/footerIcon.gitee.png differ
diff --git a/packages/website-next/public/footerIcon.qrcode.png b/packages/website-next/public/footerIcon.qrcode.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce5e89bec3fb384be089060f83a4a206a9968bce
Binary files /dev/null and b/packages/website-next/public/footerIcon.qrcode.png differ
diff --git a/packages/website-next/public/globe.svg b/packages/website-next/public/globe.svg
new file mode 100644
index 0000000000000000000000000000000000000000..567f17b0d7c7fb662c16d4357dd74830caf2dccb
--- /dev/null
+++ b/packages/website-next/public/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/website-next/public/navlogo.png b/packages/website-next/public/navlogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7009246c037aaefd6f28b924be92912d67f1b696
Binary files /dev/null and b/packages/website-next/public/navlogo.png differ
diff --git a/packages/website-next/public/navlogowhite.png b/packages/website-next/public/navlogowhite.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f2c57b4d4410b7d0aea2790cb3f05f008650faa
Binary files /dev/null and b/packages/website-next/public/navlogowhite.png differ
diff --git a/packages/website-next/public/next.svg b/packages/website-next/public/next.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5174b28c565c285e3e312ec5178be64fbeca8398
--- /dev/null
+++ b/packages/website-next/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/website-next/public/qrcode.inula.jpg b/packages/website-next/public/qrcode.inula.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f853b30799af1b418553713b3e6db076657450d0
Binary files /dev/null and b/packages/website-next/public/qrcode.inula.jpg differ
diff --git a/packages/website-next/public/vercel.svg b/packages/website-next/public/vercel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..77053960334e2e34dc584dea8019925c3b4ccca9
--- /dev/null
+++ b/packages/website-next/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/website-next/public/window.svg b/packages/website-next/public/window.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b2b2a44f6ebc70c450043c05a002e7a93ba5d651
--- /dev/null
+++ b/packages/website-next/public/window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/website-next/src/app/api/core/page.mdx b/packages/website-next/src/app/api/core/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..6a69239fc196fb976ed7bf9206466426c4e3addd
--- /dev/null
+++ b/packages/website-next/src/app/api/core/page.mdx
@@ -0,0 +1,1804 @@
+# Inula
+
+## 组件
+
+组件是构建用户界面(UI)的基础,是可重用和独立的代码单元。开发者可以将相关功能、状态以及模板封装在组件中,提高可复用性,使得程序开发具备模块化和可维护特性。
+
+### Component
+
+**功能介绍**
+
+`Component` 是类组件的基础形式,可以通过继承 `Component` 组件来定义一个类组件,并且使用类的特性,如构造函数、生命周期以及内部状态。
+
+**组件定义**
+
+```jsx
+class Component {
+ props: P;
+ context: C;
+ state: S | null;
+ refs: any;
+ forceUpdate: any;
+ isReactComponent: boolean;
+ constructor(props: P, context: C);
+ setState(state: S, callback?: Callback): void;
+}
+```
+
+- `props`:组件接收的输入属性;
+- `context`:组件的上下文对象;
+- `state`:组件内部的状态;
+- `refs`:用于引用组件中的 DOM 元素或其他组件;
+- `forceUpdate`:用于强制重新渲染组件;
+- `isReactComponent`:用于标识当前类是否是 React 组件类;
+- `constructor(props: p, context: c)`:构造函数用于初始化组件的状态和属性;
+- `setState(state: S, callback?: Callback): void`:用于更新组件的状态,并触发重新渲染。
+
+**示例**
+
+```jsx
+import * as Inula from 'openinula';
+
+class Counter extends Inula.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ counter: 0
+ };
+ console.log('Constructor');
+ }
+
+ componentDidMount() {
+ console.log('Component Did Mount');
+ }
+
+ componentDidUpdate() {
+ console.log('Component Did Update');
+ }
+
+ componentWillUnmount() {
+ console.log('Component Will Unmount');
+ }
+
+ handleIncrement = () => {
+ this.setState(prevState => ({
+ counter: prevState.counter + 1
+ }));
+ };
+
+ render() {
+ console.log('Render');
+ return (
+
+
Counter: {this.state.counter}
+
+
+ );
+ }
+}
+
+Inula.render(
+ ,
+ document.getElementById('root')
+);
+```
+
+在上述示例中,基于 `Component` 组件类创建了一个 `Component` 组件以实现计数器功能,并在组件内部测试了一些声明周期的钩子函数。
+
+### PureComponent
+
+**功能介绍**
+
+`PureComponent` 类继承自 `Component`,但是它内置了 `shouldComponentUpdate` 方法,会自动比较 `props` 和 `state` 的变化,如果没有变化则不会重新渲染组件,从而提高性能。
+
+**组件定义**
+
+```jsx
+class PureComponent extends Component
{
+ constructor(props: P, context: C);
+}
+```
+
+**示例**
+
+```jsx
+import Inula, { PureComponent } from 'openinula';
+
+// 创建一个继承自PureComponent的组件
+class App extends PureComponent {
+ render() {
+ console.log('Render PureDemo');
+ return
{this.props.value}
;
+ }
+}
+```
+
+上述示例中,基于 `PureComponent` 类创建了一个 `App` 组件,其使用上与 `Component` 类组件类似,但是其内置了 `shouldComponentUpdate` 方法,可以直接使用。
+
+> 提示:在实际开发中,可以根据其优缺点,选择使用 `Component` 和 `PureComponent` 两种常用组件类
+
+| 组件 | 优点 | 缺点 |
+| ------------- |----------------------------------|--------------------------------------------------------|
+| `PureComponent` | 1.自带浅比较,提高性能
2.适用于大多数情况 | 1.复杂的数据结构可能产生错误或者性能问题
2.对简单组件来说内置方法可能会存在额外开销 |
+| `Component` | 1.较为灵活,没有内置方法,可以细粒度控制
2.适用于多控制场景 | 需要手动编写 `shouldComponentUpdate` 方法 |
+
+### memo
+
+**功能介绍**
+
+`memo` 是一个高阶组件(HOC),用于封装函数组件,以使其仅在其 `props` 发生更改时重新渲染。
+
+**组件定义**
+
+```jsx
+const MemoizedComponent = memo(type, compare?: Function);
+```
+
+- `type`:表示需要被优化的函数式组件;
+- `compare`:可选参数,用于比较前后两次渲染的属性和状态是否相同的比较函数。如果未提供该函数,默认使用浅层比较。
+
+**示例**
+
+
+```jsx
+import { memo, useState, render } from 'openinula';
+
+const ExpensiveComponent = ({ value }) => {
+ // 模拟一个昂贵的计算
+ const expensiveCalculation = () => {
+ console.log("Calculating...");
+ let result = 0;
+ for (let i = 0; i < value * 1000000; i++) {
+ result += i;
+ }
+ return result;
+ };
+
+ const result = expensiveCalculation();
+
+ return Result: {result}
;
+};
+
+const MemoizedExpensiveComponent = memo(ExpensiveComponent);
+
+function App() {
+ const [count1, setCount1] = useState(1);
+ const [count2, setCount2] = useState(1);
+
+ return (
+
+
+
+
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+
+在上述示例中,`` 是一个昂贵的计算组件,它在每次渲染时都会执行昂贵的计算操作。通过使用 `memo`,可以对 `` 进行优化,避免在 `count1` 没有变化时重新渲染。`memo` 会对前后两次渲染的属性和状态进行浅层比较,如果相同则不会重新渲染。
+
+### Fragment
+
+**功能介绍**
+
+`` 是一个虚拟组件,用于包裹一组元素而不添加额外的 DOM 元素,可以提高渲染性能并减少不必要的包装元素。它可以用来解决在渲染多个元素时产生的包裹元素问题。在一些情况下,如果你不使用 ``,可能会出现额外的 DOM 层次结构,从而可能影响性能和样式。
+
+**示例**
+
+
+```jsx
+import Inula, { Fragment, render } from 'openinula';
+
+function App() {
+ return (
+
+ {/* 使用 Fragment */}
+
+ Element 4
+ Element 5
+ Element 6
+
+
+ {/* 或者使用简化形式,使用空尖括号 */}
+ <>
+
Element 7
+
Element 8
+
Element 9
+ >
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+
+在上面的示例中,你可以看到 `` 的用法。当需要在组件中渲染多个元素时,使用 `` 可以避免添加额外的 DOM 元素。除了使用完整的 `` 标签外,你还可以使用空尖括号的简化形式 `<>` 和 `>`。
+
+### Children
+
+**功能介绍**
+
+`Children` 用于处理组件的子元素。它允许开发者在组件中访问和操作传递给组件的子元素,无论子元素是什么类型(单个元素、多个元素、文本等)。`Children` 提供了一些方法来遍历、映射和操作子元素,使得操作子元素变得更加方便。
+
+**示例**
+
+```jsx
+import Inula, { Children, cloneElement, render } from 'openinula';
+
+// 示例 1: 遍历子元素并输出它们的类型
+function ElementList({ children }) {
+ const childArray = Children.toArray(children);
+
+ const childTypes = childArray.map((child, index) => (
+ Child {index + 1} is of type: {child.type.name}
+ ));
+
+ return {childTypes}
;
+}
+
+// 示例 2: 映射子元素并添加额外的 props
+function AddPropsToChildren({ children }) {
+ const enhancedChildren = Children.map(children, (child) => {
+ return cloneElement(child, { isHighlighted: true });
+ });
+
+ return {enhancedChildren}
;
+}
+
+// 示例 3: 只渲染特定类型的子元素
+function OnlyRenderCertainChildren({ children }) {
+ const filteredChildren = Children.toArray(children).filter(child => {
+ return child.type === 'p';
+ });
+
+ return {filteredChildren}
;
+}
+
+function App() {
+ return (
+
+
+ Heading
+ Paragraph 1
+ Paragraph 2
+ Div element
+
+
+
+ Child 1
+ Child 2
+
+
+
+ Paragraph 1
+ Div element
+ Paragraph 2
+
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+上述展示了的示例包含以下方法:
+
+- `Children.map(children, fn, thisArg?)`
+- `Children.forEach(children, fn, thisArg?)`
+- `Children.only(children)`
+- `Children.toArray(children)`。
+
+在上面的示例中,展示了如何使用 `Children` 对子元素进行遍历、映射和筛选。`Children.toArray` 方法用于将子元素转换为数组,从而可以使用数组的方法。`Children.map` 方法可以映射子元素并为其添加额外的 `props`。同时还演示了如何通过 `child.type` 来识别子元素的类型,从而选择性地渲染特定类型的子元素。
+
+### Suspense
+
+**功能介绍**
+
+``是一个组件,用于在异步加载数据时展示一个 fallback 视图
+
+**接口定义**
+
+```tsx
+}>
+
+
+```
+
+- `fallback`: 用于定义在组件加载期间显示的 fallback 视图;
+- ``: 表示需要异步加载的组件。
+
+**示例**
+
+
+```jsx
+import Inula, { lazy, Suspense } from 'openinula';
+
+// 异步加载组件
+const AsyncComponent = lazy(() => import('./AsyncComponent'));
+
+const App = () => (
+
+ {/* 在加载异步组件时显示fallback元素 */}
+ Loading...
}>
+
+
+
+);
+
+// 组件可以是一个普通的函数式组件或类组件
+export default AsyncComponent = () => {
+ // 随意模拟一个异步加载的操作
+ setTimeout(() => {
+ console.log('AsyncComponent is loaded.');
+ }, 2000);
+
+ return Async Component
;
+};
+```
+
+在上面的示例中,使用 [lazy](#lazy) 函数来异步加载一个组件 ``。然后,使用 `` 组件来包裹异步组件,并在加载组件时显示 fallback 元素。在这个示例中,“fallback ...” 文本。
+
+## 钩子函数
+
+在 openInula 中,可以使用钩子函数来在函数组件中添加状态和其他特性函数,从而允许我们在函数组件中使用类组件拥有的功能。通过使用钩子函数,我们可以更方便地编写和管理React组件的状态和行为,使代码更简洁、可读性更高。
+
+钩子函数可以让我们在函数组件中使用状态管理、生命周期方法、副作用等功能。常用的钩子函数包括 `useState`、`useEffect`、`useContext`、`useReducer` 等。
+
+> 注意:
+> 1. 只能在组件的顶层或自己的 Hook 中调用钩子函数。
+> 2. 不能在循环语句或条件语句中调用钩子函数。
+
+### useState
+
+**功能介绍**
+
+`useState` 是一个用于在函数组件中添加状态( `state` )的钩子函数。使用 `useState` 可以让函数组件拥有类组件的状态管理能力。
+
+**接口定义**
+
+```jsx
+const [state, setState] = useState(initialState);
+```
+
+- `initialState`:状态的初始值,在组件挂载时使用。
+
+`useState` 的返回值:
+
+- `state`:表示当前状态的值;
+- `setState`:用于更新状态的函数,可以传递新的状态值或一个函数来计算新的状态值。
+
+**示例**
+
+```jsx
+import Inula, { useState, render } from "openinula";
+
+function Counter() {
+ const [count, setCount] = useState(0);
+
+ const increment = () => {
+ setCount(prevCount => prevCount + 1);
+ };
+
+ const decrement = () => {
+ setCount(prevCount => prevCount - 1);
+ };
+
+ return (
+
+
Count: {count}
+
+
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+### useCallback
+
+**功能介绍**
+
+`useCallback` 是一个用于优化性能的钩子函数,它可以用来缓存函数引用,避免在每次渲染时重新创建函数。这对于将函数作为 `props` 传递给子组件时特别有用,可以避免不必要的重新渲染。
+
+**接口定义**
+
+```tsx
+const cachedFn = useCallback(callback: T, deps: DependencyList)
+```
+
+- `callback`:要缓存的回调函数;
+- `deps`:一个数组,包含了所有可以作为依赖项的值,当依赖项发生变化时,`callback` 函数会被重新创建。如果依赖项列表为空,那么每次渲染都会返回相同的缓存函数。
+
+`useCallback`的返回值:
+
+- `cachedFn`:若是初次渲染,返回已传入的 `callback` 函数,当依赖项 `deps` 无变化时,返回上次渲染缓存的 `callback` 函数,当依赖项 `deps` 有变化时,则返回这次渲染传入的 `callback` 函数。
+
+**示例**
+
+```jsx
+import Inula, { useState, useCallback, render } from 'openinula';
+
+function App() {
+ const [count, setCount] = useState(0);
+
+ // 使用 useCallback 缓存 handleIncrement 函数
+ const handleIncrement = useCallback(() => {
+ setCount(count + 1);
+ }, [count]); // 仅当 count 发生变化时,才会重新创建函数
+
+ return (
+
+
Count: {count}
+
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+
+> 注意:使用 `useCallback`,可以确保每次渲染时都使用相同的函数引用,从而减少不必要的函数重新创建,提高性能。这在传递回调函数给子组件或在使用 `useEffect` 时尤为有用,因为它可以防止因为函数的重新创建而导致子组件的不必要重新渲染。
+
+### useContext
+
+**功能介绍**
+
+`useContext` 用于在组件之间共享状态。通过使用 `useContext`,可以避免在组件树中手动传递 `props`,从而更方便地访问共享的数据。
+
+**接口定义**
+
+```tsx
+const value = useContext(context: Context)
+```
+
+- `context`:是 openInula 提供的上下文,可以通过 `createContext` 创建,`useContext` 接收上下文并返回该上下文当前值。
+
+`useContext`的返回值:
+
+- `value`:其返回值是一个包含Provider的值,其中 `value.Provider` 是由最近的上层上下文提供,如果没有找到匹配的上层上下文,则会使用上下文对象的默认值。
+
+**示例**
+
+```jsx
+import Inula, { createContext, useContext, useState, render } from 'openinula';
+
+// 创建一个上下文对象
+const Context = createContext();
+
+// 组件A:向上下文中提供一个共享的数据
+const ComponentA = () => {
+ const [count, setCount] = useState(0);
+
+ return (
+
+
+
+
+ );
+}
+
+// 组件B:从上下文中获取共享的数据
+const ComponentB = () => {
+ const count = useContext(Context);
+ return 当前计数:{count}
;
+}
+
+// 主组件
+const App = () => {
+ return ;
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+在这个示例中,`` 创建了一个共享的数据 `count`,它使用 `useState` 来进行状态管理,并将数据存储在上下文对象` Context.Provider` 中。`` 使用 `useContext` 从 `Context` 中获取共享的数据 `count`。最后,`` 组件作为根组件渲染 ``,这样就能够在整个组件树中共享 `count` 数据。
+
+> 说明:在函数组件中,`useContext` 代替了类组件中的 `Consumer`。
+
+### useEffect
+
+**功能介绍**
+
+`useEffect` 是一个用于处理副作用(如数据获取、订阅、DOM 操作等)的钩子函数。它在组件的生命周期中执行,并且可以用于在组件渲染后执行一些操作,或在组件卸载前执行一些清理工作。
+
+**接口定义**
+
+```tsx
+useEffect(create: EffectCallBack, deps?: DependencyList): void
+```
+
+- `create`:一个函数,用于定义副作用操作。该函数在每次渲染后都会被调用;
+- `deps`:一个数组,指定了哪些依赖项的变化会触发 `create` 的重新执行。如果不传递这个数组,那么 `create` 将在每次渲染后都被调用。如果依赖项列表为空,那么 `create` 将只在组件挂载和卸载时执行。
+
+**示例**
+
+- 示例一
+
+```jsx
+import Inula, { useState, useEffect, render } from "openinula";
+
+function App() {
+ const [count, setCount] = useState(0);
+
+ useEffect(() => {
+ document.title = `点击次数:${count}`;
+ }, [count]);
+
+ return (
+
+
点击次数: {count}
+
+
+ );
+}
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+在上述示例中,`useEffect` 可以用于数据的获取,当点击 `
+```
+- 外层和内层 Suspense 可分别控制不同异步内容的 loading 状态。
+
+## 错误处理
+
+- 异步加载失败时可结合 ErrorBoundary 捕获错误。
+- lazy 组件必须返回 Promise,resolve 时需有 default 导出。
+
+## 注意事项
+
+- Suspense 只对 lazy 组件生效。
+- fallback 必须为有效的 React 元素。
+- 支持多层嵌套,内层优先显示 fallback。
+
+## 最佳实践
+
+- 推荐为每个异步区域单独设置 Suspense,提升用户体验。
+- fallback UI 应简洁明了。
+
+## 相关链接
+
+- [React Suspense](https://react.dev/reference/react/Suspense)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/components/composition/page.mdx b/packages/website-next/src/app/docs/components/composition/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..aff7a5dcea4c9b7205dc86fb7948cd3645a994be
--- /dev/null
+++ b/packages/website-next/src/app/docs/components/composition/page.mdx
@@ -0,0 +1,120 @@
+---
+id: composition
+title: 组件组合
+sidebar_label: 组件组合
+---
+
+# 组件组合
+
+组件组合是构建复杂 UI 的基础。openInula 2支持多种组合模式,包括容器组件、复合组件、插槽(children)、高阶组件等。
+
+## 容器组件与展示组件
+
+将逻辑与展示分离,提升复用性。
+
+```tsx filename="UserCardAndList.jsx"
+// 展示组件
+function UserCard({ user }) {
+ return (
+
+
{user.name}
+
邮箱:{user.email}
+
+ );
+}
+
+// 容器组件
+function UserList({ users }) {
+ return (
+
+
+ {(user) => }
+
+
+ );
+}
+```
+
+## 插槽(children)
+
+通过 `children` 实现灵活的内容插入。
+
+```tsx filename="PanelWithSlot.jsx"
+function Panel({ title, children }) {
+ return (
+
+ );
+}
+
+function App() {
+ return (
+
+ 这是插槽内容
+ 确定
+
+ );
+}
+```
+
+## 复合组件模式
+
+将多个子组件组合为一个整体。
+
+```tsx filename="TabsComponent.jsx"
+function Tabs({ children }) {
+ // 省略 tab 切换逻辑
+ return {children}
;
+}
+
+function Tab({ label, children }) {
+ return (
+
+ );
+}
+
+function App() {
+ return (
+
+ 内容A
+ 内容B
+
+ );
+}
+```
+
+## 高阶组件(HOC)
+
+高阶组件用于复用逻辑或增强组件功能。
+
+```tsx filename="HigherOrderComponent.jsx"
+function withLogger(Component) {
+ return function Wrapper(props) {
+ console.log('props:', props);
+ return ;
+ };
+}
+
+const LoggedPanel = withLogger(Panel);
+```
+
+## 最佳实践
+
+- 组件应职责单一,便于组合和复用
+- 善用 children 和 props 传递内容和行为
+- 复合组件可提升灵活性
+
+## 注意事项
+
+- 避免过度嵌套,保持结构清晰
+- 插槽内容建议通过 children 传递
+
+## 相关链接
+
+- [Props 传递](./props)
+- [上下文](./context)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/components/context/page.mdx b/packages/website-next/src/app/docs/components/context/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..e7e58765bcc18349c06a3b0eb9ff62e613433133
--- /dev/null
+++ b/packages/website-next/src/app/docs/components/context/page.mdx
@@ -0,0 +1,90 @@
+---
+id: context
+title: 上下文
+sidebar_label: 上下文
+---
+
+# 上下文(Context)
+
+openInula 2(zouyu)支持类似 React 的 Context 机制,用于在组件树中跨层级传递数据,避免 props 层层传递。Context 机制包括 Provider(提供者)和 Consumer(消费者),并且支持响应式更新。
+
+## 基本用法
+
+### 1. 创建 Context
+
+```tsx filename="createContext.jsx"
+import { createContext } from 'openinula';
+
+const UserContext = createContext({ level: 0, path: '' });
+```
+
+### 2. Provider(提供者)
+
+通过将 context 作为组件标签包裹子组件,并传递属性来提供数据:
+
+```tsx filename="ContextProvider.jsx"
+function App() {
+ let level = 1;
+ let path = '/home';
+ return (
+
+
+
+ );
+}
+```
+
+- context 属性可以是任意响应式变量,变化时会自动通知所有消费组件。
+
+### 3. Consumer(消费者)
+
+在子组件中通过 `useContext` 获取 context 数据:
+
+```tsx filename="ContextConsumer.jsx"
+import { useContext } from 'openinula';
+
+function Child() {
+ const { level, path } = useContext(UserContext);
+ return {level} - {path}
;
+}
+```
+
+- 解构 useContext 返回的对象即可获得 context 的所有属性。
+- context 属性变化时,消费组件会自动响应更新。
+
+## 响应式原理
+
+- context 属性是响应式的,父组件更新属性,所有 useContext 的子组件会自动重新渲染。
+- 编译器会自动为每个属性生成依赖追踪和更新函数。
+
+## 只消费部分属性
+
+可以只消费 context 的部分属性,只有被消费的属性变化时才会触发更新。
+
+```tsx filename="PartialContextConsumer.jsx"
+function OnlyLevel() {
+ const { level } = useContext(UserContext);
+ return {level};
+}
+```
+
+## 多层嵌套与多 context
+
+可以嵌套多个 context,useContext 会自动查找最近的 Provider。
+
+## 最佳实践
+
+- 用于全局配置、用户信息、主题等场景
+- 避免频繁变化的小数据放入 context
+- 推荐解构useContext返回值,帮助响应式系统能够只在对应 key 更新时,仅更新对应 value 的消费组件,提升性能
+
+## 注意事项
+
+- context 属性必须通过 Provider 传递,且应为响应式变量
+- useContext 只能在函数组件中调用
+- context 变化会导致所有消费组件重新渲染
+
+## 相关链接
+
+- [组件组合](../composition)
+- [官方测试用例参考](https://github.com/openinula/openinula/blob/main/next-packages/compiler/babel-inula-next-core/test/e2e/context.test.tsx)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/components/props/page.mdx b/packages/website-next/src/app/docs/components/props/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..f7c2de62b3501205295c00e35f968f8b51cf8fdb
--- /dev/null
+++ b/packages/website-next/src/app/docs/components/props/page.mdx
@@ -0,0 +1,125 @@
+---
+id: props
+title: Props 传递
+sidebar_label: Props 传递
+---
+
+# Props 传递
+
+在 openInula 2(zouyu)中,props 用于父组件向子组件传递数据和回调函数,语法与 React 类似,但更贴近原生 JS。
+
+## 基本用法
+
+```tsx filename="Welcome.jsx"
+function Welcome({ name }) {
+ return 你好,{name}!
;
+}
+
+function App() {
+ return ;
+}
+```
+
+## 默认值与解构
+
+可以为 props 设置默认值,并使用解构赋值:
+
+```tsx filename="UserProfile.jsx"
+function UserProfile({ name = '匿名', age = 0 }) {
+ return (
+
+ );
+}
+```
+
+## 传递回调函数
+
+父组件可以通过 props 向子组件传递事件处理函数,实现子组件向父组件通信:
+
+```tsx filename="CounterWithCallback.jsx"
+function Counter({ onIncrement }) {
+ return 增加;
+}
+
+function App() {
+ let count = 0;
+ function handleIncrement() {
+ count++;
+ }
+ return (
+
+ );
+}
+```
+
+## 传递对象和数组
+
+可以直接传递对象、数组等复杂数据类型:
+
+```tsx filename="TodoList.jsx"
+function TodoList({ todos }) {
+ return (
+
+
+ {(todo) => - {todo.text}
}
+
+
+ );
+}
+
+function App() {
+ let todos = [
+ { text: '学习 OpenInula' },
+ { text: '写文档' }
+ ];
+ return ;
+}
+```
+
+## children 插槽
+
+通过 `children` 实现插槽功能:
+
+```tsx filename="PanelWithChildren.jsx"
+function Panel({ title, children }) {
+ return (
+
+ );
+}
+
+function App() {
+ return (
+
+ 这是插槽内容
+
+ );
+}
+```
+
+## 最佳实践
+
+- 使用解构赋值提升代码可读性,并帮助响应式系统能够只在对应 props key 更新时,更新组件
+- 为 props 设置合理的默认值
+- 只传递必要的数据,避免 props 过多
+- 通过回调函数实现父子通信
+
+## 注意事项
+
+- props 是只读的,不要在子组件内部修改 props
+- children 也是 props 的一部分
+- 复杂数据建议使用不可变数据结构
+
+## 下一步
+
+- 学习[组件组合](../composition)的高级用法
+- 了解[上下文](../context)的全局数据传递
+- 探索[生命周期](../lifecycle/mounting)的管理
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/CodeOfConduct/page.mdx b/packages/website-next/src/app/docs/conventional/CodeOfConduct/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..ae57632ebc58f49982b1958d47097b0d4c836bcd
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/CodeOfConduct/page.mdx
@@ -0,0 +1,53 @@
+---
+sidebar_position: 6
+---
+
+我们有一份 openinula 代码贡献行为准则,希望所有的贡献者都能遵守,请花时间阅读一遍全文以确保你能明白哪些是可以做的,哪些是不可以做的。
+
+openinula代码贡献行为准则遵守开源社区[《贡献者公约》](https://contributor-covenant.org/) V1.4 中规定的行为守则,请参考[V1.4版本](https://www.contributor-covenant.org/zh-cn/version/1/4/code-of-conduct.html)
+
+如需举报侮辱、骚扰或其他不可接受的行为,您可以发送邮件至[team@inulajs.org](mailto:team@inulajs.org),联系 openinula 项目部处理。
+
+## 贡献者们的承诺
+
+为建设开放友好的环境,我们贡献者和维护者承诺:不论年龄、体型、身体健全与否、民族、性征、性别认同与表征、经验水平、教育程度、社会地位、国籍、相貌、种族、信仰、性取向,我们项目和社区的参与者皆免于骚扰。
+
+## 我们的准则
+
+有助于创造积极环境的行为包括但不限于:
+
+* 措辞友好且包容
+* 尊重不同的观点和经验
+* 耐心接受有益批评
+* 关注对社区最有利的事情
+* 与社区其他成员友善相处
+
+参与者不应采取的行为包括但不限于:
+
+* 发布与性有关的言论或图像、不受欢迎地献殷勤
+* 捣乱/煽动/造谣行为、侮辱/贬损的评论、人身及政治攻击
+* 公开或私下骚扰
+* 未经明确授权便发布他人的资料,如住址、电子邮箱等
+* 其他有理由认定为违反职业操守的不当行为
+
+## 我们的义务
+
+项目维护者有义务诠释何谓“妥当行为”,并妥善公正地纠正已发生的不当行为。
+
+项目维护者有权利和义务去删除、编辑、拒绝违背本行为标准的评论(comments)、提交(commits)、代码、wiki 编辑、问题(issues)等贡献;项目维护者可暂时或永久地封禁任何他们认为行为不当、威胁、冒犯、有害的参与者。
+
+## 适用范围
+
+本行为标准适用于本项目。当有人代表本项目或本社区时,本标准亦适用于此人所处的公共平台。
+
+代表本项目或本社区的情形包括但不限于:使用项目的官方电子邮件、通过官方媒体账号发布消息、作为指定代表参与在线或线下活动等。
+
+代表本项目的行为可由项目维护者进一步定义及解释。
+
+## 贯彻落实
+
+可以致信[team@inulajs.org](mailto:team@inulajs.org),向项目团队举报滥用、骚扰及不当行为。
+
+维护团队将审议并调查全部投诉,妥善地予以必要的回应。项目团队有义务保密举报者信息。具体执行方针或将另行发布。
+
+未切实遵守或执行本行为标准的项目维护人员,经项目负责人或其他成员决议,可能被暂时或永久地剥夺参与本项目的资格。
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/ContributingGuide/page.mdx b/packages/website-next/src/app/docs/conventional/ContributingGuide/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..132a283920b32a0ed91b6aad5afa7c1da5d1cab0
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/ContributingGuide/page.mdx
@@ -0,0 +1,142 @@
+---
+sidebar_position: 7
+---
+
+本指南会指导你如何为 openInula 贡献自己的一份力量,请你在提出 issue 或 pull request 前花费几分钟来了解 openInula 社区的贡献指南。
+
+## 行为准则
+
+我们有一份 openInula 代码贡献[行为准则](/docs/行为准则),希望所有的贡献者都能遵守,在参与社区贡献之前,请先阅读并遵守 openInula 的[行为准则](/docs/行为准则)。
+
+## 参与贡献
+
+贡献代码之前,您必须签署一份“openInula贡献者协议,然后才能参与代码贡献。根据您的参与身份,选择签署个人 CLA、员工 CLA 或企业 CLA,请点击**[这里](https://gitee.com/organizations/inula-js/cla/inula-js-contributor-protocol)**签署。
+
+* 个人 CLA:以个人身份参与社区,请签署个人 CLA
+* 企业 CLA: 以企业身份参与社区,请签署企业 CLA
+* 员工 CLA: 以企业员工的身份参与社区,请签署员工 CLA
+
+#### 贡献流程
+
+* 我们所有的工作都会放在 [Gitee](https://gitee.com/openInula) 上。
+* 针对Git的安装、环境配置及使用方法,请参考码云帮助中心的 Git 知识大全:[https://gitee.com/help/categories/43](https://gitee.com/help/categories/43)
+* openInula 长期维护 master 分支。如果你要修复一个 Bug 或增加一个新的功能,那么请 Pull Request 到 master 分支上
+
+#### 参与贡献
+
+openInula 团队会关注所有 Pull Request,我们会经测试与评审后合入你的代码,也有可能要求你做一些修改或者告诉你我们为什么不能接受你的修改。
+
+在你发送Pull Request之前,请确认你是按照下面的步骤来做的:
+
+1. 确保基于正确的分支进行修改。
+2. 在项目根目录下运行了 `npm install`。
+3. 如果你修复了一个bug或者新增了一个功能,请确保新增或完善了相应的测试,这很重要。
+4. 确认所有的测试都是通过的 `npm run test`
+5. 确保你的代码通过了lint检查 `npm run lint`.
+
+#### 贡献流程
+
+1. Fork 代码分支
+
+ 1. 找到并打开对应 Repository 的首页;
+ 2. 点击右上角的 **Forked** 按钮,按照指引,建立一个属于个人的分支。
+
+2. 把 Fork 仓下载到本地
+
+ 1. 创建本地工作目录;
+ ```bash
+ mkdir ${your_working_dir}
+ cd ${your_working_dir}
+ ```
+
+ 2. 复制远程仓库到本地。
+ ```bash
+ git clone {$remote_link}
+ ```
+
+3. 代码修改
+
+ 1. 根据您的想法,修复bug或者新增功能;
+
+ 2. 推送到您的线上代码仓分支。在此之前,请确认您已完成一下步骤:
+ 1. 确保基于正确的分支进行修改。
+ 2. 在项目根目录下运行了 `npm install`。
+ 3. 如果你修复了一个 bug 或者新增了一个功能,请确保新增或完善了相应的测试,这很重要。
+ 4. 确认所有的测试都是通过的 `npm run test`
+ 5. 确保你的代码通过了 lint 检查 `npm run lint`.
+
+ 确认无误后即可推送
+ ```bash
+ git push origin master
+ ```
+
+4. 提交 Pull Request
+
+ 1. 在代码仓首页点击 **+Pull Request**,创建一个新PR
+ 2. 选择分支为您修改过的分支
+ 3. 补充标题与 PR 描述等信息。openInula 库提供 PR 模板,帮助您快速高效的传递 PR 的描述信息。
+ 4. 确认无误后,点击**创建 Pull Request**
+
+ 提交完毕后,请耐心等待 openInula 团队完成测试与评审流程。流程通过后,您的代码就会被合入 openInula 的代码仓中。
+
+ 如果你还不清楚怎么在Gitee上提交 Pull Request,你可以通过[这篇文章](https://oschina.gitee.io/opensource-guide/guide/%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86%EF%BC%9A%E5%B0%9D%E8%AF%95%E5%8F%82%E4%B8%8E%E5%BC%80%E6%BA%90/%E7%AC%AC%207%20%E5%B0%8F%E8%8A%82%EF%BC%9A%E6%8F%90%E4%BA%A4%E7%AC%AC%E4%B8%80%E4%B8%AA%20Pull%20Request/#%E4%BB%80%E4%B9%88%E6%98%AF-pull-request)学习
+
+
+### 门禁构建
+
+#### 创建 Issue
+
+1. 找到并打开对应 Repository 的首页
+2. 选择 Issues 页签。
+3. 在点击右侧 **+新建 Issue** 按钮,建立一个专属的任务,用于相关联的代码(开发特性/修改 bug)执行 CI 门禁。
+
+#### 将 Issue 与 PR 关联
+
+创建 PR 或编辑已有的 PR 时,描述框输入 `#I[五位 Issue ID]`,例如 `#I12345`,即可将 Issue 与 PR 关联。
+
+#### 约束
+- 一个 PR 只允许关联一个 Issue,关联多个 Issue 时无法触发CI。
+- 相关特性开发或 bug 修复涉及多个代码仓联合修改时,多个 PR 可关联同一个 Issue。
+- Issue 关联的 PR 中,不允许存在已被合入或关闭的 PR,否则无法触发 CI。
+- 若 Issue 已被合入或关闭的 PR 关联,则该 Issue 无法被重复使用,需重新创建 Issue 并进行 OPEN 的 PR 关联。
+- 当你想开始处理一个 Issue 时,先检查一下 Issue 下面的留言,确保没有其他人正在处理。如果没有,你可以留言告知其他人你将处理这个 Issue,避免重复劳动。
+
+
+#### 触发代码门禁
+
+在 PR 中评论“start build”即可触发 CI 门禁。
+
+多个 PR 关联同一个 Issue 时,在任一 PR 中评论“start build”均可触发该 Issue 的 CI 门禁。
+
+门禁执行完成,会在该 Issue 关联的所有 PR 中自动评论门禁执行结果。
+
+如果门禁通过,该 Issue 关联的所有PR均会自动标记“测试通过”。
+
+#### Bug 提交
+
+我们使用 Gitee Issues 来进行 Bug 跟踪。在你发现 Bug 后,请通过我们提供的模板来提 Issue,以便你发现的 Bug 能被快速解决。
+
+在你报告一个 bug 之前,请先确保不和已有 Issue 重复以及查阅了我们的用户使用指南。
+
+#### 新增功能
+
+ 如果你有帮助我们改进 API 或者新增功能的想法,我们同样推荐你使用我们提供 Issue 模板来新建一个添加新功能的 Issue。
+
+### CI 门户
+
+openInula 通过持续集成(CI,Continuous Integration)及时发现代码问题,确保代码质量可靠和功能稳定,包括:
+
+* 代码门禁:开发者向 openInula 提交代码合入申请后,会触发门禁检查,例如静态检查、代码编译、功能测试等,门禁通过后才能合入代码。
+* 每日构建:openInula 的持续集成流水线每日自动执行,以便提前发现代码静态检查、编译、功能等方面的问题,及时修复问题,确保代码质量。
+
+CI 门户是为了便于开发者及时查看、分析每日构建和代码门禁的执行结果的一个可持续集成的门户。
+
+## 内容版权
+
+用户提交的内容、图片必须是原创内容,不得侵犯他人知识产权。
+
+对应采纳的内容,openInula 有权根据相关规范修改用户提交的内容。
+
+## License
+
+openInula 主要遵循 Mulan Permissive Software License v2 协议,详情请参考各代码仓 LICENSE 声明。
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/FAQ/page.mdx b/packages/website-next/src/app/docs/conventional/FAQ/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..19f2526b79777bd9e11a330adf44affd41e02883
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/FAQ/page.mdx
@@ -0,0 +1,35 @@
+---
+sidebar_position: 5
+---
+
+## openInula 支持哪些浏览器?
+
+最新版的 openInula 支持原生支持 ES2015 的浏览器,不包括 IE 浏览器。
+
+---
+
+## openInula 可以扩展吗?
+
+是的,openInula 是一个成熟的完全的前端框架,其不仅可无缝兼容 React 框架,也可以基于 openInula 库,扩展一些生态能力:
+
+ * inula-intl 提供了一个模块化的国际化框架,允许其和 openInula 框架配合使用
+ * inula-request 提供了请求能力,允许其和 openInula 框架配合使用
+ * inula-router 提供了路由能力,允许其和 openInula 框架配合使用
+
+---
+
+## openInula 的进入门槛如何?
+
+openInula 的进入门槛较低,详细的文档以及简洁的代码逻辑能减少新前端开发人员的学习成本。
+
+---
+
+## openInula 中应该使用 JavaScript 还是 TypeScript?
+
+openInula 本身是基于TypeScript实现的,提供了一流的 TypeScript 支持,但不会对您是否应该使用 TypeScript 作为用户强制执行意见。在 openInula API 实现中也尽可能在 JavaScript 与 TypeScript 进行折中选择。
+
+---
+
+## openInula 是轻量级的吗?性能如何?
+
+openInula 是轻量级的。其提供的响应式 API 性能相比与主流框架 React 的虚拟 DOM 方式,渲染效率提升了30%以上。
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/QuickStart/page.mdx b/packages/website-next/src/app/docs/conventional/QuickStart/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..81b23bf750eb881cd2abbfea4ffe0c3ca9c5d085
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/QuickStart/page.mdx
@@ -0,0 +1,94 @@
+欢迎学习 openInula 教程。此教程将会指导你使用 openInula 构建快速、轻便的 web 应用程序。
+
+## 什么是openInula
+
+openInula 是一款用于构建用户界面的 JavaScript 库,提供响应式 API 帮助开发者简单高效构建 web 页面,比传统虚拟 DOM 方式渲染效率提升30%以上!同时 openInula 提供与 React 保持一致的 API,并且提供5大常用功能丰富的核心组件:**状态管理器**、**路由**、**国际化**、**请求组件**、**应用脚手架**,以便开发者高效、高质量的构筑基于 openInula 的前端产品。
+
+### 在已有项目中安装 openInula
+
+#### 方式一:使用 `npm` 安装
+
+在命令行中运行以下命令来通过 `npm` 安装 openInula:
+
+```sh filename="install.sh"
+npm install openinula
+```
+
+上述命令会将最新版本的 openInula 包添加到您的项目中,当然,您也可以指定特定版本来安装包。最新版本号请在 npm 官网查看:[访问官网](https://www.npmjs.com/package/openinula)
+
+#### 方式二:使用 `yarn` 安装
+
+openInula 也支持 `yarn` 命令安装,前提已安装了 `yarn`,如未安装,则通过 `npm install -g yarn` 命令来安装(全局安装)。
+
+在命令行中运行以下命令来通过 `yarn` 安装 openInula:
+
+```sh filename="install.sh"
+yarn add openinula
+```
+
+### 直接创建 openInula 项目
+
+如果你已经安装了openInula,则可以简单地创建一个新的 JavaScript 文件,尝试使用 openInula,例如 `index.jsx`,并在其中添加以下代码:
+
+```jsx filename="index.jsx"
+import { render } from 'openinula';
+
+const HelloWorld = () => {
+ return (
+
+
Hello, World!
+
+ );
+};
+
+render(
+ ,
+ document.getElementById('root')
+);
+```
+
+上述代码片段主要分为三部分,首先通过 `import` 语法导入 openInula 包,其次构建一个名为 `HelloWorld` 的函数组件,最后将 `HelloWorld` 组件挂载在 HTML 中 id 为 `root` 的 DOM元素上,详细使用请查阅[API参考Inula](https://docs.openinula.net/apis/Inula)。`index.jsx` 经过 babel 编译后,您将看到一个显示 "Hello, World!" 的页面。
+
+### 使用脚手架创建openInula项目
+
+#### 步骤一: 启动openInula脚手架
+
+在您需要创建项目的目录下执行以下命令:
+
+```sh filename="create.sh"
+npx create-inula <项目名>
+```
+
+#### 步骤二: 选择需要项目模板
+
+执行启动命令后,您将收到以下回显信息询问,可根据回显信息进行相应的输入:
+
+```sh filename="select-template.txt"
+Need to install the following packages:create-inula@0.0.2
+Ok to proceed? (y) y
+? Please select the template (Use arrow keys)
+> Simple-app
+```
+
+在创建项目过程中脚手架提供 Simple-app 模板供开发者使用:
+- Simple-app 已默认安装 openInula,开发者可以直接在项目中专注于核心代码的开发。
+
+#### 步骤三:选择打包方式
+
+在创建项目过程中有两种打包方式供选择,您可以根据自己使用习惯选择:
+
+```sh filename="select-build.txt"
+? Please select the build type (Use arrow keys)
+ > webpack
+ vite
+```
+
+如果您不知如何选择可分别参考 [Vite 文档](https://cn.vitejs.dev/) 以及 [webpack文档](https://webpack.js.org/)。
+
+至此,可以使用 openInula 框架,通过 `npm run start` 命令运行项目,您会看到简单的 openInula 的示例。当然,您也可以基于 openInula 框架构建您的 web 项目。
+
+### 开始使用openInula
+
+恭喜!您已经成功安装了 openInula。现在您可以根据项目需求自由使用 openInula 提供的组件和功能。
+
+请查阅[《用户指南》](/docs/用户指南)以了解更多关于如何使用和配置框架的详细信息。
diff --git a/packages/website-next/src/app/docs/conventional/ReleaseNotes/page.mdx b/packages/website-next/src/app/docs/conventional/ReleaseNotes/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..45bd6441baeafc473a6e0c6da11aa6fa1358d70c
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/ReleaseNotes/page.mdx
@@ -0,0 +1,24 @@
+---
+sidebar_position: 4
+---
+## 配套关系
+
+表1 版本软件和工具配套关系
+
+| 软件 | 版本 | 备注 |
+|--------------|--------|----|
+| inula | 0.0.11 | |
+| create-inula | 1.0.11 | |
+
+## 新特性
+
+**openInula**
+
+* 支持响应式 API(9月底发布β版本)
+* 支持状态管理器 inulaX
+* 兼容 React API,支持类式组件和函数式组件
+
+**create-inula**
+
+- 支持选择 Simple-app 模板
+- 项目模板支持 webpack 和 vite 两种打包方式
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/SwitchingGuide/page.mdx b/packages/website-next/src/app/docs/conventional/SwitchingGuide/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..73cf5db79b5ebd6cf30c02c65dcf77e260bcc7df
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/SwitchingGuide/page.mdx
@@ -0,0 +1,180 @@
+---
+sidebar_position: 3
+---
+
+为了便于开发者使用 openInula 进行页面开发,尤其是已经使用 React 的相关项目,openInula 提供了一种无感切换机制,可以从 React 切换到 openInula。您只需要按照如下的方式进行修改,就可以体验到 openInula 框架所提供的能力。
+
+### 使用 React 的项目切换 openInula 步骤
+
+- 步骤1:安装 openInula。
+
+```bash filename="install.sh"
+npm install openinula
+```
+
+最新版本号请在 npm 官网查看:[访问官网](https://www.npmjs.com/package/openinula)
+
+- 步骤2:引用切换,修改 openInula 相关 API 的加载方式。
+
+```ts
+// 修改前:
+import React, { useContext, useEffect, Suspense, lazy, useState } from 'react';
+import ReactDOM from 'react-dom';
+
+// 修改后:
+import React, { useContext, useEffect, Suspense, lazy, useState } from 'openinula';
+import ReactDOM from 'openinula';
+```
+*注意*:修改后可以保留 React 全局变量。
+
+- 步骤3:修改 webpack 配置文件中 `alias`,新增 `react`、`react-dom` 等别名,如下:
+
+```ts filename="webpack.config.js"
+alias: {
+ // 省略其它...
+ 'react': 'openinula', // 新增
+ 'react-dom': 'openinula', // 新增
+ 'react-is': 'openinula', // 新增
+},
+```
+
+### 切换FAQ
+
+#### openInula 编译 FAQ
+
+1. 在切换或者使用 openInula 框架时,`React.createElement` 无法转换成 `openinula.createElement`:
+
+ 请排查编译命令中是否有 `--mode development`,该选项会导致 `React.createElement` 无法转换成 `openinula.createElement`,需要删除。
+
+2. 如果在 webpack 配置文件中配置 `externals` 字段,需把 React 相关三方件的 `externals` 都替换,如下:
+
+ ```ts filename="webpack.config.js"
+ externals: {
+ 'react': 'openinula',
+ 'react-dom': 'openinula',
+ 'react-redux': 'openinula',
+ 'react-thunk': 'openinula',
+ },
+ ```
+
+3、如果使用 babel,则需要修改 `.babelrc` (`babel.config.js`) 或 webpack 配置文件中 `babel-loader` 配置(解决编译后文件存留 `React.createElement` 的问题),如:
+
+- 如果你使用的是 `@babel/preset-react`,请确保版本号大于 `7.9.0`
+
+ ```jsx
+ // 修改前:
+ {
+ "presets": [
+ "@babel/preset-react"
+ ]
+ }
+
+ // 修改后
+ {
+ "presets": [
+ [
+ "@babel/preset-react",
+ {
+ "runtime": "automatic", // 新增
+ "importSource": "openinula" // 新增
+ }
+ ]
+ ]
+ }
+ ```
+
+- 如若使用了 `@babel/plugin-transform-react-jsx`,请确保版本号大于 `7.9.0`
+
+ ```jsx
+ // 修改前
+ {
+ "plugins": [
+ "@babel/plugin-transform-react-jsx"
+ ]
+ }
+
+ // 修改后:
+ {
+ "plugins": [
+ [
+ "@babel/plugin-transform-react-jsx",
+ {
+ "runtime": "automatic", // 新增
+ "importSource": "openinula" // 新增
+ }
+ ]
+ ]
+ }
+ ```
+
+ > 注意:**`.babelrc` (`babel.config.js`)** 和 **webpack配置文件** 不要重复配置。
+
+---
+
+#### 不兼容 React 变更 FAQ
+
+1. openInula 不支持 Legacy Context,如:https://reactjs.org/docs/legacy-context.html ,请修改成new Context API,参考:https://reactjs.org/docs/context.html 。
+
+2. openInula 不支持在 Class 组件中使用 `this.refs`
+
+ ```jsx filename="InputFocusExample.jsx"
+ class InputFocusExample extends Component {
+ focusInput = () => {
+ this.refs.myInput.focus(); // 不支持 this.refs
+ };
+
+ render() {
+ return (
+
+
+ Focus Input
+
+ );
+ }
+ }
+
+ // 请修改成以下新的 Ref API 方式:
+ class InputFocusExample extends Component {
+ constructor(props) {
+ super(props);
+ this.myInput = React.createRef(); // 新的 Ref API
+ }
+
+ focusInput = () => {
+ this.myInput.current.focus(); // 通过 this.myInput.current 引用
+ };
+
+ render() {
+ return (
+
+
+ Focus Input
+
+ );
+ }
+ }
+ ```
+
+---
+
+#### 测试框架 FAQ
+
+1. openInula 如何与 `@testing-library/react` 配套使用?
+
+ openInula 支持与 React 提供的测试框架配合使用,方法配置简便,需要在 `jest.config.js` 中需要加入如下配置:
+
+ ```js filename="jest.config.js"
+ module.exports = {
+ moduleNameMapper: {
+ "^react$": "/node_modules/openinula",
+ "^react-dom": "/node_modules/openinula",
+ "^react/jsx-runtime": "/node_modules/openinula/jsx-runtime" // 非必须,如存在 require("react/jsx-runtime") 这种引入方式才需要
+ },
+ };
+ ```
+
+ > 注意:`"^react/jsx-runtime": "rootDir/node_modules/openinula/jsx-runtime"`是非必须添加,若存在 `require("react/jsx-runtime")` 这种引入方式才需要
+
+2. openInula 项目如何使用 `react-test-renderer` 测试框架?
+
+ openInula 不支持 `react-test-renderer` 这个测试框架,如果使用到需要自行修改。因为 `react-test-renderer` 用到了 React 的 `React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED` 接口,而 openInula 没有该接口。
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/conventional/UserInstruction/figure.png b/packages/website-next/src/app/docs/conventional/UserInstruction/figure.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba5a2f6044ecde43edaf33dd100a1d1411a15dbb
Binary files /dev/null and b/packages/website-next/src/app/docs/conventional/UserInstruction/figure.png differ
diff --git a/packages/website-next/src/app/docs/conventional/UserInstruction/page.mdx b/packages/website-next/src/app/docs/conventional/UserInstruction/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..cb988921ba3c4d2741b3e2025ffc1f29b0d455fa
--- /dev/null
+++ b/packages/website-next/src/app/docs/conventional/UserInstruction/page.mdx
@@ -0,0 +1,745 @@
+---
+sidebar_position: 2
+---
+
+# 用户指南
+
+openInula 是一款构建用户界面的 JavaScript 前端框架。本篇文章会对 openInula 的组件及生命周期、数据管理、事件绑定等知识进行详细介绍,相信通过本章学习您将掌握到 openinula 的基本知识和使用方法。
+
+## 开始使用
+
+### JSX
+
+JSX 是 JavaScript XML 的缩写,是一种用于构建用户界面的语法扩展。在 openInula 中,JSX 被广泛使用。开发者可以使用 JSX 来描述 UI 组件的结构和样式,并将其与 JavaScript 代码逻辑相结合。然后使用转译工具(例如`Babel`)将 JSX 代码转换为普通的 JavaScript 代码,以便浏览器能够理解并渲染。
+
+- JSX 是类 HTML 语言,其除了拥有 HTML 的功能外,还可以通过括号`{}`嵌套 JavaScript 表达式,这使得 JSX 更加灵活,可以动态地生成UI组件;
+- JSX 支持双向数据绑定,使得数据和界面之间的更新更加简单。当数据发生变化时,会智能地更新必要部分。HTML 没有直接支持数据绑定的功能;
+- 每个 JSX 必须返回独有元素。如果要返回多个顶级元素,请使用 `Fragment` 元素或者 <>>。
+
+```jsx filename="fragment-example.jsx"
+<>
+ Hello, {props.name}!
;
+
+
+>
+```
+
+### 组件
+
+组件是 openInula 的核心概念之一。它们是构建用户界面(UI)的基础,是可重用和独立的代码单元。开发者可以将相关功能、状态以及模板封装在组件中,提高可复用性,使得程序开发具备模块化和可维护特性。下面我们将展开介绍。
+
+#### 组件的设计
+
+组件不是 openInula 特有的概念,但是组件的设计思想会是优秀应用开发的基础。接下来我们就谈一谈组件设计的奥秘。
+
+openInula 组件思想具有普适性,无论是在其他框架还是原生 Web component 都适用。组件与我们之前学到的HTML的元素非常相似,如将一个 UI 界面分成独立的可重复复用的单独的部分,每个部称之为一个组件,各个组件之间相互交互以实现基本功能。
+
+
+
+如果您已经了解使用组件会给您的程序带来的优点,如何设计一个好的组件将是您接下来关注的问题,openInula 框架认为一个好的组件会遵循以下原则:
+
+1. 单一职责:组件只应该做一件事情。单一职责带来最大好处就是在修改组件时,不必担心对其他组件造成影响。
+2. 开闭原则:一个组件应该对扩展开放,对修改关闭,即通过扩展组件的行为来实现功能的变化,而不是修改组件的源代码。
+
+上述原则可以帮助开发者设计出高内聚、低耦合、可扩展、可维护的组件。如下示例是我们展示如何使用设计原则来实现一个安全可靠的组件。
+
+```jsx filename="button-form-page.jsx"
+import Inula, { render, Component } from 'openinula';
+
+// 示例组件 - 按钮组件
+class Button extends Component {
+ render() {
+ const { text, onClick } = this.props;
+ return (
+ {text}
+ );
+ }
+}
+
+// 示例组件 - 表单组件
+class Form extends Component {
+ handleSubmit = (event) => {
+ event.preventDefault();
+ // 处理表单提交逻辑
+ }
+
+ render() {
+ return (
+
+ );
+ };
+}
+
+// 示例组件 - 页面组件
+class Page extends Component {
+ render() {
+ return (
+
+
示例页面
+
+
+ );
+ };
+}
+
+// 渲染页面
+render(, document.getElementById('root'));
+```
+
+这个示例只是一个简单的演示,它展示了一个简单的按钮组件 `Button`,表单组件 `Form`,以及页面组件 `Page`。这些组件遵循了常见的组件原则, 满足了组件的可重用、可组合、可测试以及可维护等特性。
+
+#### 组件的分类
+
+我们从组件的设计中了解到为什么要使用组件?那我们如何定义、实现一个组件将是开发者关注的另一个问题。openInula 框架中支持函数式组件和类组件的实现,开发者可根据项目实际情况、编码习惯来选择。
+
+1. 类组件
+
+ 类组件通过继承 `Component` 类来创建,类组件具备自己内部状态(`state`),它可以在组件的生命周期中进行管理,类组件会使用 `render` 方法返回 JSX 元素,并可以通过定义其他方法来处理事件、状态更新等操作。下述示例定义了一个类组件`Counter`,并在类组件中进行了状态设置、修改等操作。
+
+ ```jsx filename="counter-class.jsx"
+ import Inula, { Component } from 'openinula';
+
+ export class Counter extends Component {
+ constructor(props) {
+ super(props);
+ this.state = { count: 0 };
+ }
+
+ increment() {
+ this.setState({ count: this.state.count + 1 });
+ };
+
+ render() {
+ return (
+
+
Count: {this.state.count}
+
this.increment()}>Increment
+
+ );
+ };
+ };
+ ```
+
+2. 函数组件
+
+ 函数组件是以函数形式呈现,可以接收一个属性(`props`)作为输入,并返回一个 JSX 元素。函数组件的代码量更少,易于阅读和理解。相较于类组件,没有繁琐的类声明和生命周期方法,更加直观和简洁。此外,函数组件没有实例化的过程,在一些情况下,函数组件比类组件具有更好的性能。
+
+ ```jsx filename="picture-greeting.jsx"
+ function Picture() {
+ return (
+
+ );
+ };
+
+ const Greeting = (props) => {
+ return (
+
+
Hello, {props.name}!
+
+
+ );
+ };
+ ```
+
+此外,无论是函数组件还是类组件,组件之间可以进行嵌套,实现更复杂的代码逻辑。在上述函数组件示例中包含了两个组件,`Greeting`为父组件,`Picture`是它的子组件。
+
+> 注意:
+> 1. 如果定义组件,则首字母需要大写,以区分 HTML 标签;
+> 2. 在渲染JSX元素时,`return` 时需要通过括号`()`包含多个组件,否则 `return` 中除首行代码外都会被忽略。
+
+#### 组件的渲染
+
+我们已经介绍了函数组件和类组件,下一步我们将思考如何能将创建的组件展示到界面?首先我们创建了一个 `index.jsx` 文件,使用 `document.getElementById('root')` 表示获取HTML文档中具有id为 `root` 的元素作为挂载点,进而在浏览器中展示 `Counter` 组件内容。
+
+```jsx filename="app.jsx"
+import { render } from 'openinula';
+import { Counter } from './Counter.js'
+
+function App() {
+ render(
+ ,
+ document.getElementById('root')
+ );
+};
+```
+
+### 组件间通信
+
+#### Props(属性)
+
+Props(属性)是组件之间传递数据的一种机制。Props 是从父组件向子组件传递的不可变对象。Props 的参数传递是一种单向传递,即从父组件单向传递子组件,因此 Props 是一种只读属性,子组件只能读取父组件传递的 Props,但却不能修改值。在如下示例中,我们创建一个父组件 `ParentComponent`,通过 Props 机制将参数传递给子组件 `ChildComponent`。
+
+```jsx filename="parent-child-component.jsx"
+function ParentComponent() {
+ return (
+
+ );
+}
+
+// 类组件
+class ChildComponent extends Component {
+ render() {
+ return (
+
+
Name: {this.props.name}
+
Age: {this.props.age}
+
Gender: {this.props.gender || 'Unknown'}
+
+ );
+ }
+}
+
+// 函数组件
+function ChildComponent(props) {
+ return (
+
+
Name: {props.name}
+
Age: {props.age}
+
Gender: {props.gender || 'Unknown'}
+
+ );
+}
+```
+
+在上述代码中,子组件 `ChildComponent` 通过 Props 机制可以获取到父组件传入的 `props` 并获取 `name`、`age` 以及 `gender` 等值。
+
+```jsx
+Name: {props.name}
+```
+
+有些读者可能已经发现,父组件传入的 `props` 中没有 `gender` 属性。但是如果子组件执意使用时,也可传入默认值。在上述例子中,当父组件没有传入对应属性 `props.gender` 时,可以设置默认值为`Unknown`,如果没有设置对应属性的默认值,则获取到的值为 `undefined`。
+
+#### State(状态)
+
+openInula 中 State(状态) 是一种用于存储和管理组件内部数据的机制。它是一个对象,包含了组件的可变数据。当状态发生变化时会自动重新渲染组件,以反映最新的状态。
+
+在介绍组件的分类时,我们在[类组件](#组件的分类)中定义了 `Counter` 组件让读者更直观地感受类组件特点,在 `Counter` 类组件中,我们使用 `this.state = { count: 0 }` 定义了计数器的初始状态值,并通过 `setState` 函数进行修改状态。但是这只是针对类组件中的状态的设置以及修改,如果在函数组件中,我们又如何使用呢?
+
+下面示例中我们将类组件 `Counter` 改写写成函数组件,用 `useState` 钩子函数来声明管理组件的状态,因此代码也可以写为:
+
+```jsx filename="counter-func.jsx"
+import Inula, { useState } from 'openinula';
+
+function Counter() {
+ const [count, setCount] = useState(0);
+
+ const increment = () => {
+ setCount(count + 1);
+ };
+
+ return (
+
+
Count: {count}
+
Increment
+
+ );
+}
+```
+
+`useState` 钩子用于定义名为 `count` 的状态变量,并使用初始值0进行初始化。同时返回的 `setCount` 函数用于更新 `count` 的值。当用户点击 `Increment` 按钮时,会触发 `increment` 函数并进一步调用 `setCount` 来增加计数器的值,并更新组件的状态。每次 `setCount` 被调用时会重新渲染 `Counter` 组件,并显示最新的计数值。
+
+> Tips: `state` 与 `props`区别
+> `state` 是组件内部管理的可变数据,用于存储和更新组件的私有状态。而 `props` 是由父组件传递给子组件的不可变数据,用于组件之间的数据传递和通信。通过结合使用 `state` 和 `props`,可以实现动态的和可重用的组件,并在应用中管理和传递数据。
+
+#### 组件通信的封装性
+
+openInula 提倡开发者使用组件,对于单个组件来说,单一职责原则会保证组件的封装性,但是组件之间的应该存在必要的交互通信,才能相互协作协作,完整更复杂的功能逻辑。细心的读者已经发现在上述的例子中,我们已经使用 `props` 和 `state` 来进行组件的交互,但是如何在保证组件交互时同样具备封装性呢?下面我们通过一个错误案例以及对其的修改进行详细说明。
+
+```jsx
+// ParentComponent.js
+import Inula, { Component } from 'openinula';
+import ChildComponent from './ChildComponent';
+
+class ParentComponent extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ message: 'Hello',
+ };
+ }
+
+ handleChange = (e) => {
+ this.setState({ message: e.target.value });
+ };
+
+ render() {
+ return (
+
+
+
+
+ );
+ }
+}
+
+// ChildComponent.js
+import Inula, { Component } from 'openinula';
+
+class ChildComponent extends Component {
+ render() {
+ return {this.props.message}
;
+ }
+}
+```
+
+在上述示例中,`ParentComponent` 和 `ChildComponent` 是两个组件。然而,`ParentComponent` 直接将自己的状态(`message`)传递给了 `ChildComponent` 作为 `props` ,这违背了组件封装性的原则。
+
+根据组件封装性的原则,一个组件应该尽可能地隐藏其内部实现细节,并通过 `props` 接口与外部进行通信。但在这个示例中,`ParentComponent` 将自己的状态直接传递给了 `ChildComponent`,导致 `ChildComponent` 依赖于 `ParentComponent` 的状态。
+
+因此,我们在重构中,首先会考虑到以“粗暴、直接地”方式修改 `message` 值,并且考虑到组件的封装特性,保证组件只感知到自身的 `state`。我们可以将 `ChildComponent` 中的 `message` 属性改为通过 `props` 传递一个回调函数,然后在 `ParentComponent` 中定义这个回调函数,将 `message` 作为参数传递给它,最后在 `ChildComponent` 中调用这个回调函数来获取 `message`。
+
+修改后的代码如下:
+
+```jsx
+// ParentComponent.js
+import Inula, { Component } from 'openinula';
+import ChildComponent from './ChildComponent';
+
+class ParentComponent extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ message: 'Hello',
+ };
+ }
+
+ handleChange = (e) => {
+ this.setState({ message: e.target.value });
+ };
+
+ render() {
+ return (
+
+
+ this.state.message} />
+
+ );
+ };
+}
+
+
+// ChildComponent.js
+import Inula, { Component } from 'openinula';
+
+class ChildComponent extends Component {
+ render() {
+ return {this.props.getMessage()}
;
+ };
+}
+
+export default ParentComponent;
+```
+
+这样,我们通过回调函数的方式,将 `message` 的获取封装在了 `ParentComponent` 中,`ChildComponent` 组件就不需要再知道 `ParentComponent` 组件的内部情况,保证了 `ChildComponent` 的封装性。
+
+### 条件渲染与列表渲染
+
+条件渲染与列表渲染是 openInula 中常用的功能,条件渲染的方式可以根据不同的情况来显示不同的内容,提高用户体验。列表渲染可以简化代码逻辑,更便捷的开发代码。因此,JSX 也满足在 openInula 中可以实现条件渲染以及列表渲染。
+
+1. **条件渲染**:使用 if 条件语句或三元表达式来实现条件渲染。
+
+ ```jsx
+ function UserGreeting(props) {
+ return Welcome back!
;
+ }
+
+ function GuestGreeting(props) {
+ return Please sign up.
;
+ }
+
+ // 直接使用 if-else 语句
+ function Example(props) {
+ const isLoggedIn = props.isLoggedIn;
+ if (isLoggedIn) {
+ return ;
+ }
+ return ;
+ }
+
+ // 使用三元表达式
+ function Example(props) {
+ const isLoggedIn = props.isLoggedIn;
+ return (
+ {isLoggedIn ? : }
+ );
+ }
+ ```
+
+ 在这个示例中我们定义了两种问候用户的组件 `` 与 ``,并希望根据用户是否登录 `isLoggedIn` 分别展示前后者。我们可以使用 if-else 语句分别返回不同的组件,也可以通过三元表达式择一返回。
+
+
+2. **列表渲染**:使用 for 循环或 `map` 来实现组件列表渲染。
+
+ ```jsx
+ function List(props) {
+ const items = props.items.map((item, index) => (
+ {item}
+ ));
+
+ return ;
+ }
+
+ function App() {
+ const items = ['Item 1', 'Item 2', 'Item 3'];
+
+ return (
+
+
List Demo
+
+
+ );
+ }
+ ```
+
+ 在这个示例中,我们定义了一个 `List` 组件,它接收一个 `items` 属性,该属性是一个字符串数组。我们使用 `map` 函数将每个字符串转换为一个 `` 元素,并将它们存储在一个 `items` 数组中。最后,我们将这个数组作为子元素传递给 `` 元素,以渲染整个列表。
+
+### 事件
+
+openInula 中支持事件是为了实现交互性和动态性的用户界面,通过在组件中定义事件处理函数,可以将用户的操作与组件的状态和行为关联起来。当用户触发事件时,openInula 会调用相应的事件处理函数,并根据需要更新组件的状态或执行其他操作,从而实现动态的用户界面。
+
+openInula组件感知到用户触发事件是通过 `onXxxx` 属性来监听 DOM 事件,并在事件触发时执行事件的处理函数。因此在 openInula 中必须定义一个事件处理函数,在使用时只需要传递事件即可。
+
+> 事件的命名规则:on+驼峰形式事件名 = 事件处理函数
+
+#### 事件处理函数的定义
+
+事件处理函数其实就是一个函数,它被用来响应特定的事件。当事件被处理时,事件函数就会被触发。
+
+```jsx
+function handleClick() {
+ // 处理点击事件的逻辑
+ console.log('Button clicked!');
+}
+```
+
+#### 事件处理函数的触发
+
+在openInula中,我们使用`onXxxx`属性来绑定事件处理函数,例如,使用`onClick`属性来绑定点击事件。函数绑定为了确保事件处理函数可以正确地访问组件实例的上下文(`this`)。有几种方法可以实现函数绑定:
+
+1. 在构造函数中使用 `bind` 方法绑定函数
+
+ ```jsx
+ class App extends Component {
+ constructor(props) {
+ super(props);
+ this.handleClick = this.onHandleClick.bind(this);
+ }
+
+ onHandleClick() {
+ // 处理点击事件的逻辑
+ console.log('Button clicked!');
+ };
+
+ render() {
+ return Click me;
+ };
+ };
+ ```
+
+2. 使用箭头函数定义事件处理函数
+
+ ```jsx
+ class App extends Component {
+ handleClick = () => {
+ // 处理点击事件的逻辑
+ console.log('Button clicked!');
+ };
+
+ render() {
+ return Click me;
+ };
+ };
+ ```
+
+ > 箭头函数可以避免`this`指向问题,是因为箭头函数没有自己的`this`,它会继承外层函数的`this`。
+
+#### openInula支持的事件
+
+- Clipboard Events 剪切板事件
+ - 事件名: `onCopy`, `onCut`, `onPaste`
+ - 属性: `DOMDataTransfer`, `clipboardData`
+- compositionEvent 复合事件
+ - 事件名: `onCompositionEnd`, `onCompositionStart`, `onCompositionUpdate`
+ - 属性: `string`, `data`
+- Keyboard Events 键盘事件
+ - 事件名: `onKeyDown`, `onKeyPress`, `onKeyUp`
+ - 属性: `number`, `keyCode`
+- Focus Events 焦点事件 (这些焦点事件在 openinula DOM 上的所有元素都有效,不只是表单元素)
+ - 事件名: `onFocus`, `onBlur`
+ - 属性: `DOMEventTarget`, `relatedTarget`
+- Form Events 表单事件
+ - 事件名: `onChange`, `onInput`, `onInvalid`, `onSubmit`
+- Mouse Events 鼠标事件
+ - 事件名: `onClick`, `onContextMenu`, `onDoubleClick`, `onDrag`, `onDragEnd`, `onDragEnter`, `onDragExit`, `onDragLeave`, `onDragOver`, `onDragStart`, `onDrop`, `onMouseDown`, `onMouseEnter`, `onMouseLeave`, `, onMouseMove`, `onMouseOut`, `onMouseOver`, `onMouseUp`
+- Pointer Events 指针事件
+ - 事件名: `onPointerDown`, `onPointerMove`, `onPointerUp`, `onPointerCancel`, `onGotPointerCapture`, `onLostPointerCapture`, `onPointerEnter`, `onPointerLeave`, `onPointerOver`, `onPointerOut`
+
+### Hook
+
+Hook 是 openInula 目前提供的一种函数,Hook 函数可以让我们在函数组件中使用状态管理、生命周期方法、副作用等功能。常用的[钩子函数](/apis/Inula#钩子函数)包括 `useState`、`useEffect`、`useContext`、`useReducer`等。
+
+当然,当 openInula 提供的 Hook 组件无法满足您的需求时,您可以自定义 Hook。在 openInula 中,自定义 Hook 函数的本质是一种重用状态逻辑思想。每一个 Hook 函数都是普通的函数。主要是其使用了 openInula 自带的 Hook API 等。下面我们就举例说明如何自定义一个 Hook 函数。
+
+```jsx
+import Inula, { useState, useEffect } from 'openinula';
+
+function useFetch(url) {
+ const [data, setData] = useState(null);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ async function fetchData() {
+ const response = await fetch(url);
+ const data = await response.json();
+ setData(data);
+ setLoading(false);
+ }
+ fetchData();
+ }, [url]);
+
+ return { data, loading };
+}
+```
+
+这个自定义的 Hook 函数 `useFetch` 接收一个URL作为参数,并返回一个包含 `data` 和 `loading` 状态的对象。在 `useEffect` 中,我们使用 `async/await` 语法来获取数据,并在获取数据后更新状态。
+
+使用时:
+
+```jsx
+import useFetch from './useFetch';
+
+function MyComponent() {
+ const { data, loading } = useFetch('https://jsonplaceholder.typicode.com/todos/1');
+
+ if (loading) {
+ return Loading...
;
+ }
+
+ return (
+
+
{data.title}
+
{data.completed ? 'Completed' : 'Not completed'}
+
+ );
+}
+
+export default MyComponent;
+```
+
+在这个组件中,我们使用 `useFetch` 来获取数据,并根据 `loading` 状态显示不同的内容。这个自定义 Hook 函数可以在多个组件中重复使用,以避免重复的代码。
+
+### 组件的生命周期
+
+openInula 的组件创建时都会进行初始化步骤,在此过程会运行 openInula 所声明的生命周期钩子函数,便于开发者在特定阶段运行自己的代码,以实现复杂的项目逻辑。我们认为使用一个组件的主要流程遵循:**使用时创建,数据变化时更新,使用完卸载**。
+
+#### 类组件的生命周期
+
+在介绍类组件时,我们创建了一个 `Counter` 组件,其可以简单的实现计数器功能,但是当我们需要知道之前的值 `prevState` 以及当前的值 `currentState` 时,就需要使用更细节的代码控制,如生命周期。在下面新的 `Counter` 组件中我们调用了一些生命周期钩子函数,包含了组件的挂载、更新、卸载等过程。
+
+```jsx
+import { Component } from 'openinula';
+
+class Counter extends Inula.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ counter: 0
+ };
+ console.log('Constructor');
+ }
+
+ componentDidMount() {
+ console.log('Component Did Mount');
+ }
+
+ componentDidUpdate() {
+ console.log('Component Did Update');
+ }
+
+ componentWillUnmount() {
+ console.log('Component Will Unmount');
+ }
+
+ handleIncrement = () => {
+ this.setState(prevState => ({
+ counter: prevState.counter + 1
+ }));
+ };
+
+ render() {
+ console.log('Render');
+ return (
+
+
Counter: {this.state.counter}
+ Increment
+
+ );
+ }
+}
+```
+
+**类组件的挂载**
+
+当 `Counter` 组件第一次通过 `render` 函数渲染在HTML页面时,这个方式被称为“挂载”。`componentDidMount` 钩子函数在组件挂载到 DOM 后被调用,可以用于执行初始化操作,例如发起网络请求、订阅事件等。
+
+```jsx
+componentDidMount() {
+ console.log('Component mounted');
+}
+```
+
+**类组件的更新**
+
+当组件中的内容变化时,则会触发组件的更新状态,会重新渲染页面。因此在组件挂载的情况存在两种,一种是初始化渲染,另一种是状态更新之后重新挂载。`componentDidUpdate` 在组件更新后被调用,可以用于处理组件的更新逻辑,比较前后状态的变化等。
+
+```jsx
+componentDidUpdate(prevProps, prevState) {
+ console.log('Component updated');
+}
+```
+
+**类组件的卸载**
+
+`componentWillUnmount` 在组件即将从 DOM 中卸载之前被调用,可以用于清理操作,例如取消网络请求、清除定时器等。
+
+```jsx
+componentWillUnmount() {
+ console.log('componentWillUnmount');
+}
+```
+
+#### 函数组件的生命周期
+
+函数组件的生命周期是通过 `useEffect` 钩子函数来模拟的。
+
+**函数组件的挂载**
+
+```jsx
+// 模拟 componentDidMount
+useEffect(() => {
+ console.log('Component did mount');
+ // 在这里可以执行一些初始化操作
+ // 也可以发送网络请求等操作
+ // 注意:这个回调函数只会在组件挂载时执行一次
+}, []);
+```
+
+`useEffect`的第一个参数中的回调函数会被调用,模拟了`componentDidMount`。第二个参数为依赖项,可以控制回调函数的触发时机,这里未指定依赖项,则意味着只会在初次挂载时触发回调函数。
+
+**函数组件的更新**
+
+```jsx
+// 模拟 componentDidUpdate
+useEffect(() => {
+ console.log('Component did update');
+ // 在这里可以处理一些副作用操作
+ // 例如,更新文档标题等
+ // 注意:这个回调函数在组件更新时会执行
+}, [count]);
+```
+
+这里指定参数中的依赖项为 `count`,即只有依赖项 `count` 发生变化时,回调函数才会被调用。
+
+**函数组件的卸载**
+
+```jsx
+// 模拟 componentWillUnmount
+useEffect(() => {
+ return () => {
+ console.log('Component will unmount');
+ // 在这里可以执行一些清理操作
+ // 例如,取消订阅、清除定时器等
+ // 注意:这个回调函数只会在组件卸载时执行
+ };
+}, []);
+```
+
+这里为回调函数设置了返回函数,在函数卸载时将调用这个返回函数中的操作,例如,取消订阅、清除定时器等。
+
+## 快速进阶
+
+### Ref
+
+openInula已经提供了两种管理数据的方式(`state` 和 `props`),但是针对一些特殊场景,当您的 openInula 组件需要与外部 API 通信时,通常需要在组件挂载后进行一些 DOM 操作,例如获取元素的尺寸、绑定事件监听器等。这些操作需要直接访问 DOM 元素,而 `props` 和 `state` 主要用于组件之间的数据传递和状态管理,不能达到操作 DOM 的目的,因此,openInula 还提供了 Ref 方式,允许我们直接操作组件的 DOM 元素或者调用组件内的方法,以进行数据交换。
+
+#### Refs对象的创建
+
+1. 使用 `createRef` 的方式可以创建一个 Ref 对象,可通过附加到 `ref` 属性上访问一个原生 DOM 元素或者组件。这种方式既可以在函数组件中使用,也可以在类组件中使用。
+
+ ```jsx
+ const ref = createRef();
+ ```
+
+2. 使用 `useRef(initialValue)` 创建,这种方式只能在函数组件中使用。
+
+ ```jsx
+ const ref = useRef(initialValue);
+ ```
+
+> 上述两种方法的区别:`createRef` 每次渲染都会返回一个新的引用,而 `useRef` 每次都会返回相同的引用。详细请查阅[API参考](/apis/Inula)。
+
+#### Ref 的两种使用场景
+
+1. 存储变量
+
+ ```jsx
+ import Inula, { useState, useRef, useCallback } from 'openinula'
+
+ export default function ClickWatch() {
+ let ref = useRef(0);
+
+ const handleClick = useCallback(() => {
+ ref.current = ref.current + 1;
+ alert('You clicked ' + ref.current + ' times!');
+ }, []);
+
+ return (
+
+ Click me!
+
+ );
+ }
+ ```
+
+ 在上述示例中,通过使用`useRef(0)`我们创建了
+
+ ```jsx
+ {
+ current: 0
+ }
+ ```
+
+ 这个对象,当对 `ref.current` 操作时,这个值是可变的,但是对象是不变的,这保证组件不会在每次递增时都触发重新渲染。
+
+2. 操作DOM
+
+ 通过使用 Ref,我们能够直接访问和操作 DOM 元素,而无需通过其他方式来获取或修改其值。下面的例子很好展示了 Ref 的用法。
+
+ ```jsx
+ import { useRef } from "openinula";
+
+ function Component() {
+ const inputRef = useRef(null);
+
+ const handleClick = () => {
+ alert(`Input value: ${inputRef.current.value}`);
+ };
+
+ return (
+
+
+ Get Value
+
+ );
+ }
+ ```
+
+ 在上述案例中,为了使用 Ref 特性,我们使用 `useRef` 钩子创建了一个 `inputRef` 变量,并将其初始化为 `null`。将 `inputRef` 传递给 `` 元素的 `ref` 属性。当按钮被点击时,则可以通过 `inputRef.current` 访问到DOM节点,并获取输入框的值。
+
+> 注意:由于`ref`是可以避免重新渲染,因此,不要在渲染的过程中读取和写入,会导致结果不可控制。
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/introduction/page.mdx b/packages/website-next/src/app/docs/introduction/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..64c47a6032ed85d0e3e79931a0ac17fc683d6d46
--- /dev/null
+++ b/packages/website-next/src/app/docs/introduction/page.mdx
@@ -0,0 +1,41 @@
+---
+id: introduction
+title: 项目介绍
+sidebar_label: 项目介绍
+---
+
+# 项目介绍
+
+OpenInula 是一个现代化的 JavaScript UI 框架,致力于提供极致性能和开发体验。
+
+## 设计理念
+
+- 无 API 哲学:只用 JSX + 原生 JS
+- 编译优先:大部分逻辑编译期完成
+- 响应式:自动追踪依赖,极致性能
+
+## 核心特性
+
+- 直观的状态管理
+- 内置模板语法(if/for)
+- 计算值与 watch
+- 生命周期钩子
+- 兼容 React 生态
+
+## 主要模块
+
+- runtime:核心运行时
+- shared:通用工具
+- compiler:编译器
+- inula-bridge:兼容层
+
+## 未来方向
+
+- 更强的类型推导
+- 更丰富的生态组件
+- 更高效的编译优化
+
+## 下一步
+
+- [快速入门](./getting-started)
+- [基础概念](next/core-concepts/introduction)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/layout.tsx b/packages/website-next/src/app/docs/layout.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6eee41789fa2475bc50a2e9f556d1915bc182486
--- /dev/null
+++ b/packages/website-next/src/app/docs/layout.tsx
@@ -0,0 +1,233 @@
+import { ReactNode } from 'react'
+import { Layout } from 'nextra-theme-docs'
+/*import { getPageMap } from 'nextra/page-map'*/
+import 'nextra-theme-docs/style.css'
+
+export default async function RootLayout({children}: Readonly<{ children: ReactNode }>) {
+ //const allPages = await getPageMap()
+
+ const docsMap = [
+ {
+ name: "概述",
+ route: '/docs',
+ title: '概述',
+ kind: 'MdxPage',
+ },
+ {
+ name: 'introduction',
+ route: '/docs/introduction',
+ title: 'Introduction',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'Quick start',
+ route: '/docs/quick-start',
+ title: '快速开始',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'reactivity',
+ route: '/docs/reactivity',
+ title: '响应式系统',
+ kind: 'Folder',
+ children: [
+ {
+ name: 'state',
+ route: '/docs/reactivity/state',
+ title: '状态管理',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'computed',
+ route: '/docs/reactivity/computed',
+ title: '计算值',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'watch',
+ route: '/docs/reactivity/watch',
+ title: '监听系统',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'untrack',
+ route: '/docs/reactivity/untrack',
+ title: 'untrack(非响应式访问)',
+ kind: 'MdxPage'
+ }
+ ]
+ },
+ {
+ name: 'template-system',
+ route: '/docs/template-system',
+ title: '模板系统',
+ kind: 'Folder',
+ children: [
+ {
+ name: 'conditional',
+ route: '/docs/template-system/conditional',
+ title: '条件渲染',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'event-handling',
+ route: '/docs/template-system/event-handling',
+ title: '事件处理',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'list-rendering',
+ route: '/docs/template-system/list-rendering',
+ title: '列表渲染',
+ kind: 'MdxPage'
+ }
+ ]
+ },
+ {
+ name: 'lifecycle',
+ route: '/docs/lifecycle',
+ title: '生命周期',
+ kind: 'Folder',
+ children: [
+ {
+ name: 'mounting',
+ route: '/docs/lifecycle/mounting',
+ title: '挂载阶段',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'unmounting',
+ route: '/docs/lifecycle/unmounting',
+ title: '卸载阶段',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'cleanup',
+ route: '/docs/lifecycle/cleanup',
+ title: '清理阶段',
+ kind: 'MdxPage'
+ }
+ ]
+ },
+ {
+ name: 'components',
+ route: '/docs/components',
+ title: '组件',
+ kind: 'Folder',
+ children: [
+ {
+ name: 'composition',
+ route: '/docs/components/composition',
+ title: '组合模式',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'context',
+ route: '/docs/components/context',
+ title: '上下文',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'Dynamic',
+ route: '/docs/components/Dynamic',
+ title: '动态组件',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'ErrorBoundary',
+ route: '/docs/components/ErrorBoundary',
+ title: '错误边界',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'Fragment',
+ route: '/docs/components/Fragment',
+ title: 'Fragment',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'Portal',
+ route: '/docs/components/Portal',
+ title: 'Portal',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'props',
+ route: '/docs/components/props',
+ title: 'Props',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'Suspense',
+ route: '/docs/components/Suspense',
+ title: 'Suspense',
+ kind: 'MdxPage'
+ }
+ ]
+ },
+ {
+ name: 'conventional',
+ route: '/docs/conventional',
+ title: '传统API文档',
+ kind: 'Folder',
+ children: [
+ {
+ name: 'UserInstruction',
+ route: '/docs/conventional/UserInstruction',
+ title: '用户指南',
+ kind: 'MdxPage',
+ },
+ {
+ name: 'QuickStart',
+ route: '/docs/conventional/QuickStart',
+ title: '快速入门',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'SwitchingGuide',
+ route: '/docs/conventional/SwitchingGuide',
+ title: '切换指导书',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'ReleaseNotes',
+ route: '/docs/conventional/ReleaseNotes',
+ title: '发行说明',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'FAQ',
+ route: '/docs/conventional/FAQ',
+ title: '常见问题',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'CodeOfConduct',
+ route: '/docs/conventional/CodeOfConduct',
+ title: '行为准则',
+ kind: 'MdxPage'
+ },
+ {
+ name: 'ContributingGuide',
+ route: '/docs/conventional/ContributingGuide',
+ title: '贡献指南',
+ kind: 'MdxPage'
+ }
+ ]
+ }
+ ]
+
+ return (
+
+
+ {children}
+
+
+ )
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/lifecycle/cleanup/page.mdx b/packages/website-next/src/app/docs/lifecycle/cleanup/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..8611801757462c5802c892e28a94435127ea51a6
--- /dev/null
+++ b/packages/website-next/src/app/docs/lifecycle/cleanup/page.mdx
@@ -0,0 +1,59 @@
+---
+id: cleanup
+title: 清理操作
+sidebar_label: 清理操作
+---
+
+# 清理操作
+
+清理操作用于移除副作用,如定时器、事件监听、watch 清理函数等。
+
+## 定时器清理
+
+```tsx filename="TimerCleanup.jsx"
+function Timer() {
+ let timer;
+ didMount(() => {
+ timer = setInterval(() => {}, 1000);
+ });
+ willUnmount(() => clearInterval(timer));
+ return 定时器已启动
;
+}
+```
+
+## 事件监听清理
+
+```tsx filename="EventListener.jsx"
+function Listener() {
+ function onResize() {}
+ didMount(() => window.addEventListener('resize', onResize));
+ willUnmount(() => window.removeEventListener('resize', onResize));
+ return 监听窗口大小
;
+}
+```
+
+## watch 清理函数
+
+```tsx filename="WatchCleanup.jsx"
+function Watcher() {
+ let timer;
+ watch(() => {
+ timer = setInterval(() => {}, 1000);
+ return () => clearInterval(timer);
+ });
+ return watch 清理
;
+}
+```
+
+## 最佳实践
+
+- 所有副作用都应有清理逻辑
+- 推荐统一在 willUnmount/didUnmount 或 watch 清理函数中处理
+
+## 注意事项
+
+- 避免遗留定时器、事件监听等,防止内存泄漏
+
+## 相关链接
+
+- [卸载阶段](../unmounting)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/lifecycle/mounting/page.mdx b/packages/website-next/src/app/docs/lifecycle/mounting/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..2ea05b05178f9a691699a2669953c11388bd7355
--- /dev/null
+++ b/packages/website-next/src/app/docs/lifecycle/mounting/page.mdx
@@ -0,0 +1,49 @@
+---
+id: mounting
+title: 挂载阶段
+sidebar_label: 挂载阶段
+---
+
+# 挂载阶段
+
+组件挂载时可执行副作用,如数据请求、事件监听等。OpenInula 提供 didMount 钩子。
+
+## 基本用法
+
+```tsx filename="PageTitle.jsx"
+function PageTitle() {
+ let title = '';
+ didMount(() => {
+ title = document.title;
+ });
+ return 页面标题:{title}
;
+}
+```
+
+## 数据请求
+
+```tsx filename="FetchData.jsx"
+function FetchData() {
+ let data = null;
+ didMount(() => {
+ fetch('/api/data')
+ .then(res => res.json())
+ .then(d => { data = d; });
+ });
+ return
{JSON.stringify(data)};
+}
+```
+
+## 最佳实践
+
+- 只在 didMount 中执行副作用
+- 清理副作用请用 willUnmount/didUnmount
+
+## 注意事项
+
+- didMount 只在组件首次挂载时执行一次
+
+## 相关链接
+
+- [卸载阶段](../unmounting)
+- [清理操作](../cleanup)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/lifecycle/unmounting/page.mdx b/packages/website-next/src/app/docs/lifecycle/unmounting/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..01316bb4e0407fc74744a0b37fe31b6c2802478f
--- /dev/null
+++ b/packages/website-next/src/app/docs/lifecycle/unmounting/page.mdx
@@ -0,0 +1,43 @@
+---
+id: unmounting
+title: 卸载阶段
+sidebar_label: 卸载阶段
+---
+
+# 卸载阶段
+
+组件卸载时需清理副作用,防止内存泄漏。OpenInula 提供 willUnmount/didUnmount 钩子。
+
+## 基本用法
+
+```tsx filename="Timer.jsx"
+function Timer() {
+ let timer;
+ didMount(() => {
+ timer = setInterval(() => {}, 1000);
+ });
+ willUnmount(() => clearInterval(timer));
+ // 或 didUnmount(() => clearInterval(timer));
+ return 定时器已启动
;
+}
+```
+
+## 副作用清理
+
+- 清理定时器、事件监听、watch 副作用等
+- 推荐所有副作用都在卸载时清理
+
+## 最佳实践
+
+- 所有副作用都应在卸载时清理
+- 推荐用 willUnmount/didUnmount
+
+## 注意事项
+
+- 清理函数只在组件卸载时执行一次
+- 避免遗留定时器、事件监听等,防止内存泄漏
+
+## 相关链接
+
+- [挂载阶段](../mounting)
+- [清理操作](../cleanup)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/page.mdx b/packages/website-next/src/app/docs/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..d606a91294cfe4d40fb7573bc6e968c7640679a4
--- /dev/null
+++ b/packages/website-next/src/app/docs/page.mdx
@@ -0,0 +1,110 @@
+# openInula 2
+
+openInula 2版本是一个现代化的 JavaScript UI 开发库,具有以下特点:
+
+- **无 API 设计理念**:只需使用 JSX 和原生 JavaScript 即可直观编程
+- **编译优先**:通过编译时分析优化性能
+- **轻量级响应式系统**:高效的运行时更新机制
+
+## 核心特性
+
+### 直接状态管理
+
+```tsx filename="Counter.jsx"
+function Counter() {
+ let count = 0; // 直接声明状态
+
+ return (
+
+
计数: {count}
+
count++}>增加
+
+ );
+}
+```
+
+### 内置流程控制
+
+```tsx filename="UserList.jsx"
+function UserList({ users }) {
+ return (
+
+
+ {(user) => (
+
+ - {user.name}
+
+ )}
+
+
+ );
+}
+```
+
+### 计算值
+
+```tsx filename="DoubleCounter.jsx"
+function DoubleCounter() {
+ let count = 0;
+ const double = count * 2; // 自动计算的值
+
+ return 双倍值: {double}
;
+}
+```
+
+### 监听系统
+
+```tsx filename="DataFetcher.jsx"
+function DataFetcher() {
+ let data = null;
+
+ watch(() => {
+ fetch('https://api.example.com/data')
+ .then(res => res.json())
+ .then(_data => {
+ data = _data;
+ });
+ });
+
+ return (
+
+
+ {JSON.stringify(data, null, 2)}
+
+
+ 加载中...
+
+
+ );
+}
+```
+
+## 快速开始
+
+让我们通过以下章节来学习 openInula 2版本:
+
+1. [基础概念](./core-concepts/introduction)
+
+- 组件基础
+- JSX 语法
+- 状态管理
+2. [模板系统](./template-system/conditional)
+
+- 条件渲染
+- 列表渲染
+- 事件处理
+3. [响应式系统](./reactivity/state)
+
+- 状态声明
+- 计算值
+- 监听系统
+4. [组件开发](./components/props)
+
+- Props 传递
+- 组件组合
+- 上下文管理
+5. [生命周期](./lifecycle/mounting)
+
+- 挂载阶段
+- 卸载阶段
+- 清理操作
diff --git a/packages/website-next/src/app/docs/quick-start/page.mdx b/packages/website-next/src/app/docs/quick-start/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..09b2b169570a5021cb5e73d974b98e555d178dc3
--- /dev/null
+++ b/packages/website-next/src/app/docs/quick-start/page.mdx
@@ -0,0 +1,141 @@
+---
+id: getting-started
+title: 快速入门
+sidebar_label: 快速入门
+---
+
+# 快速入门
+
+欢迎使用 openInula 2!本节将带你完成环境搭建、插件集成、项目初始化和第一个组件。
+
+## 环境要求
+
+- Node.js >= 16.14
+- 推荐使用 npm 8+ 或 pnpm/yarn
+
+## 使用 CLI 快速创建项目
+
+OpenInula 提供了官方脚手架工具 `create-inula`,可以一键初始化新项目,无需手动配置。
+
+### 安装与使用
+
+无需全局安装,直接用 npx 或 npm create:
+
+```bash filename="create-project.sh"
+# 推荐方式(无需全局安装)
+npm create inula@latest my-app
+
+# 或者使用 npx
+npx create-inula my-app
+```
+
+执行命令后,CLI 会引导你选择项目模板、打包方式(如 webpack/vite)等,并自动拉取依赖、初始化目录结构。
+
+### 典型交互流程
+
+1. 选择项目名称(如 my-app)
+2. 选择模板(如 Next-app,后续会有更多模板)
+3. 选择打包方式(webpack 或 vite)
+4. 自动安装依赖并初始化项目
+
+### 目录结构示例
+
+```text filename="project-structure.txt"
+my-app/
+├── src/
+│ └── main.tsx
+├── public/
+│ └── index.html
+├── package.json
+└── ...
+```
+
+### 启动开发服务器
+
+进入项目目录后,运行:
+
+```bash filename="start-dev.sh"
+npm install
+npm start
+```
+
+即可在浏览器中访问本地开发环境。
+
+### 更多用法
+
+详细参数和高级用法请参考 [create-inula README](https://github.com/openinula/openinula/tree/main/packages/create-inula/README.md)。
+
+
+## 集成到主流构建工具
+
+OpenInula 提供统一的 unplugin 插件,支持 Vite、Rollup、Webpack、Nuxt、Vue CLI、esbuild 等主流工具。
+
+### 安装依赖
+
+
+```bash filename="install-unplugin.sh"
+npm i @openinula/unplugin
+```
+
+### Vite
+
+```ts filename="vite.config.ts"
+import { defineConfig } from 'vite';
+import inulaNext from '@openinula/unplugin/vite';
+
+export default defineConfig({
+ plugins: [
+ inulaNext({ /* 可选配置 */ }),
+ ],
+});
+```
+
+### Rollup
+
+```js filename="rollup.config.js"
+import inulaNext from '@openinula/unplugin/rollup';
+
+export default {
+ plugins: [
+ inulaNext({ /* 可选配置 */ }),
+ ],
+};
+```
+
+### Webpack
+
+```js filename="webpack.config.js"
+// webpack.config.js
+module.exports = {
+ /* ... */
+ plugins: [
+ require('@openinula/unplugin/webpack')({ /* 可选配置 */ })
+ ]
+}
+```
+
+
+## 第一个组件
+
+```tsx filename="Hello.jsx"
+function Hello() {
+ return 你好,OpenInula!
;
+}
+```
+
+## 目录结构
+
+- src/ 代码目录
+- public/ 静态资源
+- package.json 项目配置
+
+## 相关链接
+
+- [unplugin 官方文档](https://github.com/unjs/unplugin)
+- [OpenInula 插件源码](https://github.com/openinula/openinula/tree/main/next-packages/compiler/unplugin-inula-next)
+- [更多示例 playground/](https://github.com/openinula/openinula/tree/main/next-packages/compiler/unplugin-inula-next/playground)
+
+## 下一步
+
+- 阅读[项目介绍](./introduction)
+- 深入[基础概念](next/core-concepts/introduction)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/reactivity/computed/page.mdx b/packages/website-next/src/app/docs/reactivity/computed/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..f7c455391c0dc33217e876041e9253f2b7791706
--- /dev/null
+++ b/packages/website-next/src/app/docs/reactivity/computed/page.mdx
@@ -0,0 +1,79 @@
+---
+id: computed
+title: 计算值
+sidebar_label: 计算值
+---
+
+# 计算值
+
+在 openInula 2(zouyu)中,计算值(Computed)是指依赖于其他状态变量的表达式。你只需像写普通 JS 一样声明变量,编译器会自动识别并优化这些依赖关系。
+
+## 基本用法
+
+```tsx filename="DoubleCounter.jsx"
+function DoubleCounter() {
+ let count = 0;
+ // 计算值:double 会自动随着 count 变化
+ const double = count * 2;
+
+ return (
+
+
当前计数:{count}
+
双倍值:{double}
+
count++}>增加
+
+ );
+}
+```
+
+## 多重依赖
+
+计算值可以依赖多个状态变量:
+
+```tsx filename="PriceCalculator.jsx"
+function PriceCalculator() {
+ let price = 100;
+ let quantity = 2;
+ const total = price * quantity;
+
+ return (
+
+
单价:{price}
+
数量:{quantity}
+
总价:{total}
+
quantity++}>增加数量
+
+ );
+}
+```
+
+## 嵌套计算
+
+计算值可以嵌套依赖其他计算值:
+
+```tsx filename="NestedComputed.jsx"
+function NestedComputed() {
+ let a = 1;
+ const b = a + 2;
+ const c = b * 3;
+
+ return c 的值:{c}
;
+}
+```
+
+## 最佳实践
+
+- 只需像写普通 JS 一样声明依赖关系,编译器会自动优化。
+- 避免在计算值中产生副作用(如修改外部状态)。
+- 计算值适合用于 UI 展示、派生数据等场景。
+
+## 注意事项
+
+- 计算值应为纯表达式,不要在其中执行异步操作或副作用。
+- 如果依赖的状态较多,建议提前拆分变量,提升可读性。
+
+## 下一步
+
+- 了解[监听系统](./watch)的用法
+- 学习[状态管理](./state)的更多技巧
+- 探索[组件组合](../components/composition)的高级用法
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/reactivity/state/page.mdx b/packages/website-next/src/app/docs/reactivity/state/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..dcc8478a4b95df1620ebabfb6c37b073256e84d6
--- /dev/null
+++ b/packages/website-next/src/app/docs/reactivity/state/page.mdx
@@ -0,0 +1,293 @@
+---
+id: state
+title: 状态管理
+sidebar_label: 状态管理
+---
+
+# 状态管理
+
+OpenInula 的状态管理采用直观的方式,无需特殊的 API 或 Hook,直接使用 JavaScript 变量和赋值即可。
+
+## 基础用法
+
+### 声明状态
+
+在组件中直接声明变量作为状态:
+
+```tsx filename="Counter.jsx"
+function Counter() {
+ let count = 0; // 直接声明状态
+
+ return (
+
+
计数:{count}
+
count++}>增加
+
+ );
+}
+```
+
+### 对象状态
+
+对于复杂的状态,可以使用对象:
+
+```tsx filename="UserProfile.jsx"
+function UserProfile() {
+ let user = {
+ name: '张三',
+ age: 25,
+ preferences: {
+ theme: 'dark',
+ language: 'zh'
+ }
+ };
+
+ function updateTheme(newTheme) {
+ user.preferences.theme = newTheme; // 直接修改对象属性
+ }
+
+ return (
+
+
{user.name}
+
年龄:{user.age}
+
+ 主题:{user.preferences.theme}
+ updateTheme('light')}>
+ 切换主题
+
+
+
+ );
+}
+```
+
+### 数组状态
+
+处理数组类型的状态:
+
+```tsx filename="TodoList.jsx"
+function TodoList() {
+ let todos = [
+ { id: 1, text: '学习 OpenInula', done: false },
+ { id: 2, text: '写文档', done: false }
+ ];
+
+ function addTodo(text) {
+ todos = [
+ ...todos,
+ {
+ id: todos.length + 1,
+ text,
+ done: false
+ }
+ ];
+ }
+
+ function toggleTodo(id) {
+ todos = todos.map(todo =>
+ todo.id === id
+ ? { ...todo, done: !todo.done }
+ : todo
+ );
+ }
+
+ return (
+
+
addTodo('新任务')}>
+ 添加任务
+
+
+
+ {(todo) => (
+ - toggleTodo(todo.id)}
+ style={{
+ textDecoration: todo.done ? 'line-through' : 'none'
+ }}
+ >
+ {todo.text}
+
+ )}
+
+
+
+ );
+}
+```
+
+## 状态更新
+
+### 直接赋值
+
+最简单的状态更新方式是直接赋值:
+
+```tsx filename="CounterWithMessage.jsx"
+function Counter() {
+ let count = 0;
+ let message = '';
+
+ function increment() {
+ count++; // 直接赋值
+ message = `当前计数:${count}`; // 状态之间可以互相依赖
+ }
+
+ return (
+
+ );
+}
+```
+
+### 批量更新
+
+当需要同时更新多个状态时:
+
+```tsx filename="UserForm.jsx"
+function UserForm() {
+ let formData = {
+ username: '',
+ email: '',
+ age: 0
+ };
+
+ function resetForm() {
+ // 一次性更新多个字段
+ formData = {
+ username: '',
+ email: '',
+ age: 0
+ };
+ }
+
+ function updateField(field, value) {
+ formData[field] = value; // 更新单个字段
+ }
+
+ return (
+
+ );
+}
+```
+
+## 最佳实践
+
+### 1. 状态初始化
+
+将复杂的初始状态提取为函数:
+
+```tsx filename="createInitialState.jsx"
+function createInitialState() {
+ return {
+ user: null,
+ preferences: {
+ theme: 'light',
+ language: 'zh'
+ },
+ todos: []
+ };
+}
+
+function App() {
+ let state = createInitialState();
+
+ function reset() {
+ state = createInitialState(); // 重置为初始状态
+ }
+
+ return (
+
+ {/* 使用状态 */}
+
+ );
+}
+```
+
+### 2. 状态组织
+
+对于复杂组件,建议将相关状态组织在一起:
+
+```tsx filename="ShoppingCart.jsx"
+function ShoppingCart() {
+ let cart = {
+ items: [],
+ total: 0,
+
+ addItem(product) {
+ this.items = [...this.items, product];
+ this.updateTotal();
+ },
+
+ removeItem(productId) {
+ this.items = this.items.filter(item => item.id !== productId);
+ this.updateTotal();
+ },
+
+ updateTotal() {
+ this.total = this.items.reduce((sum, item) => sum + item.price, 0);
+ }
+ };
+
+ return (
+
+
购物车 ({cart.items.length})
+
总计:¥{cart.total}
+ {/* 渲染购物车内容 */}
+
+ );
+}
+```
+
+### 3. 派生状态
+
+避免重复存储可以从现有状态计算出的值:
+
+```tsx filename="TodoApp.jsx"
+function TodoApp() {
+ let todos = [];
+
+ // 好的做法:通过计算获得派生状态
+ const completedCount = todos.filter(todo => todo.done).length;
+ const remainingCount = todos.length - completedCount;
+
+ return (
+
+
完成:{completedCount}
+
剩余:{remainingCount}
+
+ );
+}
+```
+
+## 注意事项
+
+1. 避免直接修改复杂对象的深层属性,推荐使用不可变更新模式
+2. 确保状态更新是同步的,避免在异步操作中直接修改状态
+3. 对于大型应用,考虑使用状态管理库
+4. 注意状态的作用域,避免全局状态
+
+## 下一步
+
+学习完状态管理后,你可以:
+
+1. 了解[计算值](./computed.mdx)的使用
+2. 探索[监听系统](./watch)的功能
+3. 学习[组件组合](../components/composition)的最佳实践
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/reactivity/untrack/page.mdx b/packages/website-next/src/app/docs/reactivity/untrack/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..b96f273f54dda1c76ee7ede24ac64826d59725c0
--- /dev/null
+++ b/packages/website-next/src/app/docs/reactivity/untrack/page.mdx
@@ -0,0 +1,124 @@
+---
+id: untrack
+title: untrack(非响应式访问)
+sidebar_label: untrack
+---
+
+# untrack(非响应式访问)
+
+`untrack` 是 openInula 2(zouyu)响应式系统中的一个高级工具,用于在响应式计算、watch、或其他依赖收集场景下,临时"跳出"依赖追踪,获取某个状态的当前值但不建立响应式依赖。
+
+## 作用
+
+- **避免依赖收集**:在 computed、watch、或其他响应式回调中,某些变量的读取不希望被追踪为依赖时使用。
+- **性能优化**:减少不必要的响应式更新,避免副作用函数被频繁触发。
+- **实现只读快照**:获取某一时刻的状态快照,而不关心后续变化。
+
+## 基本用法
+
+```tsx filename="Example.jsx"
+import { untrack } from 'openinula';
+
+function Example() {
+ let count = 0;
+ let log = [];
+
+ watch(() => {
+ // 只在 count 变化时触发
+ log.push(`count: ${count}, time: ${untrack(() => Date.now())}`);
+ });
+
+ return (
+
+ );
+}
+```
+
+## Demo 示例
+
+下面是一个最小可运行的 untrack 用法示例:
+
+```tsx filename="Demo.jsx"
+import { watch, untrack } from 'openinula';
+
+function Demo() {
+ let a = 0;
+ let b = 0;
+ watch(() => {
+ // 只依赖 b,a 的变化不会触发 watch
+ console.log('sum:', untrack(() => a) + b);
+ });
+ return (
+ <>
+ a++}>a: {a}
+ b++}>b: {b}
+ >
+ );
+}
+```
+点击 a 按钮不会触发 watch,点击 b 按钮会触发 watch 并输出 sum。
+
+## 在 computed 中使用
+
+```tsx filename="ComputedUntrack.jsx"
+import { untrack } from 'openinula';
+
+function ComputedUntrack() {
+ let count = 0;
+ // 只依赖 count,不依赖 Date.now()
+ const message = `当前计数:${count},时间:${untrack(() => Date.now())}`;
+
+ return {message}
;
+}
+```
+
+## 在 watch 中使用
+
+```tsx filename="WatchUntrack.jsx"
+import { untrack } from 'openinula';
+
+function WatchUntrack() {
+ let count = 0;
+ let lastTime = 0;
+
+ watch(() => {
+ // 只在 count 变化时触发
+ lastTime = untrack(() => Date.now());
+ });
+
+ return (
+
+
count++}>增加
+
上次更新时间:{lastTime}
+
+ );
+}
+```
+
+## 在响应式系统的其他场景
+
+- **避免副作用循环**:在副作用函数中读取但不追踪依赖,防止死循环。
+- **只读快照**:在复杂计算或日志记录时,获取当前值但不建立响应式关系。
+
+## 最佳实践
+
+- 仅在确实不希望建立响应式依赖时使用 `untrack`。
+- 用于性能优化、避免不必要的副作用触发。
+- 保持代码可读性,避免滥用。
+
+## 注意事项
+
+- `untrack` 只影响其回调函数内部的依赖收集。
+- 不要在 `untrack` 内部修改响应式状态,只做只读访问。
+- 滥用 `untrack` 可能导致响应式失效,需谨慎使用。
+
+## 相关链接
+
+- [计算值(computed)](./computed.mdx)
+- [监听系统(watch)](./watch)
+- [状态管理](./state.mdx)
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/reactivity/watch/page.mdx b/packages/website-next/src/app/docs/reactivity/watch/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..9e2e4eae40d1d7f1871241daa248b21edc92e853
--- /dev/null
+++ b/packages/website-next/src/app/docs/reactivity/watch/page.mdx
@@ -0,0 +1,114 @@
+---
+id: watch
+title: 监听系统
+sidebar_label: 监听系统
+---
+
+# 监听系统(watch)
+
+openInula 2(zouyu)提供了 `watch` 方法,用于监听状态或计算值的变化,并在变化时执行副作用逻辑。
+
+## 基本用法
+
+```tsx filename="FetchData.jsx"
+function FetchData({ url }) {
+ let data = null;
+
+ watch(() => {
+ fetch(url)
+ .then(res => res.json())
+ .then(_data => {
+ data = _data;
+ });
+ });
+
+ return (
+
+
+ {JSON.stringify(data, null, 2)}
+
+
+ 加载中...
+
+
+ );
+}
+```
+
+## 依赖追踪
+
+`watch` 会自动追踪其回调中用到的所有状态和计算值,只要依赖发生变化,回调就会重新执行。
+
+```tsx filename="Logger.jsx"
+function Logger() {
+ let count = 0;
+ watch(() => {
+ console.log('count 变化为:', count);
+ });
+
+ return count++}>增加;
+}
+```
+
+## 清理副作用
+
+可以在 `watch` 回调中返回一个清理函数,用于移除定时器、事件监听等副作用:
+
+```tsx filename="Timer.jsx"
+function Timer() {
+ let time = Date.now();
+
+ watch(() => {
+ const timer = setInterval(() => {
+ time = Date.now();
+ }, 1000);
+ // 返回清理函数
+ return () => clearInterval(timer);
+ });
+
+ return 当前时间:{new Date(time).toLocaleTimeString()}
;
+}
+```
+
+## 多个 watch
+
+可以在同一个组件中使用多个 `watch`,分别监听不同的状态:
+
+```tsx filename="MultiWatch.jsx"
+function MultiWatch() {
+ let a = 1;
+ let b = 2;
+
+ watch(() => {
+ console.log('a 变化:', a);
+ });
+ watch(() => {
+ console.log('b 变化:', b);
+ });
+
+ return (
+
+ a++}>a++
+ b++}>b++
+
+ );
+}
+```
+
+## 最佳实践
+
+- 只在需要副作用(如数据请求、日志、定时器等)时使用 `watch`
+- 避免在 `watch` 中直接修改依赖自身的状态,防止死循环
+- 善用清理函数,避免内存泄漏
+
+## 注意事项
+
+- `watch` 回调应为同步函数,避免直接返回 Promise
+- 清理函数只在依赖变化或组件卸载时调用
+- 不要在 `watch` 外部直接调用副作用逻辑
+
+## 下一步
+
+- 学习[状态管理](./state.mdx)的更多用法
+- 了解[计算值](./computed.mdx)的高级技巧
+- 探索[生命周期](../lifecycle/mounting)的管理
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/template-system/conditional/page.mdx b/packages/website-next/src/app/docs/template-system/conditional/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..677fc7a51a8d34b058c4c488a87aaf475c1dd08a
--- /dev/null
+++ b/packages/website-next/src/app/docs/template-system/conditional/page.mdx
@@ -0,0 +1,208 @@
+---
+id: conditional
+title: 条件渲染
+sidebar_label: 条件渲染
+---
+
+# 条件渲染
+
+OpenInula 提供了内置的条件渲染标签,使得条件渲染变得简单直观。
+
+## 基本用法
+
+### if 条件
+
+最简单的条件渲染使用 `if` 标签:
+
+```tsx filename="SimpleCondition.jsx"
+function Notification({ message }) {
+ return (
+
+ );
+}
+```
+
+### if-else 条件
+
+使用 `if` 和 `else` 标签处理两种情况:
+
+```tsx filename="IfElseCondition.jsx"
+function LoginStatus({ isLoggedIn }) {
+ return (
+
+
+ /* logout */}>退出登录
+
+
+ /* login */}>登录
+
+
+ );
+}
+```
+
+### 多重条件
+
+使用 `else-if` 处理多个条件:
+
+```tsx filename="MultipleConditions.jsx"
+function TrafficLight({ color }) {
+ return (
+
+
+ 停止
+
+
+ 注意
+
+
+ 通行
+
+
+ 信号灯故障
+
+
+ );
+}
+```
+
+## 条件表达式
+
+条件表达式可以是任何返回布尔值的表达式:
+
+```tsx filename="ComplexConditions.jsx"
+function UserProfile({ user }) {
+ return (
+
+ = 18}>
+ 成年用户
+
+
+ 高级会员
+
+
+ );
+}
+```
+
+## 嵌套条件
+
+条件标签可以嵌套使用:
+
+```tsx filename="NestedConditions.jsx"
+function ProductDisplay({ product, user }) {
+ return (
+
+
+
+ 编辑商品
+
+
+ 购买
+
+
+ 请登录后购买
+
+
+
+ 商品不存在
+
+
+ );
+}
+```
+
+## 最佳实践
+
+### 1. 提前返回
+
+对于简单的条件判断,可以使用提前返回模式:
+
+```tsx filename="EarlyReturn.jsx"
+function AdminPanel({ user }) {
+ if (!user) {
+ return 请先登录
;
+ }
+
+ if (!user.isAdmin) {
+ return 权限不足
;
+ }
+
+ return 管理员面板
;
+}
+```
+
+### 2. 条件组合
+
+对于复杂的条件逻辑,建议将条件提取为变量:
+
+```tsx filename="ComplexConditionLogic.jsx"
+function UserAccess({ user, resource }) {
+ const canView = user && user.permissions.includes('view');
+ const canEdit = canView && user.permissions.includes('edit');
+ const isOwner = resource.ownerId === user.id;
+
+ return (
+
+
+ {resource.content}
+
+ 编辑
+
+
+
+ 无访问权限
+
+
+ );
+}
+```
+
+### 3. 避免过度嵌套
+
+当条件逻辑变得复杂时,考虑将其拆分为多个组件:
+
+```tsx filename="ComponentComposition.jsx"
+function UserActions({ user, resource }) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+function ViewPermission({ user, children }) {
+ return (
+
+ {children}
+
+
+ 无访问权限
+
+ );
+}
+```
+
+## 注意事项
+
+1. 条件标签必须包含 `cond` 属性
+2. `else-if` 和 `else` 标签必须跟在 `if` 或 `else-if` 标签之后
+3. 条件表达式应该返回布尔值
+4. 避免在条件表达式中进行复杂的计算,建议提前计算并存储结果
+
+## 下一步
+
+学习完条件渲染后,你可以:
+
+1. 了解[列表渲染](../list-rendering)的使用方法
+2. 探索[事件处理](../event-handling)系统
+3. 学习[组件组合](../../components/composition)的技巧
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/template-system/event-handling/page.mdx b/packages/website-next/src/app/docs/template-system/event-handling/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..6fd5c7f64ff01df0aaf866f347a598a1a98f2071
--- /dev/null
+++ b/packages/website-next/src/app/docs/template-system/event-handling/page.mdx
@@ -0,0 +1,304 @@
+---
+id: event-handling
+title: 事件处理
+sidebar_label: 事件处理
+---
+
+# 事件处理
+
+OpenInula 提供了简单直观的事件处理机制,使用 `onXxx` 属性来绑定事件处理函数。
+
+## 基本用法
+
+### 点击事件
+
+最常用的事件处理是点击事件:
+
+```tsx filename="ClickCounter.jsx"
+function ClickCounter() {
+ let count = 0;
+
+ function handleClick() {
+ count++;
+ }
+
+ return (
+
+ 点击次数:{count}
+
+ );
+}
+```
+
+### 内联事件处理
+
+对于简单的事件处理,可以直接使用内联函数:
+
+```tsx filename="SimpleButton.jsx"
+function SimpleButton() {
+ let message = '';
+
+ return (
+
+
message = '你好!'}>
+ 打招呼
+
+
{message}
+
+ );
+}
+```
+
+## 常用事件
+
+### 表单事件
+
+处理表单输入和提交:
+
+```tsx filename="LoginForm.jsx"
+function LoginForm() {
+ let username = '';
+ let password = '';
+
+ function handleSubmit(e) {
+ e.preventDefault();
+ console.log('提交登录:', { username, password });
+ }
+
+ return (
+
+ );
+}
+```
+
+### 鼠标事件
+
+处理鼠标相关事件:
+
+```tsx filename="MouseTracker.jsx"
+function MouseTracker() {
+ let position = { x: 0, y: 0 };
+
+ return (
+ {
+ position = {
+ x: e.clientX,
+ y: e.clientY
+ };
+ }}
+ style={{ height: '200px', background: '#f0f0f0' }}
+ >
+
鼠标位置:{position.x}, {position.y}
+
+ );
+}
+```
+
+### 键盘事件
+
+处理键盘输入:
+
+```tsx filename="KeyboardInput.jsx"
+function KeyboardInput() {
+ let pressedKeys = [];
+
+ return (
+ {
+ pressedKeys = [...pressedKeys, e.key];
+ }}
+ onKeyUp={e => {
+ pressedKeys = pressedKeys.filter(key => key !== e.key);
+ }}
+ placeholder="请按键..."
+ />
+ );
+}
+```
+
+## 事件修饰符
+
+OpenInula 支持事件修饰符来简化常见的事件处理场景:
+
+```tsx filename="EventModifiers.jsx"
+function EventModifiers() {
+ return (
+
+ );
+}
+```
+
+## 自定义事件
+
+在组件间通信时,可以通过 props 传递自定义事件处理函数:
+
+```tsx filename="CustomButton.jsx"
+function CustomButton({ onClick, children }) {
+ return (
+ {
+ // 可以在这里添加自定义逻辑
+ console.log('按钮被点击');
+ onClick?.(e);
+ }}
+ >
+ {children}
+
+ );
+}
+
+function App() {
+ return (
+ console.log('处理点击')}>
+ 点击我
+
+ );
+}
+```
+
+## 最佳实践
+
+### 1. 事件处理函数命名
+
+建议使用 `handle` 前缀命名事件处理函数:
+
+```tsx filename="UserForm.jsx"
+function UserForm() {
+ let formData = {
+ name: '',
+ email: ''
+ };
+
+ function handleNameChange(e) {
+ formData.name = e.target.value;
+ }
+
+ function handleEmailChange(e) {
+ formData.email = e.target.value;
+ }
+
+ function handleSubmit(e) {
+ e.preventDefault();
+ console.log('提交表单:', formData);
+ }
+
+ return (
+
+ );
+}
+```
+
+### 2. 事件参数处理
+
+在需要传递额外参数时,使用箭头函数包装:
+
+```tsx filename="ItemList.jsx"
+function ItemList() {
+ const items = ['项目1', '项目2', '项目3'];
+
+ function handleItemClick(item, index, e) {
+ console.log('点击项目:', item, '索引:', index, '事件:', e);
+ }
+
+ return (
+
+
+ {(item, index) => (
+ - handleItemClick(item, index, e)}>
+ {item}
+
+ )}
+
+
+ );
+}
+```
+
+### 3. 性能优化
+
+对于频繁触发的事件,考虑使用节流或防抖:
+
+```tsx filename="SearchInput.jsx"
+function SearchInput() {
+ let searchTerm = '';
+ let timeoutId;
+
+ function handleInput(e) {
+ // 使用防抖处理搜索
+ clearTimeout(timeoutId);
+ timeoutId = setTimeout(() => {
+ searchTerm = e.target.value;
+ console.log('搜索:', searchTerm);
+ }, 300);
+ }
+
+ willUnmount(() => {
+ clearTimeout(timeoutId);
+ });
+
+ return (
+
+ );
+}
+```
+
+## 注意事项
+
+1. 事件处理函数中的 `this` 绑定
+2. 避免在渲染函数中创建内联函数
+3. 记得清理定时器和事件监听器
+4. 注意事件冒泡和捕获的顺序
+
+## 下一步
+
+学习完事件处理后,你可以:
+
+1. 探索[组件组合](../../components/composition)的技巧
+2. 了解[生命周期](../../lifecycle/mounting)的管理
+3. 学习[状态管理](../../reactivity/state)的最佳实践
\ No newline at end of file
diff --git a/packages/website-next/src/app/docs/template-system/list-rendering/page.mdx b/packages/website-next/src/app/docs/template-system/list-rendering/page.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..8703d13294aa533f42abe1b3eb1ffaaf559f14b7
--- /dev/null
+++ b/packages/website-next/src/app/docs/template-system/list-rendering/page.mdx
@@ -0,0 +1,257 @@
+---
+id: list-rendering
+title: 列表渲染
+sidebar_label: 列表渲染
+---
+
+# 列表渲染
+
+OpenInula 提供了内置的 `for` 标签来实现列表渲染,使得数组的遍历和渲染变得简单直观。
+
+## 基本用法
+
+### 简单列表
+
+使用 `for` 标签遍历数组:
+
+```tsx filename="FruitList.jsx"
+function FruitList() {
+ const fruits = ['苹果', '香蕉', '橙子'];
+
+ return (
+
+
+ {(fruit) => - {fruit}
}
+
+
+ );
+}
+```
+
+### 带索引的列表
+
+通过第二个参数获取索引:
+
+```tsx filename="NumberedList.jsx"
+function NumberedList() {
+ const items = ['第一项', '第二项', '第三项'];
+
+ return (
+
+
+ {(item, index) => (
+ - #{index + 1}: {item}
+ )}
+
+
+ );
+}
+```
+
+## 对象列表
+
+渲染对象数组:
+
+```tsx filename="UserTable.jsx"
+function UserList() {
+ const users = [
+ { id: 1, name: '张三', age: 25 },
+ { id: 2, name: '李四', age: 30 },
+ { id: 3, name: '王五', age: 28 }
+ ];
+
+ return (
+
+
+
+ | ID |
+ 姓名 |
+ 年龄 |
+
+
+
+
+ {(user) => (
+
+ | {user.id} |
+ {user.name} |
+ {user.age} |
+
+ )}
+
+
+
+ );
+}
+```
+
+## 列表操作
+
+### 列表过滤
+
+可以在渲染前对列表进行过滤:
+
+```tsx filename="ActiveUserList.jsx"
+function ActiveUserList() {
+ const users = [
+ { id: 1, name: '张三', active: true },
+ { id: 2, name: '李四', active: false },
+ { id: 3, name: '王五', active: true }
+ ];
+
+ const activeUsers = users.filter(user => user.active);
+
+ return (
+
+
+ {(user) => - {user.name}
}
+
+
+ );
+}
+```
+
+### 列表排序
+
+可以在渲染前对列表进行排序:
+
+```tsx filename="SortedUserList.jsx"
+function SortedUserList() {
+ const users = [
+ { id: 1, name: '张三', age: 25 },
+ { id: 2, name: '李四', age: 30 },
+ { id: 3, name: '王五', age: 28 }
+ ];
+
+ const sortedUsers = [...users].sort((a, b) => a.age - b.age);
+
+ return (
+
+
+ {(user) => (
+ - {user.name} ({user.age}岁)
+ )}
+
+
+ );
+}
+```
+
+## 嵌套列表
+
+可以嵌套使用 `for` 标签:
+
+```tsx filename="NestedList.jsx"
+function NestedList() {
+ const departments = [
+ {
+ name: '技术部',
+ teams: ['前端组', '后端组', '测试组']
+ },
+ {
+ name: '产品部',
+ teams: ['设计组', '运营组']
+ }
+ ];
+
+ return (
+
+
+ {(dept) => (
+
+
{dept.name}
+
+
+ {(team) => - {team}
}
+
+
+
+ )}
+
+
+ );
+}
+```
+
+## 最佳实践
+
+### 1. 列表项组件化
+
+对于复杂的列表项,建议将其抽取为单独的组件:
+
+```tsx filename="UserItemComponent.jsx"
+function UserItem({ user }) {
+ return (
+
+

+
+
{user.name}
+
{user.email}
+
+
+ );
+}
+
+function UserList() {
+ const users = [/* ... */];
+
+ return (
+
+
+ {(user) => }
+
+
+ );
+}
+```
+
+### 2. 列表更新优化
+
+当列表项可能发生变化时,建议使用不可变数据操作:
+
+```tsx
+function TodoList() {
+ let todos = [
+ { id: 1, text: '学习 OpenInula', done: false },
+ { id: 2, text: '写文档', done: false }
+ ];
+
+ function toggleTodo(id) {
+ todos = todos.map(todo =>
+ todo.id === id
+ ? { ...todo, done: !todo.done }
+ : todo
+ );
+ }
+
+ return (
+
+
+ {(todo) => (
+ - toggleTodo(todo.id)}
+ style={{ textDecoration: todo.done ? 'line-through' : 'none' }}
+ >
+ {todo.text}
+
+ )}
+
+
+ );
+}
+```
+
+## 注意事项
+
+1. `for` 标签必须包含 `each` 属性
+2. 回调函数必须返回 JSX 元素
+3. 对于大列表,考虑使用分页或虚拟滚动
+4. 避免在渲染函数中进行复杂计算,建议提前处理数据
+
+## 下一步
+
+学习完列表渲染后,你可以:
+
+1. 了解[事件处理](../event-handling)系统
+2. 探索[组件组合](../../components/composition)的技巧
+3. 学习[状态管理](../../reactivity/state)的最佳实践
\ No newline at end of file
diff --git a/packages/website-next/src/app/error.tsx b/packages/website-next/src/app/error.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fd91b8bc3a9aa5b85f7d594f308f0e92a4f9f57d
--- /dev/null
+++ b/packages/website-next/src/app/error.tsx
@@ -0,0 +1,16 @@
+'use client';
+
+export default function Error({ error, reset }: { error: Error; reset: () => void }) {
+ return (
+
+
出错了
+
{error.message}
+
reset()}
+ className="cursor-pointer px-4 py-2 rounded bg-white/80 dark:bg-[#23232b]/80 text-blue-600 dark:text-cyan-300 font-semibold shadow hover:bg-white dark:hover:bg-[#23232b] transition-colors animate-bounce"
+ >
+ 重试
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/examples/page.tsx b/packages/website-next/src/app/examples/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..028441bb27f4907a7c7d00e916a8b56d5996b41e
--- /dev/null
+++ b/packages/website-next/src/app/examples/page.tsx
@@ -0,0 +1,34 @@
+"use client";
+
+export default function ExamplesPage() {
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/app/globals.css b/packages/website-next/src/app/globals.css
new file mode 100644
index 0000000000000000000000000000000000000000..8734b46e06cb9d29123c60c32e1e06c54fd6f554
--- /dev/null
+++ b/packages/website-next/src/app/globals.css
@@ -0,0 +1,721 @@
+@import "tailwindcss";
+@import "tw-animate-css";
+@plugin "@tailwindcss/typography";
+
+@custom-variant dark (&:is(.dark *));
+
+*,*::before,*::after{
+ box-sizing: border-box;
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --font-sans: var(--font-geist-sans);
+ --font-mono: var(--font-geist-mono);
+ --color-sidebar-ring: var(--sidebar-ring);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar: var(--sidebar);
+ --color-chart-4: var(--chart-4);
+ --color-chart-3: var(--chart-3);
+ --color-chart-2: var(--chart-2);
+ --color-chart-1: var(--chart-1);
+ --color-ring: var(--ring);
+ --color-input: var(--input);
+ --color-border: var(--border);
+ --color-destructive: var(--destructive);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-accent: var(--accent);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-muted: var(--muted);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-secondary: var(--secondary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-primary: var(--primary);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-popover: var(--popover);
+ --color-card-foreground: var(--card-foreground);
+ --color-card: var(--card);
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --animate-meteor: meteor 5s linear infinite;
+ @keyframes meteor {
+ 0% {
+ transform: rotate(var(--angle)) translateX(0);
+ opacity: 1;
+ }
+ 70% {
+ opacity: 1;
+ }
+ 100% {
+ transform: rotate(var(--angle)) translateX(-900px);
+ opacity: 0;
+ }
+ }
+ --animate-aurora: aurora 8s ease-in-out infinite alternate
+;
+ @keyframes aurora {
+ 0% {
+ background-position: 0% 50%;
+ transform: rotate(-5deg) scale(0.9);
+ }
+ 25% {
+ background-position: 50% 100%;
+ transform: rotate(5deg) scale(1.1);
+ }
+ 50% {
+ background-position: 100% 50%;
+ transform: rotate(-3deg) scale(0.95);
+ }
+ 75% {
+ background-position: 50% 0%;
+ transform: rotate(3deg) scale(1.05);
+ }
+ 100% {
+ background-position: 0% 50%;
+ transform: rotate(-5deg) scale(0.9);
+ }
+ }}
+
+@layer components {
+ .laws-prose h1 {
+ @apply text-center;
+ }
+
+@keyframes fade-in {
+ from { opacity: 0; transform: translateY(20px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+ @keyframes fade-in-slow {
+ from { opacity: 0; }
+ to { opacity: 1; }
+ }
+ @keyframes glow {
+ 0%, 100% { text-shadow: 0 0 8px #f9a8d4, 0 0 16px #f472b6; }
+ 50% { text-shadow: 0 0 24px #f9a8d4, 0 0 32px #f472b6; }
+ }
+ .animate-fade-in { animation: fade-in 0.8s cubic-bezier(.4,0,.2,1) both; }
+ .animate-fade-in-slow { animation: fade-in-slow 1.5s 0.2s both; }
+ .animate-fade-in-bitslow { animation: fade-in-slow 0.8s 0.2s both; }
+ .animate-fade-in-fast { animation: fade-in-slow 0.2s 0.2s both; }
+ .animate-glow { animation: glow 2s infinite alternate; }
+
+ .theme-color {
+ color: #3b82f6
+ }
+
+}
+
+:root {
+ --radius: 0.625rem;
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --chart-1: oklch(0.646 0.222 41.116);
+ --chart-2: oklch(0.6 0.118 184.704);
+ --chart-3: oklch(0.398 0.07 227.392);
+ --chart-4: oklch(0.828 0.189 84.429);
+ --chart-5: oklch(0.769 0.188 70.08);
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: oklch(0.205 0 0);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
+}
+
+.dark {
+ --background: #111725;
+ --foreground: oklch(0.985 0 0);
+ --card: #111725;
+ --card-foreground: oklch(0.985 0 0);
+ --popover: #111725;
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.922 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.704 0.191 22.216);
+ --border: oklch(1 0 0 / 10%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.556 0 0);
+ --chart-1: oklch(0.488 0.243 264.376);
+ --chart-2: oklch(0.696 0.17 162.48);
+ --chart-3: oklch(0.769 0.188 70.08);
+ --chart-4: oklch(0.627 0.265 303.9);
+ --chart-5: oklch(0.645 0.246 16.439);
+ --sidebar: #111725;
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: oklch(0.488 0.243 264.376);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(1 0 0 / 10%);
+ --sidebar-ring: oklch(0.556 0 0);
+}
+
+@layer base {
+ /* 滚动条样式 */
+ ::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: rgba(156, 163, 175, 0.3);
+ border-radius: 4px;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: rgba(156, 163, 175, 0.5);
+ }
+
+ /* 深色模式滚动条 */
+ .dark ::-webkit-scrollbar-thumb {
+ background: rgba(75, 85, 99, 0.4);
+ }
+
+ .dark ::-webkit-scrollbar-thumb:hover {
+ background: rgba(75, 85, 99, 0.6);
+ }
+
+ /* Firefox 滚动条样式 */
+ * {
+ scrollbar-width: thin;
+ scrollbar-color: rgba(156, 163, 175, 0.3) transparent;
+ }
+
+ .dark * {
+ scrollbar-color: rgba(75, 85, 99, 0.4) transparent;
+ }
+}
+
+
+@layer theme{
+ /* 搜索结果中匹配文字的高亮样式 */
+ .x\:\[\&_mark\]\:text-white {
+ & mark {
+ color: var(--x-color-blue-900) !important;
+ }
+ }
+
+ /* 搜索结果中匹配文字的高亮样式 */
+ mark {
+ background: #3b82f6;
+ color: #ffffff;
+ padding: 0.125rem 0.25rem;
+ border-radius: 0.125rem;
+ font-weight: 600;
+ box-shadow: 0 1px 3px rgba(59, 130, 246, 0.3);
+ }
+
+ /* 深色模式下的高亮样式 */
+ .dark mark {
+ color: #3b82f6!important;
+ box-shadow: 0 1px 3px rgba(96, 165, 250, 0.4);
+ }
+
+ /* 搜索结果默认状态样式 */
+ .nextra-search-results a > div:first-child {
+ color: #1f2937;
+ transition: color 0.2s ease-in-out;
+ }
+
+ .dark .nextra-search-results a > div:first-child {
+ color: #f9fafb;
+ transition: color 0.2s ease-in-out;
+ }
+
+ /* 搜索结果悬停效果 */
+ .nextra-search-results a:hover > div:first-child {
+ color: #3b82f6;
+ transition: color 0.2s ease-in-out;
+ }
+
+ .dark .nextra-search-results a:hover > div:first-child {
+ color: #60a5fa;
+ transition: color 0.2s ease-in-out;
+ }
+
+ /* 搜索结果容器样式优化 */
+ .nextra-search-results {
+ border-radius: 0.5rem;
+ overflow: hidden;
+ background: rgba(255, 255, 255, 0.95);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
+ }
+
+ .dark .nextra-search-results {
+ background: rgba(17, 24, 39, 0.95);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.1);
+ }
+
+ /* 搜索结果项样式 */
+ .nextra-search-results a {
+ transition: all 0.2s ease-in-out;
+ color: #1f2937;
+ background: rgba(255, 255, 255, 0.8);
+ }
+
+ .dark .nextra-search-results a {
+ color: #f9fafb;
+ background: rgba(17, 24, 39, 0.8);
+ }
+
+ /* 搜索结果小字样式增强 */
+ .nextra-search-results a div:not(:first-child) {
+ color: #4b5563 !important;
+ font-weight: 500;
+ }
+
+ .dark .nextra-search-results a div:not(:first-child) {
+ color: #d1d5db !important;
+ font-weight: 500;
+ }
+
+ /* 搜索结果描述文字 */
+ .nextra-search-results a p,
+ .nextra-search-results a span {
+ color: #6b7280 !important;
+ font-weight: 400;
+ }
+
+ .dark .nextra-search-results a p,
+ .dark .nextra-search-results a span {
+ color: #9ca3af !important;
+ font-weight: 400;
+ }
+
+ .nextra-search-results a:hover {
+ background-color: #F2F2F2 !important;
+ transform: translateY(-1px);
+ }
+
+ .dark .nextra-search-results a:hover {
+ background-color: rgba(55, 65, 81, 0.9) !important;
+ }
+
+ /* 悬停时文字颜色增强 */
+ .nextra-search-results a:hover div:not(:first-child) {
+ color: #374151 !important;
+ }
+
+ .dark .nextra-search-results a:hover div:not(:first-child) {
+ color: #e5e7eb !important;
+ }
+
+ .nextra-search-results a:hover p,
+ .nextra-search-results a:hover span {
+ color: #4b5563 !important;
+ }
+
+ .dark .nextra-search-results a:hover p,
+ .dark .nextra-search-results a:hover span {
+ color: #d1d5db !important;
+ }
+
+ /* Nextra 导航元素当前选中状态的蓝色文字样式 */
+ /* 匹配 Nextra 侧边栏导航的当前页面链接 */
+ li.active a,
+ a[href="/docs/components/composition"].x\:bg-primary-100.x\:font-semibold.x\:text-primary-800.x\:dark\:bg-primary-400\/10.x\:dark\:text-primary-600.x\:contrast-more\:border-primary-500\! {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark li.active a,
+ .dark a[href="/docs/components/composition"].x\:bg-primary-100.x\:font-semibold.x\:text-primary-800.x\:dark\:bg-primary-400\/10.x\:dark\:text-primary-600.x\:contrast-more\:border-primary-500\! {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 更通用的选择器,匹配所有 Nextra 导航链接 */
+ .nextra-sidebar-container li.active a,
+ .nextra-sidebar-container a.x\:bg-primary-100.x\:font-semibold.x\:text-primary-800.x\:dark\:bg-primary-400\/10.x\:dark\:text-primary-600.x\:contrast-more\:border-primary-500\! {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-sidebar-container li.active a,
+ .dark .nextra-sidebar-container a.x\:bg-primary-100.x\:font-semibold.x\:text-primary-800.x\:dark\:bg-primary-400\/10.x\:dark\:text-primary-600.x\:contrast-more\:border-primary-500\! {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* Nextra 右侧目录导航(TOC)的蓝色文字样式 */
+ .nextra-toc a[href^="#"] {
+ color: #6b7280 !important;
+ transition: color 0.2s ease-in-out !important;
+ }
+
+ .nextra-toc a[href^="#"]:hover {
+ color: #006bff !important;
+ }
+
+ .dark .nextra-toc a[href^="#"] {
+ color: #9ca3af !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:hover {
+ color: #60a5fa !important;
+ }
+
+ /* 当前激活的目录项 - 使用更通用的选择器 */
+ .nextra-toc a[href^="#"].active,
+ .nextra-toc a[href^="#"][aria-current="true"],
+ .nextra-toc a[href^="#"].x\:text-primary-600,
+ .nextra-toc a[href^="#"].x\:dark\:text-primary-400 {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"].active,
+ .dark .nextra-toc a[href^="#"][aria-current="true"],
+ .dark .nextra-toc a[href^="#"].x\:text-primary-600,
+ .dark .nextra-toc a[href^="#"].x\:dark\:text-primary-400 {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 更通用的TOC激活状态选择器 */
+ .nextra-toc a[href^="#"]:has(+ .x\:text-primary-600),
+ .nextra-toc a[href^="#"]:has(+ .x\:dark\:text-primary-400),
+ .nextra-toc a[href^="#"]:has(+ .x\:bg-primary-100),
+ .nextra-toc a[href^="#"]:has(+ .x\:dark\:bg-primary-400\/10) {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:has(+ .x\:text-primary-600),
+ .dark .nextra-toc a[href^="#"]:has(+ .x\:dark\:text-primary-400),
+ .dark .nextra-toc a[href^="#"]:has(+ .x\:bg-primary-100),
+ .dark .nextra-toc a[href^="#"]:has(+ .x\:dark\:bg-primary-400\/10) {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 直接针对Nextra的TOC激活状态类名 */
+ .nextra-toc .x\:text-primary-600,
+ .nextra-toc .x\:dark\:text-primary-400 {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc .x\:text-primary-600,
+ .dark .nextra-toc .x\:dark\:text-primary-400 {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 针对Nextra TOC的所有可能的激活状态选择器 */
+ .nextra-toc a[href^="#"]:is(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10),
+ .nextra-toc a[href^="#"]:where(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10) {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:is(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10),
+ .dark .nextra-toc a[href^="#"]:where(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10) {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 使用属性选择器匹配所有可能的激活状态 */
+ .nextra-toc a[href^="#"]:not([class*="text-gray"]):not([class*="text-muted"]) {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:not([class*="text-gray"]):not([class*="text-muted"]) {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 强制覆盖Nextra TOC的激活状态样式 */
+ .nextra-toc a[href^="#"]:is([class*="primary"], [class*="active"], [class*="current"]) {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:is([class*="primary"], [class*="active"], [class*="current"]) {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* 使用更高优先级的选择器 */
+ .nextra-toc a[href^="#"]:is(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10, .active, [aria-current="true"]) {
+ color: #006bff !important;
+ font-weight: 600 !important;
+ }
+
+ .dark .nextra-toc a[href^="#"]:is(.x\:text-primary-600, .x\:dark\:text-primary-400, .x\:bg-primary-100, .x\:dark\:bg-primary-400\/10, .active, [aria-current="true"]) {
+ color: #60a5fa !important;
+ font-weight: 600 !important;
+ }
+
+ /* Antd 组件深色模式样式 */
+ .dark .ant-select-dropdown {
+ background-color: #1e293b !important;
+ border-color: #334155 !important;
+ }
+
+ .dark .ant-select-item {
+ color: #f8fafc !important;
+ }
+
+ .dark .ant-select-item:hover {
+ background-color: #334155 !important;
+ }
+
+ .dark .ant-select-item-option-selected {
+ background-color: #3b82f6 !important;
+ color: #ffffff !important;
+ }
+
+ .dark .ant-select-item-option-active {
+ background-color: #334155 !important;
+ }
+
+ /* 页面加载时的主题切换动画 */
+ .theme-transition {
+ transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
+ }
+
+ /* 为特定元素添加更精细的过渡控制 */
+ .smooth-transition {
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ }
+
+ /* 卡片悬停效果 */
+ .card-hover {
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ }
+
+ .card-hover:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
+ }
+
+ .dark .card-hover:hover {
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.1);
+ }
+
+ /* 链接悬停效果 */
+ a {
+ transition: color 0.3s ease, text-decoration 0.3s ease;
+ }
+
+ /* 输入框焦点效果 */
+ input:focus, textarea:focus, select:focus {
+ outline: none;
+ ring: 2px;
+ ring-color: #3b82f6;
+ border-color: #3b82f6;
+ transition: all 0.3s ease;
+ }
+
+ .dark input:focus, .dark textarea:focus, .dark select:focus {
+ ring-color: #60a5fa;
+ border-color: #60a5fa;
+ }
+
+ /* Playground 页面代码块样式 */
+ .hljs {
+ background: #f6f8fa !important;
+ color: #24292f !important;
+ }
+
+ .hljs-comment,
+ .hljs-quote {
+ color: #6a737d !important;
+ font-style: italic;
+ }
+
+ .hljs-keyword,
+ .hljs-selector-tag,
+ .hljs-subst {
+ color: #d73a49 !important;
+ }
+
+ .hljs-number,
+ .hljs-literal,
+ .hljs-variable,
+ .hljs-template-variable,
+ .hljs-tag .hljs-attr {
+ color: #005cc5 !important;
+ }
+
+ .hljs-string,
+ .hljs-doctag {
+ color: #032f62 !important;
+ }
+
+ .hljs-title,
+ .hljs-section,
+ .hljs-selector-id {
+ color: #6f42c1 !important;
+ }
+
+ .hljs-type,
+ .hljs-class .hljs-title {
+ color: #e36209 !important;
+ }
+
+ .hljs-tag,
+ .hljs-name,
+ .hljs-attribute {
+ color: #22863a !important;
+ }
+
+ .hljs-regexp,
+ .hljs-link {
+ color: #032f62 !important;
+ }
+
+ .hljs-symbol,
+ .hljs-bullet {
+ color: #e36209 !important;
+ }
+
+ .hljs-built_in,
+ .hljs-builtin-name {
+ color: #005cc5 !important;
+ }
+
+ .hljs-meta {
+ color: #6a737d !important;
+ }
+
+ .hljs-deletion {
+ background: #ffeef0 !important;
+ }
+
+ .hljs-addition {
+ background: #f0fff4 !important;
+ }
+
+ .hljs-emphasis {
+ font-style: italic;
+ }
+
+ .hljs-strong {
+ font-weight: bold;
+ }
+
+ /* Playground 页面代码块深色模式样式 */
+ .dark .hljs {
+ background: #0d1117 !important;
+ color: #e6edf3 !important;
+ }
+
+ .dark .hljs-comment,
+ .dark .hljs-quote {
+ color: #7d8590 !important;
+ font-style: italic;
+ }
+
+ .dark .hljs-keyword,
+ .dark .hljs-selector-tag,
+ .dark .hljs-subst {
+ color: #ff7b72 !important;
+ }
+
+ .dark .hljs-number,
+ .dark .hljs-literal,
+ .dark .hljs-variable,
+ .dark .hljs-template-variable,
+ .dark .hljs-tag .hljs-attr {
+ color: #79c0ff !important;
+ }
+
+ .dark .hljs-string,
+ .dark .hljs-doctag {
+ color: #a5d6ff !important;
+ }
+
+ .dark .hljs-title,
+ .dark .hljs-section,
+ .dark .hljs-selector-id {
+ color: #d2a8ff !important;
+ }
+
+ .dark .hljs-type,
+ .dark .hljs-class .hljs-title {
+ color: #ffa657 !important;
+ }
+
+ .dark .hljs-tag,
+ .dark .hljs-name,
+ .dark .hljs-attribute {
+ color: #7ee787 !important;
+ }
+
+ .dark .hljs-regexp,
+ .dark .hljs-link {
+ color: #a5d6ff !important;
+ }
+
+ .dark .hljs-symbol,
+ .dark .hljs-bullet {
+ color: #f85149 !important;
+ }
+
+ .dark .hljs-built_in,
+ .dark .hljs-builtin-name {
+ color: #ffa657 !important;
+ }
+
+ .dark .hljs-meta {
+ color: #7d8590 !important;
+ }
+
+ .dark .hljs-deletion {
+ background: #490202 !important;
+ }
+
+ .dark .hljs-addition {
+ background: #033a16 !important;
+ }
+
+ .dark .hljs-emphasis {
+ font-style: italic;
+ }
+
+ .dark .hljs-strong {
+ font-weight: bold;
+ }
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/information/LoadMoreSection.tsx b/packages/website-next/src/app/information/LoadMoreSection.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6e79bd142033790396c5282adf84f266bf73ad5f
--- /dev/null
+++ b/packages/website-next/src/app/information/LoadMoreSection.tsx
@@ -0,0 +1,45 @@
+import { useState } from "react";
+import type {LoadMoreSectionProps} from "../../../index";
+
+export default function LoadMoreSection({
+ title,
+ items,
+ renderItem,
+ initialCount = 4,
+ step = 6,
+}: LoadMoreSectionProps) {
+ const [visibleCount, setVisibleCount] = useState(initialCount);
+
+ const canPaginate = items.length > initialCount;
+ const isCollapsed = visibleCount < items.length;
+
+ return (
+
+ {title}
+
+ {items.slice(0, visibleCount).map(renderItem)}
+
+ {canPaginate && (
+
+ {isCollapsed ? (
+ setVisibleCount(c => Math.min(c + step, items.length))}
+ className="px-4 py-2 rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors text-sm"
+ >
+ 查看更多
+
+ ) : (
+ setVisibleCount(initialCount)}
+ className="px-4 py-2 rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors text-sm"
+ >
+ 收起
+
+ )}
+
+ )}
+
+ );
+}
+
+
diff --git a/packages/website-next/src/app/information/activity/[slug]/page.tsx b/packages/website-next/src/app/information/activity/[slug]/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..995417d4fb8daad4388846674b116168e4a2cc0e
--- /dev/null
+++ b/packages/website-next/src/app/information/activity/[slug]/page.tsx
@@ -0,0 +1,48 @@
+import React from "react";
+import MDXDetailPage from "@/components/MDXDetailPage";
+
+const DOC_BASE =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/doc/";
+const ACTIVITY_API =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/activityData.json";
+
+interface ActivityParams {
+ slug: string;
+}
+
+interface ActivityItem {
+ key: string | number;
+}
+
+async function fetchActivityMd(slug: string) {
+ const url = `${DOC_BASE}activity${slug}.md`;
+ const res = await fetch(url, { cache: "no-store" });
+ if (!res.ok) return null;
+ return res.text();
+}
+
+async function fetchActivityItem(slug: string) {
+ const res = await fetch(ACTIVITY_API, { cache: "no-store" });
+ if (!res.ok) return null;
+ const list = await res.json();
+ return list.find((a: ActivityItem) => String(a.key) === String(slug)) || null;
+}
+
+export default async function ActivityPage({
+ params,
+}: {
+ params: Promise;
+}) {
+ const resolvedParams = await params;
+ const mdContent = await fetchActivityMd(resolvedParams.slug);
+
+ if (!mdContent) {
+ return (
+
+ 活动正文加载失败
+
+ );
+ }
+
+ return ;
+}
diff --git a/packages/website-next/src/app/information/news/[slug]/page.tsx b/packages/website-next/src/app/information/news/[slug]/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d59cbbd20d33edf490d300fe407115527e42664b
--- /dev/null
+++ b/packages/website-next/src/app/information/news/[slug]/page.tsx
@@ -0,0 +1,48 @@
+import React from "react";
+import MDXDetailPage from "@/components/MDXDetailPage";
+
+const DOC_BASE =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/doc/";
+const NEWS_API =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/newsData.json";
+
+interface NewsParams {
+ slug: string;
+}
+
+interface NewsItem {
+ key: string | number;
+}
+
+async function fetchNewsMd(slug: string) {
+ const url = `${DOC_BASE}news${slug}.md`;
+ const res = await fetch(url, { cache: "no-store" });
+ if (!res.ok) return null;
+ return res.text();
+}
+
+async function fetchNewsItem(slug: string) {
+ const res = await fetch(NEWS_API, { cache: "no-store" });
+ if (!res.ok) return null;
+ const list = await res.json();
+ return list.find((n: NewsItem) => String(n.key) === String(slug)) || null;
+}
+
+export default async function NewsPage({
+ params,
+}: {
+ params: Promise;
+}) {
+ const resolvedParams = await params;
+ const mdContent = await fetchNewsMd(resolvedParams.slug);
+
+ if (!mdContent) {
+ return (
+
+ 博客正文加载失败
+
+ );
+ }
+
+ return ;
+}
diff --git a/packages/website-next/src/app/information/page.tsx b/packages/website-next/src/app/information/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bc4ff6efbc42b88e2effb8c657a2103073f67e18
--- /dev/null
+++ b/packages/website-next/src/app/information/page.tsx
@@ -0,0 +1,101 @@
+"use client"
+
+import {useEffect, useState} from "react";
+import Image from "next/image";
+import LoadMoreSection from "./LoadMoreSection";
+import { ActivityItem, NewsItem } from "@/../index";
+import Link from "next/link";
+
+export default function InformationPage() {
+ const [newsList, setNewsList] = useState([]);
+ const [activityList, setActivityList] = useState([]);
+
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ fetch('https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/newsData.json')
+ .then(res => res.json())
+ .then(res => res.sort((a: NewsItem, b: NewsItem) => new Date(b.time).getTime() - new Date(a.time).getTime()))
+ .then(res => setNewsList(res));
+ fetch('https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/activityData.json')
+ .then(res => res.json())
+ .then(res => res.sort((a: ActivityItem, b: ActivityItem) => new Date(b.beginTime).getTime() - new Date(a.beginTime).getTime()))
+ .then(res => setActivityList(res));
+ }, []);
+ console.log(newsList, activityList);
+
+ const renderNewsItem = (item: NewsItem) => (
+
+
+
+
+
+
+ {item.title}
+
+
+ {item.introduce}
+
+
+
+ {item.time}
+
+
+
+
+ );
+
+ const renderActivityItem = (item: ActivityItem) => (
+
+
+
+
+
+
+ {item.name}
+
+
+ {item.introduce}
+
+
+ {item.beginTime} - {item.endTime}
+ {item.type}
+
+
+
+ );
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/laws/page.tsx b/packages/website-next/src/app/laws/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ceb9ce1603896bd4ec08311871e6e1b22ac873e0
--- /dev/null
+++ b/packages/website-next/src/app/laws/page.tsx
@@ -0,0 +1,7 @@
+import MarkdownPage from "@/components/MarkdownPage";
+
+const LAWS_MD_URL = "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/doc/laws.md";
+
+export default function LawsPage() {
+ return ;
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/layout.tsx b/packages/website-next/src/app/layout.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4403eb9cb43866189825edd470b94d9ba60cb501
--- /dev/null
+++ b/packages/website-next/src/app/layout.tsx
@@ -0,0 +1,41 @@
+import type { Metadata } from "next";
+import localFont from "next/font/local";
+import "./globals.css";
+import Nav from "@/components/HomePage/Nav";
+import Footer from "@/components/HomePage/Footer";
+import ThemeScript from "@/components/HomePage/NavComponents/ThemeSwitch/ThemeScript";
+import 'nextra-theme-docs/style.css'
+
+const myFont = localFont({
+ src: '../../public/font/geist-v3-latin-regular.woff2',
+})
+
+export const metadata: Metadata = {
+ title: "OpenInula",
+ description: "OpenInula官方网站,openInula 提供两套开发API、六款常用组件,助力您高质高效开发。 响应式API. openInula提供响应式API 2.0,相比传统虚拟DOM方式,提升渲染效率30%以上。",
+ icons: {
+ icon: "/favicon.ico",
+ },
+};
+
+export default async function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+ OpenInula
+
+
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/loading.tsx b/packages/website-next/src/app/loading.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a65f33b921722240b319072115a8b2ca2041d5bf
--- /dev/null
+++ b/packages/website-next/src/app/loading.tsx
@@ -0,0 +1,102 @@
+"use client";
+
+export default function Loading() {
+ return (
+
+ {/* 主容器 */}
+
+ {/* SpinKit 折叠立方体动画 */}
+
+
+ {/* 加载文字 */}
+
+
+ 加载中...
+
+
+ 正在为您准备最佳体验
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/not-found.tsx b/packages/website-next/src/app/not-found.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..38a9f3bbfb4607fa6a1b57eafea2e5bfb53532a4
--- /dev/null
+++ b/packages/website-next/src/app/not-found.tsx
@@ -0,0 +1,28 @@
+"use client";
+
+import Link from "next/link";
+import { useEffect } from "react";
+
+export default function NotFound() {
+ useEffect(() => {
+ // 添加类名来隐藏页脚
+ document.body.classList.add('hide-footer');
+
+ // 组件卸载时移除类名
+ return () => {
+ document.body.classList.remove('hide-footer');
+ };
+ }, []);
+
+ return (
+
+
404 - 未找到页面
+
你访问的页面不存在或已被移除。
+
+
+ 返回首页
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/page.tsx b/packages/website-next/src/app/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..70cc9030ec04ab82d26c9055ac4988a897287de7
--- /dev/null
+++ b/packages/website-next/src/app/page.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import dynamic from "next/dynamic";
+
+const Main = dynamic(() => import("@/components/HomePage/Main"))
+const ApiComparison = dynamic(() => import("@/components/HomePage/ApiComparison"))
+const FeatureCard = dynamic(() => import("@/components/HomePage/FeatureCard"))
+const PerformanceComparison = dynamic(() => import("@/components/HomePage/PerformanceComparison"))
+const Activity = dynamic(() => import("@/components/HomePage/ActivityArea/Activity"))
+
+export default function Home() {
+ return (
+
+ {/* 局部渐变背景 */}
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/[slug]/page.tsx b/packages/website-next/src/app/playground/[slug]/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5c9655f53a9102990e07947996c66e5a92afc5e9
--- /dev/null
+++ b/packages/website-next/src/app/playground/[slug]/page.tsx
@@ -0,0 +1,51 @@
+"use client";
+
+import React, { useState, useEffect, useMemo, useCallback } from "react";
+import { useParams, useRouter } from "next/navigation";
+import PlaygroundSidebar from "../components/PlaygroundSidebar";
+import PlaygroundContent from "../components/PlaygroundContent";
+import TeachContent from "../components/TeachContent";
+import { PlaygroundItem } from "../../../../index";
+import { playgroundData } from "../data/playgroundData";
+
+export default function PlaygroundSlugPage() {
+ const params = useParams();
+ const router = useRouter();
+ const [selectedItem, setSelectedItem] = useState(null);
+ const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);
+
+ useEffect(() => {
+ const slug = params.slug as string;
+ const item = playgroundData.find((item) => item.slug === slug);
+
+ if (item) {
+ setSelectedItem(item);
+ } else {
+ // 如果找不到对应的项目,重定向到第一个教程
+ router.push("/playground/basic");
+ }
+ }, [params.slug, router]);
+
+ const toggleSidebar = useCallback(() => {
+ setIsSidebarCollapsed(!isSidebarCollapsed);
+ }, [isSidebarCollapsed]);
+
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/CodeCard.tsx b/packages/website-next/src/app/playground/components/CodeCard.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..263da7ba2716a00b0a89d0e4674fc22d241ddd40
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/CodeCard.tsx
@@ -0,0 +1,29 @@
+import React from "react";
+
+interface CodeCardProps {
+ title: string;
+ subtitle?: string;
+ code: string;
+}
+
+export default function CodeCard({ title, subtitle, code }: CodeCardProps) {
+ return (
+
+
+
+ {title}
+
+ {subtitle ? (
+
+ {subtitle}
+
+ ) : null}
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/CodeSection.tsx b/packages/website-next/src/app/playground/components/CodeSection.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f46153b7c9a6510fbedded8bf52136c78eb28ef1
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/CodeSection.tsx
@@ -0,0 +1,94 @@
+import React from "react";
+
+type Variant =
+ | "blue"
+ | "amber"
+ | "purple"
+ | "green"
+ | "yellow"
+ | "red"
+ | "gray";
+
+interface CodeSectionProps {
+ title: string;
+ description?: string;
+ code: string;
+ variant?: Variant;
+}
+
+const variantClasses: Record<
+ Variant,
+ {
+ wrapperBg: string;
+ titleText: string;
+ descText: string;
+ innerBorder: string;
+ }
+> = {
+ blue: {
+ wrapperBg: "bg-blue-50 dark:bg-blue-900/20",
+ titleText: "text-blue-900 dark:text-blue-100",
+ descText: "text-blue-800 dark:text-blue-200",
+ innerBorder: "border-blue-200 dark:border-blue-700",
+ },
+ amber: {
+ wrapperBg: "bg-amber-50 dark:bg-amber-900/20",
+ titleText: "text-amber-900 dark:text-amber-100",
+ descText: "text-amber-800 dark:text-amber-200",
+ innerBorder: "border-amber-200 dark:border-amber-700",
+ },
+ purple: {
+ wrapperBg: "bg-purple-50 dark:bg-purple-900/20",
+ titleText: "text-purple-900 dark:text-purple-100",
+ descText: "text-purple-800 dark:text-purple-200",
+ innerBorder: "border-purple-200 dark:border-purple-700",
+ },
+ green: {
+ wrapperBg: "bg-green-50 dark:bg-green-900/20",
+ titleText: "text-green-900 dark:text-green-100",
+ descText: "text-green-800 dark:text-green-200",
+ innerBorder: "border-green-200 dark:border-green-700",
+ },
+ yellow: {
+ wrapperBg: "bg-yellow-50 dark:bg-yellow-900/20",
+ titleText: "text-yellow-900 dark:text-yellow-100",
+ descText: "text-yellow-800 dark:text-yellow-200",
+ innerBorder: "border-yellow-200 dark:border-yellow-700",
+ },
+ red: {
+ wrapperBg: "bg-red-50 dark:bg-red-900/20",
+ titleText: "text-red-900 dark:text-red-100",
+ descText: "text-red-800 dark:text-red-200",
+ innerBorder: "border-red-200 dark:border-red-700",
+ },
+ gray: {
+ wrapperBg: "bg-gray-50 dark:bg-gray-900/20",
+ titleText: "text-gray-900 dark:text-gray-100",
+ descText: "text-gray-800 dark:text-gray-200",
+ innerBorder: "border-gray-200 dark:border-gray-700",
+ },
+};
+
+export default function CodeSection({
+ title,
+ description,
+ code,
+ variant = "blue",
+}: CodeSectionProps) {
+ const v = variantClasses[variant];
+ return (
+
+
{title}
+ {description ? (
+
{description}
+ ) : null}
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/PlaygroundContent.tsx b/packages/website-next/src/app/playground/components/PlaygroundContent.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..09488b351dc33668b8ceeac59387968ffeb46c42
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/PlaygroundContent.tsx
@@ -0,0 +1,89 @@
+import { useEffect, useRef } from "react";
+import { PlaygroundContentProps } from "../../../../index";
+
+export default function PlaygroundContent({
+ selectedItem,
+}: PlaygroundContentProps) {
+ const iframeRef = useRef(null);
+
+ useEffect(() => {
+ if (iframeRef.current && selectedItem) {
+ const currentIframe = iframeRef.current;
+
+ // 等待 iframe 加载完成后再发送消息
+ const handleLoad = () => {
+ // 添加一个小延迟,确保 iframe 完全准备就绪
+ setTimeout(() => {
+ const iframeWindow = currentIframe?.contentWindow;
+ if (iframeWindow) {
+ // 发送消息到 OpenInula 项目(只传递ID)
+ iframeWindow.postMessage(
+ { type: "SET_CODE_BY_ID", payload: selectedItem.id },
+ "http://localhost:5173" // 移除 /playground 路径
+ );
+ }
+ }, 100);
+ };
+
+ // 监听 iframe 加载完成事件
+ currentIframe.addEventListener("load", handleLoad);
+
+ // 如果 iframe 已经加载完成,立即发送消息
+ if (currentIframe.contentDocument?.readyState === "complete") {
+ handleLoad();
+ }
+
+ // 监听来自 iframe 的消息
+ const messageHandler = (event: MessageEvent) => {
+ if (event.origin === "http://localhost:5173") {
+ // 如果收到 IFRAME_READY 消息,重新发送代码ID
+ if (event.data.type === "IFRAME_READY") {
+ setTimeout(() => {
+ const iframeWindow = currentIframe?.contentWindow;
+ if (iframeWindow && selectedItem.id) {
+ iframeWindow.postMessage(
+ { type: "SET_CODE_BY_ID", payload: selectedItem.id },
+ "http://localhost:5173"
+ );
+ }
+ }, 200);
+ }
+ }
+ };
+
+ window.addEventListener("message", messageHandler);
+
+ return () => {
+ currentIframe?.removeEventListener("load", handleLoad);
+ window.removeEventListener("message", messageHandler);
+ };
+ }
+ }, [selectedItem]);
+
+ const src = selectedItem?.id
+ ? `http://localhost:5173/playground?id=${encodeURIComponent(
+ String(selectedItem.id)
+ )}`
+ : "http://localhost:5173/playground";
+
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/PlaygroundSidebar.tsx b/packages/website-next/src/app/playground/components/PlaygroundSidebar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7f5e670e66b7257e45570a1f1229513e6b2f0226
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/PlaygroundSidebar.tsx
@@ -0,0 +1,180 @@
+import React from "react";
+import Link from "next/link";
+import { ChevronLeft, ChevronRight } from "lucide-react";
+import { PlaygroundItem, PlaygroundSidebarProps } from "../../../../index";
+
+export default function PlaygroundSidebar({
+ playgroundData,
+ selectedItem,
+ isCollapsed,
+ onToggleCollapse,
+}: Readonly) {
+ // 按类别分组数据
+ const groupedData = playgroundData.reduce((acc, item) => {
+ if (!acc[item.category]) {
+ acc[item.category] = [];
+ }
+ acc[item.category].push(item);
+ return acc;
+ }, {} as Record);
+
+ // 获取所有类别
+ const categories = Object.keys(groupedData);
+
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/TeachContent.tsx b/packages/website-next/src/app/playground/components/TeachContent.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d30e58979de2c0483250d2569d6951603c1444e3
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/TeachContent.tsx
@@ -0,0 +1,126 @@
+import { useParams, useRouter } from "next/navigation";
+import { useMemo, useCallback } from "react";
+import dynamic from "next/dynamic";
+import { playgroundData } from "../data/playgroundData";
+
+const Basic = dynamic(() => import("./tutorials/Basic"));
+const Component = dynamic(() => import("./tutorials/Component"));
+const State = dynamic(() => import("./tutorials/State"));
+const Computed = dynamic(() => import("./tutorials/Computed"));
+const Watch = dynamic(() => import("./tutorials/Watch"));
+const Conditional = dynamic(() => import("./tutorials/Conditional"));
+const Lists = dynamic(() => import("./tutorials/Lists"));
+const EventHandling = dynamic(() => import("./tutorials/eventHandling"));
+const Lifecycle = dynamic(() => import("./tutorials/Lifecycle"));
+
+const tutorialMap: Record> = {
+ basic: Basic,
+ component: Component,
+ state: State,
+ computed: Computed,
+ watch: Watch,
+ conditional: Conditional,
+ lists: Lists,
+ "event-handling": EventHandling,
+ lifecycle: Lifecycle,
+};
+
+export default function TeachContent({ data = "" }: { data?: string }) {
+ const params = useParams();
+ const router = useRouter();
+ const currentSlug = (params?.slug as string) || "";
+
+ const TutorialComponent = useMemo(
+ () => tutorialMap[currentSlug],
+ [currentSlug]
+ );
+
+ const navigationData = useMemo(() => {
+ const index = playgroundData.findIndex((i) => i.slug === currentSlug);
+ const prev = index > 0 ? playgroundData[index - 1] : null;
+ const next =
+ index >= 0 && index < playgroundData.length - 1
+ ? playgroundData[index + 1]
+ : null;
+ return { index, prev, next };
+ }, [currentSlug]);
+
+ const goto = useCallback(
+ (slug?: string) => {
+ if (slug) {
+ router.push(`/playground/${slug}`);
+ }
+ },
+ [router]
+ );
+
+ if (!TutorialComponent) return 教程未找到
;
+
+ return (
+
+
+
+
+
+ {/*
+
+ 重置
+
+
+ 答案
+
+
*/}
+
+
goto(navigationData.prev?.slug)}
+ disabled={!navigationData.prev}
+ aria-label="上一节"
+ >
+
+
+
goto(navigationData.next?.slug)}
+ disabled={!navigationData.next}
+ aria-label="下一节"
+ >
+
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Basic.tsx b/packages/website-next/src/app/playground/components/tutorials/Basic.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6c0671201f1a542ab63bc6592bb888b1d50820da
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Basic.tsx
@@ -0,0 +1,64 @@
+import { ChevronRight } from "lucide-react";
+
+export default function Basic() {
+ return (
+
+ {/* 内容区域 */}
+
+ {/* 介绍部分 */}
+
+
+ 什么是 OpenInula?
+
+
+
+ 欢迎来到 OpenInula 教程!本教程将教你创建高性能 Web
+ 应用程序所需的一切。 openInula 2版本是一个现代化的 JavaScript UI
+ 开发库
+
+
+ - 无 API 哲学:只用 JSX + 原生 JS
+ - 编译优先:大部分逻辑编译期完成
+ - 响应式:自动追踪依赖,极致性能
+
+
+
+
+ {/* 快速开始 */}
+
+
+ 快速开始
+
+
+
+ 在右侧的代码编辑器中,你可以看到最基本的 OpenInula 组件示例。
+ 尝试修改代码,看看实时效果!
+
+
+ 本教程中的每节课都包含一个简单的场景,详细说明了如何利用特性实现该场景。您可以随时点击“解决方案”按钮查看完整解决方案,或点击“重置”重新开始练习。代码编辑器内配备了控制台和输出选项卡,方便您查看结果。如果您对
+ OpenInula
+ 的代码生成过程感兴趣,可以切换到Output以及Sourcemap,查看编译后的代码。
+ 祝您学习愉快!
+
+
+
+
+ {/* 下一步 */}
+
+
+ 准备好开始了吗?
+
+
+ 现在你已经了解了 OpenInula
+ 的基础概念,可以开始探索右侧的交互式代码示例了。
+ 尝试修改代码,看看会发生什么!
+
+
+
+ 继续学习下一个教程:组件
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Component.tsx b/packages/website-next/src/app/playground/components/tutorials/Component.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2db64c89e46218e3fd9d989bfa8bd8522cfb98e5
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Component.tsx
@@ -0,0 +1,90 @@
+"use client";
+
+import React, { useEffect } from "react";
+import hljs from "highlight.js";
+import "highlight.js/styles/github.css";
+import "highlight.js/styles/github-dark.css";
+
+export default function Component() {
+ useEffect(() => {
+ hljs.highlightAll();
+ }, []);
+
+ const codeImport = `import { render } from '@openinula/next';`;
+
+ const codeComponent = `import { useState, useEffect } from 'openinula';
+
+function App() {
+ return (
+ <>
+ This is a Header
+
+ >
+ );
+}`;
+
+ const codeRender = `import { render } from '@openinula/next';
+
+function App() {
+ return (
+ <>
+ This is my first component
+ >
+ );
+}
+
+render(App(), document.getElementById('app'));`;
+
+ return (
+
+
+ OpenInula 组件
+
+
+
+
+ 在构建应用程序时,你需要拆分代码以获得更好的模块化和复用性。在
+ OpenInula 中,你可以通过创建组件达到这个目的。组件仅仅是函数,会在首次
+ 渲染时执行;之后的更新由 OpenInula 的响应式系统接管。
+
+
+
+
+ 1)引入render方法
+
+
+ 他能将组件从虚拟节点转化为真是DOM,挂载到#app这个DOM元素中
+
+
+ {codeImport}
+
+
+
+
+
+ 2)渲染到页面
+
+
+ 如果你在独立页面中运行,可通过 `@openinula/next` 的 `render`
+ 进行挂载:
+
+
+ {codeRender}
+
+
+
+
+
+ 提示
+
+
+ - 组件函数只在首次渲染时调用,之后由响应式系统更新。
+ -
+ 你可以将多个组件放在同一文件,也可以拆分为多个文件之后导入使用。
+
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Computed.tsx b/packages/website-next/src/app/playground/components/tutorials/Computed.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3cb7850344bca7b843ddc9897afc766df85e0e72
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Computed.tsx
@@ -0,0 +1,306 @@
+"use client";
+
+import { ChevronRight } from "lucide-react";
+import CodeSection from "../CodeSection";
+
+export default function ComputedTutorial() {
+ return (
+ <>
+
+
+
+ 计算值
+
+
+
+ 在 OpenInula
+ 2中,计算值(Computed)是指依赖于其他状态变量的表达式。你只需像写普通
+ JS 一样声明变量,编译器会自动识别并优化这些依赖关系。
+
+
+ 计算值让响应式编程变得极其自然和直观。你不需要学习特殊的 API
+ 或记住复杂的规则,只需要按照 JavaScript
+ 的语法来编写代码,OpenInula 会自动处理依赖追踪和更新优化。
+
+
+ 这种设计让代码更加简洁、可读性更强,同时还能获得出色的性能表现。计算值会在依赖变化时自动重新计算,确保
+ UI 始终显示最新的计算结果。
+
+
+
+
+
+
+ 基础概念
+
+
+
+ 什么是计算值?
+
+
+ 计算值是基于其他状态变量自动计算得出的值。当依赖的状态发生变化时,计算值会自动重新计算,确保始终反映最新的数据状态。
+
+
+ 在 OpenInula 中,计算值就是普通的 JavaScript
+ 变量声明,编译器会智能地识别这些依赖关系,并自动建立响应式连接。
+
+
+ 这种设计让计算值既强大又简单,你不需要学习新的概念或
+ API,只需要按照 JavaScript 的思维方式来编写代码即可。
+
+
+
+
+
+
+ 基本用法
+
+
+
+
+ 简单计算值
+
+
+ 最简单的计算值就是基于单个状态变量的表达式。你只需要声明一个变量,其值依赖于其他状态变量即可。
+
+
+ 当前计数:{count}
+ 双倍值:{double}
+ count++}>增加
+
+ );
+}`}
+ />
+
+ 在这个例子中,
+
+ double
+ {" "}
+ 是一个计算值,它依赖于{" "}
+
+ count
+ {" "}
+ 变量。当{" "}
+
+ count
+ {" "}
+ 发生变化时,
+
+ double
+ {" "}
+ 会自动重新计算并更新 UI。
+
+
+
+
+
+ 自动依赖追踪
+
+
+ OpenInula
+ 的编译器会自动分析计算值中使用的变量,建立依赖关系图。你不需要手动声明依赖,框架会自动处理这一切。
+
+
+ 这种自动依赖追踪让代码更加简洁,同时还能避免手动管理依赖时可能出现的错误和遗漏。
+
+
+
+
+
+
+ 多重依赖
+
+
+
+
+ 多个状态变量
+
+
+ 计算值可以依赖多个状态变量,当其中任何一个依赖发生变化时,计算值都会重新计算。
+
+
+ 单价:{price}
+ 数量:{quantity}
+ 总价:{total}
+ quantity++}>增加数量
+
+ );
+}`}
+ />
+
+ 在这个价格计算器中,
+
+ total
+ {" "}
+ 计算值依赖于{" "}
+
+ price
+ {" "}
+ 和{" "}
+
+ quantity
+ {" "}
+ 两个变量。当其中任何一个发生变化时,总价都会自动更新。
+
+
+
+
+
+ 复杂计算逻辑
+
+
+ 计算值可以包含复杂的计算逻辑,包括条件判断、循环、函数调用等。只要这些逻辑中使用了响应式变量,计算值就会正确地追踪依赖。
+
+
+ 例如,你可以根据用户等级、商品类型、促销活动等多个因素来计算最终价格,所有这些依赖都会被自动追踪。
+
+
+
+
+
+ {/* 嵌套计算 */}
+
+
+ 嵌套计算
+
+
+
+
+ 计算值依赖计算值
+
+
+ 计算值可以依赖其他计算值,形成嵌套的依赖关系。这种设计让复杂的计算逻辑变得清晰和模块化。
+
+
c 的值:{c};
+}`}
+ />
+
+ 在这个例子中,
+
+ c
+ {" "}
+ 依赖于{" "}
+
+ b
+
+ ,而{" "}
+
+ b
+ {" "}
+ 又依赖于{" "}
+
+ a
+
+ 。当{" "}
+
+ a
+ {" "}
+ 发生变化时,
+
+ b
+ {" "}
+ 和{" "}
+
+ c
+ {" "}
+ 都会按正确的顺序重新计算。
+
+
+
+
+
+ 依赖链优化
+
+
+ OpenInula
+ 会智能地优化嵌套计算值的更新顺序,确保计算值按照正确的依赖顺序重新计算,避免不必要的重复计算。
+
+
+ 这种优化让复杂的计算逻辑既清晰又高效,你可以放心地构建复杂的计算值依赖关系。
+
+
+
+
+
+ {/* 注意事项 */}
+
+
+ 注意事项
+
+
+
+ -
+ •
+
+ 计算值应为纯表达式,不要在其中执行异步操作或副作用。异步操作应该在事件处理函数中进行。
+
+
+ -
+ •
+
+ 如果依赖的状态较多,建议提前拆分变量,提升可读性。复杂的计算逻辑可以拆分为多个简单的计算值。
+
+
+ -
+ •
+
+ 避免在计算值中进行昂贵的计算操作,如果计算成本很高,考虑使用缓存或其他优化策略。
+
+
+ -
+ •
+
+ 注意计算值的命名,使用清晰、描述性的变量名,让代码的意图更加明确。
+
+
+
+
+
+
+ {/* 下一步 */}
+
+
+ 掌握计算值了吗?
+
+
+ 现在你已经了解了 OpenInula
+ 的计算值概念和最佳实践。计算值是响应式编程的核心特性,掌握好这些概念将帮助你创建更加智能和高效的应用程序。
+
+
+
+ 继续学习其他 OpenInula 特性
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Conditional.tsx b/packages/website-next/src/app/playground/components/tutorials/Conditional.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9916d9ab1c5cfa7d7385934c1febb0c10f494532
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Conditional.tsx
@@ -0,0 +1,357 @@
+import { ChevronRight } from "lucide-react";
+import CodeSection from "../CodeSection";
+
+export default function ConditionalTutorial() {
+ return (
+ <>
+
+ {/* 介绍部分 */}
+
+
+ 条件渲染
+
+
+
+ OpenInula 提供了内置的条件渲染标签,使得条件渲染变得简单直观。
+ 与三元表达式相比,结构更清晰、层级更直观,阅读成本更低。
+
+
+ 你可以像组织普通 JSX 一样组织条件分支。if、
+ else-if和 else{" "}
+ 会按顺序进行匹配:命中即渲染,否则继续判断,最后走兜底。
+
+
+
+
+ {/* 基本用法 */}
+
+
+ 基本用法
+
+
+
+
+ if 条件
+
+
+ 典型场景是“有值就显示,没有就不渲染”。这能避免在 DOM
+ 中出现空占位, 也能让辅助信息按需出现。
+
+
+
+ {message}
+
+
+ );
+}`}
+ />
+
+ -
+ 空串、
null、false{" "}
+ 等判为假时不会渲染该节点。
+
+ - 与布局无缝融合,不需要额外 API 或包装组件。
+
+
+
+
+
+ if-else 条件
+
+
+ 适合在“互斥的两种状态”之间切换,例如登录状态、加载状态等。
+ 主路径放在 if,兜底内容放在 else。
+
+
+
+ /* logout */ {}}>退出登录
+
+
+ /* login */ {}}>登录
+
+
+ );
+}`}
+ />
+
+ 把“更常见/更重要”的路径放前面,可读性更好。
+
+
+
+
+
+ 多重条件(else-if)
+
+
+ 当状态超过两种时,使用 else-if 串联判断,最后用{" "}
+ else
+ 做兜底,确保任何未知状态都有合理反馈。
+
+
+
+ 停止
+
+
+ 注意
+
+
+ 通行
+
+
+ 信号灯故障
+
+
+ );
+}`}
+ />
+
+ - 先写最常见/最关键的分支,减少读者思维跳跃。
+ - 复杂判断可提前存入变量,避免在模板中重复计算。
+
+
+
+
+
+ 条件表达式
+
+
+ cond{" "}
+ 接受任意返回布尔的表达式,可配合可选链、取反以及与/或组合。
+ 建议保持简洁,把昂贵或冗长的逻辑上移为变量。
+
+
+ = 18}>
+ 成年用户
+
+
+ 高级会员
+
+
+ );
+}`}
+ />
+
+ 把 user?.premium、isAdult{" "}
+ 等先计算出来,模板更清爽。
+
+
+
+
+
+ 嵌套条件
+
+
+ 建议采用“先外后内”的层级:外层判断资源/可见性,内层判断权限/具体动作。
+ 超过两层时优先考虑拆分子组件。
+
+
+
+
+ 编辑商品
+
+
+ 购买
+
+
+ 请登录后购买
+
+
+
+ 商品不存在
+
+
+ );
+}`}
+ />
+
+ - 先判断“是否可展示”,再判断“能做什么”。
+ - 当嵌套过深时,用子组件承载一层逻辑,层次更清晰。
+
+
+
+
+
+ {/* 最佳实践 */}
+
+
+ 最佳实践
+
+
+
+
+ 1. 提前返回
+
+
+ 对“前置条件不满足直接结束”的场景,使用函数级提前返回,能有效减少模板中的分支嵌套,
+ 让主体渲染更聚焦。
+
+
请先登录;
+ if (!user.isAdmin) return 权限不足
;
+ return 管理员面板
;
+}`}
+ />
+
+ 减少嵌套深度,主体结构更清晰。
+
+
+
+
+
+ 2. 条件组合
+
+
+ 先用语义化的布尔变量表达复杂逻辑,再在模板中使用这些变量做条件判断;
+ 模板只负责“展示是什么”,逻辑放在上方变量。
+
+
+
+ {resource.content}
+
+ 编辑
+
+
+
+ 无访问权限
+
+
+ );
+}`}
+ />
+
+ 变量名如 canView、isOwner{" "}
+ 能直接表达业务含义。
+
+
+
+
+
+ 3. 避免过度嵌套(组件化)
+
+
+ 当分支过多或逻辑交织时,把某一整块“业务段落”抽成子组件,让每个组件只关注一个维度的条件判断,
+ 父组件负责组织与拼装。
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function ViewPermission({ user, children }) {
+ return (
+ <>
+
+ {children}
+
+
+ 无访问权限
+
+ >
+ );
+}`}
+ />
+
+ 父组件把控“展示哪些块”,子组件决定“块内如何判断”。
+
+
+
+
+
+ {/* 注意事项 */}
+
+
+ 注意事项
+
+
+
+ -
+ 条件标签必须包含
cond 属性,表达式应返回布尔值。
+
+ -
+
else-if 和 else 必须紧跟在{" "}
+ if 或 else-if 之后。
+
+ -
+ 避免在
cond{" "}
+ 中进行昂贵计算,建议提前计算为变量并复用。
+
+ -
+ 分支很多时优先考虑“分层 + 组件化”,控制嵌套深度在两层以内。
+
+
+
+
+
+ {/* 下一步 */}
+
+
+ 继续学习
+
+
+ 参考 /tutorial 文件夹下的其他组件,进一步了解更多用法。
+
+
+
+ 继续学习其他 OpenInula 特性
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Lifecycle.tsx b/packages/website-next/src/app/playground/components/tutorials/Lifecycle.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bec1de43dca8370225e8448377d2b20c1f4e7369
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Lifecycle.tsx
@@ -0,0 +1,257 @@
+"use client";
+
+import React, { useEffect } from "react";
+import hljs from "highlight.js";
+import "highlight.js/styles/github.css";
+import "highlight.js/styles/github-dark.css";
+
+export default function Lifecycle() {
+ useEffect(() => {
+ hljs.highlightAll();
+ }, []);
+
+ const codePageTitle = `function PageTitle() {
+ let title = '';
+ didMount(() => {
+ title = document.title;
+ });
+ return 页面标题:{title}
;
+}`;
+
+ const codeFetchData = `function FetchData() {
+ let data = null;
+ didMount(() => {
+ fetch('/api/data')
+ .then(res => res.json())
+ .then(d => { data = d; });
+ });
+ return {JSON.stringify(data)};
+}`;
+
+ const codeTimer = `function Timer() {
+ let timer;
+ didMount(() => {
+ timer = setInterval(() => {}, 1000);
+ });
+ willUnmount(() => clearInterval(timer));
+ // 或 didUnmount(() => clearInterval(timer));
+ return 定时器已启动
;
+}`;
+
+ const codeEventListener = `function Listener() {
+ function onResize() {}
+ didMount(() => window.addEventListener('resize', onResize));
+ willUnmount(() => window.removeEventListener('resize', onResize));
+ return 监听窗口大小
;
+}`;
+
+ const codeWatchCleanup = `function Watcher() {
+ let timer;
+ watch(() => {
+ timer = setInterval(() => {}, 1000);
+ return () => clearInterval(timer);
+ });
+ return watch 清理
;
+}`;
+
+ return (
+
+
+ OpenInula 生命周期
+
+
+
+ OpenInula
+ 的生命周期管理非常简单直观,主要通过三个钩子函数来处理组件的挂载、卸载和副作用清理。
+
+
+ 与传统的 React 不同,OpenInula
+ 提供了更简洁的生命周期钩子,让你能够轻松管理组件的副作用和清理操作。
+
+
+
+
+ {/* 挂载阶段 */}
+
+
+ 🚀 挂载阶段
+
+
+ 组件挂载时可执行副作用,如数据请求、事件监听等。OpenInula 提供
+ didMount 钩子。
+
+
+
+
+ 基本用法
+
+
+ {codePageTitle}
+
+
+
+
+
+ 数据请求
+
+
+ {codeFetchData}
+
+
+
+
+
+ 最佳实践
+
+
+ - 只在 didMount 中执行副作用
+ - 清理副作用请用 willUnmount/didUnmount
+
+
+
+
+
+ 注意事项
+
+
+ didMount 只在组件首次挂载时执行一次
+
+
+
+
+ {/* 卸载阶段 */}
+
+
+ 🗑️ 卸载阶段
+
+
+ 组件卸载时需清理副作用,防止内存泄漏。OpenInula 提供
+ willUnmount/didUnmount 钩子。
+
+
+
+
+ 基本用法
+
+
+ {codeTimer}
+
+
+
+
+
+ 副作用清理
+
+
+ - 清理定时器、事件监听、watch 副作用等
+ - 推荐所有副作用都在卸载时清理
+
+
+
+
+
+ 最佳实践
+
+
+ - 所有副作用都应在卸载时清理
+ - 推荐用 willUnmount/didUnmount
+
+
+
+
+
+ 注意事项
+
+
+ - 清理函数只在组件卸载时执行一次
+ - 避免遗留定时器、事件监听等,防止内存泄漏
+
+
+
+
+ {/* 清理操作 */}
+
+
+ 🧹 清理操作
+
+
+ 清理操作用于移除副作用,如定时器、事件监听、watch 清理函数等。
+
+
+
+
+ 定时器清理
+
+
+ {codeTimer}
+
+
+
+
+
+ 事件监听清理
+
+
+ {codeEventListener}
+
+
+
+
+
+ watch 清理函数
+
+
+ {codeWatchCleanup}
+
+
+
+
+
+ 最佳实践
+
+
+ - 所有副作用都应有清理逻辑
+ - 推荐统一在 willUnmount/didUnmount 或 watch 清理函数中处理
+
+
+
+
+
+
+ {/* 总结 */}
+
+
+ 📝 总结
+
+
+
+ OpenInula 的生命周期管理非常简单直观,主要通过三个钩子函数来处理:
+
+
+ -
+ didMount:组件挂载时执行副作用
+
+ -
+ willUnmount/didUnmount:组件卸载时清理副作用
+
+ -
+ watch 清理函数:在 watch 中直接返回清理函数
+
+
+
+ 记住:每个副作用都应该有对应的清理逻辑
+ ,这是防止内存泄漏的关键!
+
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Lists.tsx b/packages/website-next/src/app/playground/components/tutorials/Lists.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bab9a50162b08190085c47f8fe2613b3b999ef52
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Lists.tsx
@@ -0,0 +1,392 @@
+import { ChevronRight } from "lucide-react";
+import CodeSection from "../CodeSection";
+
+export default function List() {
+ return (
+ <>
+
+ {/* 介绍 */}
+
+
+ 列表渲染
+
+
+
+ OpenInula 提供了内置的 for 标签来实现列表渲染,
+ 让数组的遍历与展示更加直观、语义清晰。你只需传入要遍历的数组到
+ each 属性,并在回调中返回要渲染的 JSX 元素即可。
+
+
+ 与传统的 Array.map() 写法相比,for 标签
+ 更贴近模板语义,结构更简洁,阅读成本更低;对于初学者来说,
+ 也更容易理解“对每一项渲染一段结构”的含义。
+
+
+
+
+ {/* 基本用法 */}
+
+
+ 基本用法
+
+
+
+
+ 简单列表
+
+
+ 把要遍历的数组传入 each
+ ,回调函数的第一个参数即当前项:
+
+
+
+ {(fruit) => {fruit}}
+
+
+ );
+}`}
+ />
+
+ -
+
for 必须包含 each{" "}
+ 属性,值为待遍历数组。
+
+ - 回调函数返回一个 JSX 元素作为每一项的渲染结果。
+
+
+
+
+
+ 带索引的列表
+
+
+ 回调函数的第二个参数是索引,可用于展示编号或生成 ID:
+
+
+
+ {(item, index) => (
+ #{index + 1}: {item}
+ )}
+
+
+ );
+}`}
+ />
+
+
+
+
+ 对象列表
+
+
+ 遍历对象数组时,直接在回调中访问对象的各个字段进行渲染:
+
+
+
+
+ | ID |
+ 姓名 |
+ 年龄 |
+
+
+
+
+ {(user) => (
+
+ | {user.id} |
+ {user.name} |
+ {user.age} |
+
+ )}
+
+
+
+ );
+}`}
+ />
+
+
+
+
+ {/* 列表操作 */}
+
+
+ 列表操作
+
+
+
+
+ 列表过滤
+
+
+ 在渲染之前,先用 filter 得到需要展示的子集,
+ 模板中保持“只负责展示”的职责更清晰:
+
+
user.active);
+
+ return (
+
+
+ {(user) => - {user.name}
}
+
+
+ );
+}`}
+ />
+
+
+
+
+ 列表排序
+
+
+ 需要按特定规则展示时,复制一份数组并排序,避免原地修改:
+
+
a.age - b.age);
+
+ return (
+
+
+ {(user) => (
+ - {user.name} ({user.age}岁)
+ )}
+
+
+ );
+}`}
+ />
+
+
+
+
+ 嵌套列表
+
+
+ 列表内部可以继续使用 for,适合树状/分组数据:
+
+
+
+ {(dept) => (
+
+
{dept.name}
+
+
+ {(team) => - {team}
}
+
+
+
+ )}
+
+
+ );
+}`}
+ />
+
+
+
+
+ {/* 最佳实践 */}
+
+
+ 最佳实践
+
+
+
+
+ 1. 列表项组件化
+
+
+ 当每个列表项结构较复杂(包含多块信息、交互)时,建议抽成子组件,
+ 父组件只负责“遍历与传参”,子组件聚焦“展示与交互”。
+
+
+
+
+
{user.name}
+
{user.email}
+
+
+ );
+}
+
+function UserList() {
+ const users = [/* ... */];
+
+ return (
+
+
+ {(user) => }
+
+
+ );
+}`}
+ />
+
+ 组件化有助于复用与测试,也能降低父组件的复杂度。
+
+
+
+
+
+ 2. 列表更新优化(不可变数据)
+
+
+ 当列表项会被勾选、切换等更新时,推荐使用不可变数据方式更新,
+ 通过创建新数组触发渲染,逻辑更容易推断:
+
+
+ todo.id === id
+ ? { ...todo, done: !todo.done }
+ : todo
+ );
+ }
+
+ return (
+
+
+ {(todo) => (
+ - toggleTodo(todo.id)}
+ style={{ textDecoration: todo.done ? 'line-through' : 'none' }}
+ >
+ {todo.text}
+
+ )}
+
+
+ );
+}`}
+ />
+
+ -
+ 用
map、filter 这类返回新数组的
+ API。
+
+ -
+ 避免原地
push、splice{" "}
+ 导致状态难以追踪。
+
+
+
+
+
+
+ {/* 注意事项 */}
+
+
+ 注意事项
+
+
+
+ -
+
for 标签必须包含 each 属性。
+
+ - 回调函数必须返回 JSX 元素。
+ - 对于大列表,考虑分页或虚拟滚动以提升性能。
+ - 避免在渲染函数中进行复杂计算,建议提前处理数据。
+
+
+
+
+ {/* 下一步 */}
+
+
+ 继续学习
+
+
+ 参考 /tutorial 文件夹下的其他组件,继续探索更多
+ OpenInula 特性。
+
+
+
+ 继续学习其他 OpenInula 特性
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/State.tsx b/packages/website-next/src/app/playground/components/tutorials/State.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bf4af5cee57c1a4b0686aae471081a2662049c24
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/State.tsx
@@ -0,0 +1,265 @@
+import { ChevronRight } from "lucide-react";
+
+export default function StateTutorial() {
+ return (
+ <>
+
+ {/* 介绍部分 */}
+
+
+ 状态管理
+
+
+
+ OpenInula 的状态管理采用直观的方式,无需特殊的 API 或
+ Hook,直接使用 JavaScript
+ 变量和赋值即可。这种设计让状态管理变得简单而自然,就像编写普通的
+ JavaScript 代码一样。
+
+
+ 在传统的 React 中,你需要使用 useState、useReducer 等 Hook
+ 来管理状态。但在 OpenInula 中,你只需要声明一个普通的 JavaScript
+ 变量,框架会自动追踪这些变量的变化并更新 UI。
+
+
+
+
+ {/* 基础概念 */}
+
+
+ 基础概念
+
+
+
+ 什么是状态?
+
+
+ 状态是组件中会随时间变化的数据。在 OpenInula 中,任何 JavaScript
+ 变量都可以成为状态,包括基本类型(数字、字符串、布尔值)、对象和数组。
+
+
+ 当你修改这些变量时,OpenInula 会自动检测变化并重新渲染相关的 UI
+ 部分。这种响应式系统让你无需手动管理何时更新界面。
+
+
+
+
+ {/* 声明状态 */}
+
+
+ 声明状态
+
+
+
+ -
+
+
+ 基本类型状态
+
+
+ 最简单的状态就是基本类型。你可以在组件函数中直接声明一个变量,比如计数器、开关状态、文本内容等。这些变量在组件重新渲染时会保持其值,并且当你修改它们时会触发
+ UI 更新。
+
+
+ 例如,一个计数器组件只需要声明{" "}
+
+ let count = 0
+
+ ,然后在点击事件中直接修改{" "}
+
+ count++
+ {" "}
+ 即可。
+
+
+
+ -
+
+
+ 对象状态
+
+
+ 对于复杂的数据结构,你可以使用对象来组织状态。比如用户信息、表单数据、应用配置等。对象状态让你能够将相关的数据组织在一起,使代码更加清晰和易于维护。
+
+
+ 你可以直接修改对象的属性,OpenInula
+ 会检测到这些变化并更新相应的 UI。例如,修改用户主题只需要{" "}
+
+ user.preferences.theme = 'dark'
+
+ 。
+
+
+
+ -
+
+
+ 数组状态
+
+
+ 数组状态常用于列表数据,如待办事项、商品列表、消息记录等。OpenInula
+ 支持数组的增删改查操作,并且能够高效地更新列表 UI。
+
+
+ 推荐使用不可变更新模式来处理数组,即创建新的数组而不是修改原数组。这样可以确保状态变化的正确追踪,避免潜在的问题。
+
+
+
+
+
+
+
+ {/* 状态更新 */}
+
+
+ 状态更新
+
+
+
+ -
+
+
+ 直接赋值
+
+
+ 最简单的状态更新方式就是直接赋值。你可以使用任何 JavaScript
+ 赋值操作,包括{" "}
+
+ =
+
+ 、
+
+ +=
+
+ 、
+
+ ++
+ {" "}
+ 等。
+
+
+ 状态之间可以互相依赖,一个状态的变化可以触发另一个状态的更新。这种自然的依赖关系让状态管理变得直观和灵活。
+
+
+
+ -
+
+
+ 批量更新
+
+
+ 当需要同时更新多个相关状态时,你可以将它们组织在一个函数中。这样可以确保所有状态同时更新,避免中间状态导致的
+ UI 不一致。
+
+
+ 例如,重置表单时,你可以一次性将所有字段重置为初始值,而不是逐个更新每个字段。
+
+
+
+
+
+
+
+ {/* 最佳实践 */}
+
+
+ 最佳实践
+
+
+
+ -
+
+
+ 状态初始化
+
+
+ 对于复杂的初始状态,建议将初始化逻辑提取为独立的函数。这样做的好处是代码更清晰,初始状态可以复用,并且便于测试和维护。
+
+
+ 当需要重置状态时,可以直接调用初始化函数,确保状态回到正确的初始值。
+
+
+
+ -
+
+
+ 状态组织
+
+
+ 对于复杂组件,建议将相关的状态和方法组织在一起。可以使用对象来封装相关的状态和操作,让代码结构更清晰。
+
+
+ 例如,购物车组件可以将商品列表、总价、添加商品、删除商品等方法组织在一个对象中,形成一个完整的状态管理单元。
+
+
+
+ -
+
+
+ 派生状态
+
+
+ 避免重复存储可以从现有状态计算出的值。派生状态应该通过计算获得,而不是单独存储。这样可以避免数据不一致的问题,并且减少状态管理的复杂度。
+
+
+ 例如,待办事项的完成数量应该通过过滤已完成的待办事项来计算,而不是单独存储一个计数器。
+
+
+
+
+
+
+
+ {/* 注意事项 */}
+
+
+ 注意事项
+
+
+
+ -
+ •
+
+ 避免直接修改复杂对象的深层属性,推荐使用不可变更新模式,创建新的对象而不是修改原对象。
+
+
+ -
+ •
+
+ 确保状态更新是同步的,避免在异步操作中直接修改状态,这可能导致状态不一致的问题。
+
+
+ -
+ •
+
+ 对于大型应用,当状态管理变得复杂时,考虑使用专门的状态管理库来更好地组织和管理状态。
+
+
+ -
+ •
+
+ 注意状态的作用域,避免创建不必要的全局状态,保持状态的局部性和封装性。
+
+
+
+
+
+
+ {/* 下一步 */}
+
+
+ 掌握状态管理了吗?
+
+
+ 现在你已经了解了 OpenInula
+ 的状态管理概念和最佳实践。状态管理是构建交互式应用的核心,掌握好这些概念将帮助你创建更加健壮和可维护的应用程序。
+
+
+
+ 继续学习其他 OpenInula 特性
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/Watch.tsx b/packages/website-next/src/app/playground/components/tutorials/Watch.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4648a9bdcef00bb6e17499482f791f28927ba4c0
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/Watch.tsx
@@ -0,0 +1,290 @@
+import { ChevronRight } from "lucide-react";
+
+export default function WatchTutorial() {
+ return (
+ <>
+
+ {/* 介绍部分 */}
+
+
+ 监听系统(watch)
+
+
+
+ OpenInula 2提供了 watch
+ 方法,用于监听状态或计算值的变化,并在变化时执行副作用逻辑。这是处理数据请求、日志记录、定时器等副作用操作的核心工具。
+
+
+ 与传统的 useEffect 不同,watch
+ 会自动追踪其回调中用到的所有状态和计算值,只要依赖发生变化,回调就会重新执行。这种自动依赖追踪让副作用管理变得简单而可靠。
+
+
+
+
+ {/* 基本用法 */}
+
+
+ 基本用法
+
+
+ 使用{" "}
+
+ watch
+
+ 监听回调中用到的依赖,一旦变化即触发副作用。
+
+
+
+
+ 最简示例
+
+
+ 自动依赖追踪,无需依赖数组
+
+
+
+
+ {`import { watch } from 'openinula';
+
+watch(() => {
+ // 在这里编写副作用逻辑,例如:
+ // console.log('依赖变化了');
+});`}
+
+
+
+
+ -
+
+ 回调中用到的状态/计算值会被自动收集为依赖
+
+ -
+
+ 依赖变化时重新执行,可在回调中返回清理函数
+
+
+
+
+ 数据请求示例
+
+
+ 在右侧的代码编辑器中,你可以看到使用 watch 进行数据请求的示例。当
+ url 参数变化时,会自动重新发起请求。
+
+
+
+ {`function FetchData({ url }) {
+ let data = null;
+
+ watch(() => {
+ fetch(url)
+ .then(res => res.json())
+ .then(_data => {
+ data = _data;
+ });
+ });
+
+ return (
+
+
+ {JSON.stringify(data, null, 2)}
+
+
+ 加载中...
+
+
+ );
+}`}
+
+
+
+
+
+ {/* 依赖追踪 */}
+
+
+ 依赖追踪
+
+
+
+ watch
+ 会自动追踪其回调中用到的所有状态和计算值,只要依赖发生变化,回调就会重新执行。你无需手动指定依赖数组,OpenInula
+ 会智能地检测所有相关的响应式数据。
+
+
+
+ 自动依赖检测
+
+
+ 在下面的示例中,watch 会自动追踪 count 变量的变化:
+
+
+
+ {`function Logger() {
+ let count = 0;
+ watch(() => {
+ console.log('count 变化为:', count);
+ });
+
+ return count++}>增加;
+}`}
+
+
+
+
+
+
+ {/* 清理副作用 */}
+
+
+ 清理副作用
+
+
+
+ 可以在 watch
+ 回调中返回一个清理函数,用于移除定时器、事件监听等副作用。这有助于避免内存泄漏和重复的副作用操作。
+
+
+
+ 定时器示例
+
+
+ 下面的示例展示了如何使用清理函数来管理定时器:
+
+
+
+ {`function Timer() {
+ let time = Date.now();
+
+ watch(() => {
+ const timer = setInterval(() => {
+ time = Date.now();
+ }, 1000);
+ // 返回清理函数
+ return () => clearInterval(timer);
+ });
+
+ return 当前时间:{new Date(time).toLocaleTimeString()}
;
+}`}
+
+
+
+
+
+
+ {/* 多个 watch */}
+
+
+ 多个 watch
+
+
+
+ 可以在同一个组件中使用多个 watch,分别监听不同的状态。每个 watch
+ 都有自己独立的依赖追踪和清理逻辑。
+
+
+
+ 多状态监听
+
+
+ 下面的示例展示了如何同时监听多个不同的状态:
+
+
+
+ {`function MultiWatch() {
+ let a = 1;
+ let b = 2;
+
+ watch(() => {
+ console.log('a 变化:', a);
+ });
+ watch(() => {
+ console.log('b 变化:', b);
+ });
+
+ return (
+
+ a++}>a++
+ b++}>b++
+
+ );
+}`}
+
+
+
+
+
+
+ {/* 最佳实践 */}
+
+
+ 最佳实践
+
+
+
+
+ ✓ 使用场景
+
+
+ -
+ 只在需要副作用(如数据请求、日志、定时器等)时使用 watch
+
+ - 用于监听外部数据源的变化并同步到组件状态
+ - 处理需要清理的副作用操作
+
+
+
+
+
+ ⚠️ 避免的问题
+
+
+ - 避免在 watch 中直接修改依赖自身的状态,防止死循环
+ - 善用清理函数,避免内存泄漏
+ - 不要在 watch 外部直接调用副作用逻辑
+
+
+
+
+
+ {/* 注意事项 */}
+
+
+ 注意事项
+
+
+
+ -
+ •
+
+ watch 回调应为同步函数,避免直接返回
+ Promise。如果需要处理异步操作,在回调内部使用 async/await。
+
+
+ -
+ •
+
+ 清理函数只在依赖变化或组件卸载时调用,确保在清理函数中正确释放资源。
+
+
+ -
+ •
+
+ 避免在 watch
+ 回调中执行过于复杂的逻辑,保持回调函数的简洁和高效。
+
+
+ -
+ •
+
+ 注意 watch
+ 的执行时机,它会在依赖变化后立即执行,确保不会影响渲染性能。
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/app/playground/components/tutorials/eventHandling.tsx b/packages/website-next/src/app/playground/components/tutorials/eventHandling.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d7eec7805f14dc16f7b92b9b0a2a3e5b73a402f4
--- /dev/null
+++ b/packages/website-next/src/app/playground/components/tutorials/eventHandling.tsx
@@ -0,0 +1,159 @@
+import CodeSection from "../CodeSection";
+
+export default function EventHandling() {
+ return (
+
+ {/* 介绍 */}
+
+
+ 事件处理
+
+
+
+ OpenInula 使用 onXxx 属性绑定事件,语义直观、接近原生。
+ 常见如 onClick、onInput、
+ onSubmit 等。
+
+
+ -
+ 基本思路
+ :用事件触发函数,函数里更新状态或执行业务逻辑。
+
+ -
+ 轻量用法
+ :简单场景可用内联箭头函数;复杂场景提取为命名函数。
+
+ -
+ 修饰常见场景:
e.preventDefault(){" "}
+ 阻止默认;
+ e.stopPropagation() 阻止冒泡。
+
+
+
+
+
+
+
+ 基本用法
+
+
+ 下例展示点击与表单提交的典型处理方式,实际项目里可根据需要拆分为更小的函数:
+
+
+ 点击次数:{count};
+}`}
+ />
+
+ username = e.target.value} />
+ password = e.target.value} />
+ 登录
+
+ );
+}`}
+ />
+
+
+
+
+
+ 常见事件与要点
+
+
+
+ 表单事件:onInput/
+ onChange 更新输入值,
+ onSubmit 提交表单。注意阻止默认刷新并进行校验。
+
+
+ 鼠标事件:onMouseMove/
+ onMouseEnter 等用于跟踪位置、
+ 悬停高亮或拖拽等交互。频繁触发的事件建议配合节流/防抖。
+
+
+ 键盘事件:onKeyDown/
+ onKeyUp 可实现快捷键与输入辅助, 注意组合键判定(如{" "}
+ e.ctrlKey、e.metaKey)。
+
+
+ 事件修饰: 使用 e.preventDefault(){" "}
+ 阻止默认行为、
+ e.stopPropagation() 阻止冒泡;
+ 只有在确有需要时才调用,避免打断正常交互链路。
+
+
+ 自定义事件:通过 props 传入回调让父子组件通信,
+ 子组件内部可先做校验/埋点,再调用 props.onXxx?.(e)。
+
+
+
+
+
+
+ 最佳实践
+
+
+ -
+ 命名规范:事件函数统一以
handle{" "}
+ 前缀命名, 如 handleSubmit、
+ handleItemClick,便于全局检索与协作。
+
+ -
+ 参数传递:需要额外参数时用箭头函数包一层 (如{" "}
+
+ onClick={"{"}(e) => handleItemClick(item, index, e){"}"}
+
+ )。
+
+ -
+ 性能优化:
+ 频繁触发的事件(输入、滚动、mousemove)建议配合节流/防抖;
+ 避免在渲染中创建不必要的内联函数,重要场景下提取稳定引用。
+
+ -
+ 资源清理:
+ 使用定时器或手动注册的监听器时,确保在组件卸载时清理,避免内存泄漏。
+
+ -
+ 冒泡与捕获:
+ 了解事件传播顺序,按需在合适层级处理,减少全局拦截带来的副作用。
+
+
+
+
+ {/* 注意事项(简洁列点) */}
+
+
+ -
+ 事件函数中不要依赖不稳定的
this{" "}
+ 绑定;优先使用显式参数。
+
+ - 避免在渲染期间创建大量内联函数;必要时提取至组件内命名函数。
+ - 清理定时器与自建事件监听器;减少悬挂任务与内存泄漏风险。
+ -
+ 区分默认行为与冒泡传播;谨慎使用
preventDefault/
+ stopPropagation。
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/playground/data/playgroundData.ts b/packages/website-next/src/app/playground/data/playgroundData.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b78c201277ce33498d65aa2872bf1296768a7251
--- /dev/null
+++ b/packages/website-next/src/app/playground/data/playgroundData.ts
@@ -0,0 +1,75 @@
+import { PlaygroundItem } from "../../../../index";
+
+export const playgroundData: PlaygroundItem[] = [
+ {
+ id: 1,
+ title: "Basic",
+ description: "简单的入门教程",
+ category: "基础",
+ subcategory: "响应式系统",
+ slug: "basic",
+ },
+ {
+ id: 2,
+ title: "Component",
+ description: "组件是什么?",
+ category: "基础",
+ subcategory: "响应式系统",
+ slug: "component",
+ },
+ {
+ id: 3,
+ title: "状态",
+ description: "状态的定义与修改",
+ category: "基础",
+ subcategory: "响应式系统",
+ slug: "state",
+ },
+ {
+ id: 4,
+ title: "计算属性",
+ description: "依赖于其他状态变量的表达式",
+ category: "基础",
+ subcategory: "响应式系统",
+ slug: "computed",
+ },
+ {
+ id: 5,
+ title: "Watch",
+ description: "监听系统,监听状态或计算值变化",
+ category: "基础",
+ subcategory: "响应式系统",
+ slug: "watch",
+ },
+ {
+ id: 6,
+ title: "条件渲染",
+ description: "按条件决定是否渲染组件",
+ category: "基础",
+ subcategory: "模板系统",
+ slug: "conditional",
+ },
+ {
+ id: 7,
+ title: "列表渲染",
+ description: "使用循环对组件列表进行渲染",
+ category: "基础",
+ subcategory: "模板系统",
+ slug: "lists",
+ },
+ {
+ id: 8,
+ title: "事件处理",
+ description: "处理用户点击等事件",
+ category: "基础",
+ subcategory: "模板系统",
+ slug: "event-handling",
+ },
+ {
+ id: 9,
+ title: "生命周期",
+ description: "OpenInula的生命周期钩子",
+ category: "基础",
+ slug: "lifecycle",
+ },
+];
diff --git a/packages/website-next/src/app/playground/page.tsx b/packages/website-next/src/app/playground/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..114280b3374f808289419012c473d30dea553c41
--- /dev/null
+++ b/packages/website-next/src/app/playground/page.tsx
@@ -0,0 +1,6 @@
+import { redirect } from "next/navigation";
+
+export default function PlaygroundPage() {
+ // 直接重定向到第一个教程
+ redirect("/playground/basic");
+}
diff --git a/packages/website-next/src/app/privacy/page.tsx b/packages/website-next/src/app/privacy/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..45b238acf856ee0819adb1f1defddd4fdb01c63a
--- /dev/null
+++ b/packages/website-next/src/app/privacy/page.tsx
@@ -0,0 +1,7 @@
+import MarkdownPage from "@/components/MarkdownPage";
+
+const PRIVACY_MD_URL = "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/doc/privacy.md";
+
+export default function PrivacyPage() {
+ return ;
+}
\ No newline at end of file
diff --git a/packages/website-next/src/app/project/[slug]/page.tsx b/packages/website-next/src/app/project/[slug]/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6f5fc46d316cb79f510372121c7e38afd283f010
--- /dev/null
+++ b/packages/website-next/src/app/project/[slug]/page.tsx
@@ -0,0 +1,226 @@
+import React from "react";
+import Link from "next/link";
+import Image from "next/image";
+
+interface Course {
+ img: string;
+ index: number;
+ title: string;
+ introduce: string;
+ time: number;
+ label: string;
+ name: string;
+ avatar: string;
+ url: string;
+}
+
+const IMG_BASE =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/";
+const AVATAR_BASE =
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/";
+
+async function getCourseData(): Promise {
+ const res = await fetch(
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/courseData.json",
+ { cache: "no-store" }
+ );
+ if (!res.ok) throw new Error("无法获取课程数据");
+ return res.json();
+}
+
+function getFullImgUrl(img: string) {
+ if (!img) return "";
+ if (img.startsWith("http")) return img;
+ return IMG_BASE + img;
+}
+function getFullAvatarUrl(avatar: string) {
+ if (!avatar) return null;
+ if (avatar.startsWith("http")) return avatar;
+ return AVATAR_BASE + avatar;
+}
+
+interface ProjectParams {
+ slug: string;
+}
+
+export default async function Page({
+ params,
+}: {
+ params: Promise;
+}) {
+ const resolvedParams = await params;
+ const courses = await getCourseData();
+ const courseIndex = courses.findIndex(
+ (c) => String(c.index) === resolvedParams.slug
+ );
+ const course = courses[courseIndex];
+
+ if (!course) {
+ return (
+
+ 未找到对应课程
+
+ );
+ }
+
+ const avatarUrl = getFullAvatarUrl(course.avatar);
+ const imgUrl = getFullImgUrl(course.img);
+ const videoUrl = course.url;
+ const timeStr = course.time ? `${course.time}分钟` : "";
+
+ // 上一个/下一个课程
+ const prevCourse = courseIndex > 0 ? courses[courseIndex - 1] : null;
+ const nextCourse =
+ courseIndex < courses.length - 1 ? courses[courseIndex + 1] : null;
+
+ return (
+
+ {/* 侧边栏 */}
+
+ {/* 主内容区 */}
+
+
+ {/* 标题与标签 */}
+
+
+ {course.label}
+
+
+ {course.title}
+
+
+ {/* 讲师与时间 */}
+
+ {avatarUrl ? (
+
+ ) : (
+
+
+
+ )}
+
+ {course.name}
+
+
+ {timeStr}
+
+
+ {/* 简介 */}
+
+ {course.introduce}
+
+ {/* 视频 */}
+
+
+
+
+ {/* 底部大卡片式切换,连在一起且高度缩小 */}
+
+ {prevCourse && (
+
+
+
+
+
上一个课程
+
+ {prevCourse.title}
+
+
+ 主讲人: {prevCourse.name}
+
+
+
+ )}
+ {nextCourse && (
+
+
+
+
+
+ 下一个课程
+
+
+ {nextCourse.title}
+
+
+ 主讲人: {nextCourse.name}
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/packages/website-next/src/app/project/page.tsx b/packages/website-next/src/app/project/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a16668954fb2b5114b1fd9357be5bcf693066522
--- /dev/null
+++ b/packages/website-next/src/app/project/page.tsx
@@ -0,0 +1,179 @@
+import Link from "next/link";
+import Image from "next/image";
+
+const courses = [
+ {
+ id: 1,
+ label: "openInula",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/course.inula.1.png",
+ title: "openInula基础01-整体介绍",
+ desc: "一款支持响应式渲染的前端框架,在无缝支持React生态的基础上,新增了高性能响应式渲染API。",
+ time: "9 min",
+ teacher: "陈超涛",
+ avatar:
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/avatar1.png",
+ },
+ {
+ id: 5,
+ label: "openInula",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/course.inula.2.png",
+ title: "openInula基础02-传统API",
+ desc: "openInula的传统Hooks API,基于虚拟DOM技术。使用传统 API 可以无缝将 React 项目切换至 openInula",
+ time: "14 min",
+ teacher: "王瑜",
+ avatar: null,
+ },
+ {
+ id: 6,
+ label: "openInula",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/course.inula.3.png",
+ title: "openInula基础03-请求组件",
+ desc: "inula-request 是 openInula 生态组件,涵盖常见的网络请求方式,并提供动态轮询钩子函数给用户更便捷的定制化请求体验。",
+ time: "14 min",
+ teacher: "涂旭辉",
+ avatar: null,
+ },
+ {
+ id: 7,
+ label: "openInula",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/course.inula.4.png",
+ title: "openInula课程04-国际化组件",
+ desc: "inula-intl 是基于 openInula 生态组件,其主要提供了国际化功能,涵盖了基本的国际化组件和钩子函数,便于用户在构建国际化能力时方便操作。",
+ time: "9 min",
+ teacher: "王瑜",
+ avatar: null,
+ },
+ {
+ id: 8,
+ label: "openInula",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/course.inula.5.png",
+ title: "openInula课程05-路由",
+ desc: "inula-router 为 openInula 提供前端路由的能力,是构建大型应用必要组件,各类BrowserRouter、Switch、Route等组件与函数API。",
+ time: "8 min",
+ teacher: "黄轩",
+ avatar: null,
+ },
+ {
+ id: 2,
+ label: "低代码",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/project2.jpg",
+ title: "低代码的前世今生",
+ desc: "LowCode-Engine是阿里前端委员会与钉钉宜搭的联合杰作,使用这款引擎,用户可以便捷地定制出符合自己业务需求地低代码平台。",
+ time: "13 min",
+ teacher: "刘菊萍",
+ avatar:
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/avatar2.png",
+ },
+ {
+ id: 3,
+ label: "Taro",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/project3.jpg",
+ title: "Taro框架设计原理与演进",
+ desc: "Taro是一款开源的跨平台框架解决方案,支持React、Vue等流行框架来开发微信小程序、H5、RN等应用。",
+ time: "22 min",
+ teacher: "陈嘉健",
+ avatar:
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/avatar3.png",
+ },
+ {
+ id: 4,
+ label: "ice.js",
+ img: "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/project4.jpg",
+ title: "体验优先的ice.js研发框架",
+ desc: "飞冰是基于React打造的前端开源解决方案,围绕应用研发框架构建了全面的基础功能。",
+ time: "32 min",
+ teacher: "夏温武",
+ avatar:
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/img/avatar4.png",
+ },
+];
+
+export default function ProjectList() {
+ return (
+
+
+
+ 课程列表
+
+
+ {courses.map((course) => (
+
+
+
+
+
+ {course.label}
+
+
+
+
+ {course.title}
+
+
+ {course.desc}
+
+
+
+
+
+
+
+
+ {course.time}
+
+
+
+
+ {course.teacher}
+
+ {course.avatar ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/ActivityArea/Activity.tsx b/packages/website-next/src/components/HomePage/ActivityArea/Activity.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2910f72a91182a102b3b673e75b8a6b1143042da
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/ActivityArea/Activity.tsx
@@ -0,0 +1,161 @@
+import { useEffect, useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+
+import { ActivityProps, NewsItem, ActivityItem } from "@/../index";
+
+export default function Activity({}: ActivityProps) {
+ const [newsList, setNewsList] = useState([]);
+ const [activityList, setActivityList] = useState([]);
+ const [activeTab, setActiveTab] = useState<"news" | "activity">("news");
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ fetch(
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/newsData.json"
+ )
+ .then((res) => res.json())
+ .then((res) =>
+ res.sort(
+ (a: NewsItem, b: NewsItem) =>
+ new Date(b.time).getTime() - new Date(a.time).getTime()
+ )
+ )
+ .then((res) => setNewsList(res.slice(0, 3)));
+ fetch(
+ "https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/activityData.json"
+ )
+ .then((res) => res.json())
+ .then((res) =>
+ res.sort(
+ (a: ActivityItem, b: ActivityItem) =>
+ new Date(b.beginTime).getTime() - new Date(a.beginTime).getTime()
+ )
+ )
+ .then((res) => setActivityList(res.slice(0, 3)));
+ }, []);
+
+ const renderNewsItem = (item: NewsItem) => (
+
+
+
+
+
+
+ {item.title}
+
+
+ {item.introduce}
+
+
+
+ {item.time}
+
+
+ 阅读更多 →
+
+
+
+
+ );
+
+ const renderActivityItem = (item: ActivityItem) => (
+
+
+
+
+
+
+ {item.name}
+
+
+ {item.introduce}
+
+
+
+ 📅
+
+ {item.beginTime} - {item.endTime}
+
+
+
+ 📍
+ {item.type}
+
+
+
+
+ 了解更多 →
+
+
+
+
+ );
+
+ return (
+
+ {/* Tab 切换 */}
+
+
+ setActiveTab("news")}
+ className={`px-6 py-3 rounded-md font-medium transition-all duration-200 ${
+ activeTab === "news"
+ ? "bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm"
+ : "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white"
+ }`}
+ >
+ 新闻资讯
+
+ setActiveTab("activity")}
+ className={`px-6 py-3 rounded-md font-medium transition-all duration-200 ${
+ activeTab === "activity"
+ ? "bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm"
+ : "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white"
+ }`}
+ >
+ 活动动态
+
+
+
+
+ {/* 内容区域 */}
+
+ {activeTab === "news" ? (
+
+ {newsList.map(renderNewsItem)}
+
+ ) : (
+
+ {activityList.map(renderActivityItem)}
+
+ )}
+
+
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/ApiComparison.tsx b/packages/website-next/src/components/HomePage/ApiComparison.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..869f5d863a4a66fbd57e908dbc67200bb99506c4
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/ApiComparison.tsx
@@ -0,0 +1,87 @@
+import { CodeComparison } from "@/components/magicui/code-comparison";
+
+export default function ApiComparison() {
+ return (
+
+
+ {/* 背景装饰 */}
+
+ {/* 渐变背景 */}
+
+
+ {/* 主容器 */}
+
+ {/* 顶部装饰线 */}
+
+
+
+ ⚡️API 对比
+
+
+
+
+
+
传统 API
+
+ 频繁重渲染、虚拟DOM对比、性能损耗大,状态与UI绑定不够直接。
+
+
+
+
+
+
响应式 API
+
+ 只更新变化的DOM,无需虚拟DOM,对比开销极小,状态与UI直接响应。
+
+
+
+
+
+
+
+
+ {count}
+ Add 1
+ >
+ );
+}
+
+render(, document.getElementById('app')); // [!code --]`}
+ afterCode={`import { render } from '@openinula/next';
+function UserInput() {
+ let count = 0; // [!code focus]
+ function incrementCount() {
+ count = count + 1; // [!code focus]
+ }
+
+ return (
+ <>
+ {count}
+ Add 1
+ >
+ );
+}
+
+render(UserInput(), document.getElementById('app')); // [!code focus]`}
+ language="tsx"
+ filename="Index.tsx"
+ lightTheme="github-light"
+ darkTheme="github-dark"
+ />
+
+
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/FeatureCard.tsx b/packages/website-next/src/components/HomePage/FeatureCard.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d5a1c40b91839027dbd49a269e23389462ae338a
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/FeatureCard.tsx
@@ -0,0 +1,24 @@
+export default function FeatureCard() {
+ return (
+
+
+
响应式 API
+
+ openInula提供响应式API 2.0,相比传统虚拟DOM方式,提升渲染效率30%以上。
+
+
+
+
兼容React API
+
+ 完全兼容React API,支持React应用无缝切换至openInula。
+
+
+
+
核心组件
+
+ 包含6大常用功能组件,帮助开发者高效构筑基于openInula的前端产品。
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/Footer.tsx b/packages/website-next/src/components/HomePage/Footer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ed8a7abf2e0cf76513e74762ebc8f9ab973cef39
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/Footer.tsx
@@ -0,0 +1,163 @@
+"use client";
+
+import React, { useState, useEffect } from "react";
+import Image from "next/image";
+
+interface Partner {
+ name: string;
+ logo: string;
+ url: string;
+}
+
+export default function Footer() {
+ const [partners, setPartners] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [showQr, setShowQr] = useState(false);
+
+ useEffect(() => {
+ const fetchPartners = async () => {
+ try {
+ setLoading(true);
+ const response = await fetch('https://openinula-website.obs.ap-southeast-1.myhuaweicloud.com/data/partnerData.json');
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const data = await response.json();
+ setPartners(data);
+ } catch (err) {
+ console.error('获取合作伙伴数据失败:', err);
+ // 设置默认数据作为后备
+ setPartners([
+ { name: "openAtom", logo: "logo.openEuler.svg", url: "https://www.openatom.org/" },
+ { name: "openEuler", logo: "logo.openEuler.svg", url: "https://www.openeuler.org/zh/" },
+ { name: "openHarmony", logo: "logo.openHarmony.png", url: "https://www.openharmony.cn/" },
+ { name: "openTiny", logo: "logo.openTiny.svg", url: "https://opentiny.design/" },
+ { name: "Taro", logo: "logo.Taro.png", url: "https://taro.zone/" },
+ { name: "Alita", logo: "logo.Alita.png", url: "https://alitajs.com/" },
+ { name: "openHiTLS", logo: "logo.openHiTLS.png", url: "https://openhitls.net/zh/" },
+ { name: "openFuyao", logo: "logo.openFuyao.png", url: "https://www.openFuyao.cn/zh/" }
+ ]);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchPartners();
+ }, []);
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaButton.tsx b/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaButton.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ca95626dfb081747f8b0456391b599610407aef7
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaButton.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+
+export const WhyOpenInulaButton = () => {
+ // 触发自定义事件,通知弹窗显示
+ const handleClick = () => {
+ window.dispatchEvent(new CustomEvent("show-why-openinula-modal"));
+ };
+ return (
+
+ Why Inula?
+
+ );
+};
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaModal.tsx b/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2125e5d15741573a6d1998b1e658d829a60e9761
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/HomePageButton/WhyOpenInulaModal.tsx
@@ -0,0 +1,36 @@
+"use client";
+import React, { useEffect, useState } from "react";
+
+export const WhyOpenInulaModal = () => {
+ const [open, setOpen] = useState(false);
+
+ useEffect(() => {
+ const show = () => setOpen(true);
+ window.addEventListener("show-why-openinula-modal", show);
+ return () => window.removeEventListener("show-why-openinula-modal", show);
+ }, []);
+
+ if (!open) return null;
+
+ // 遮罩点击关闭,卡片内容阻止冒泡
+ const handleMaskClick = () => setOpen(false);
+ const stopPropagation = (e: React.MouseEvent) => e.stopPropagation();
+
+ return (
+
+
+
+
+
+
+ OpenInula 介绍视频
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/Main.tsx b/packages/website-next/src/components/HomePage/Main.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ed151854fbc45d67d647f795d22fa739fb47f2ba
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/Main.tsx
@@ -0,0 +1,119 @@
+"use client"
+
+import { Meteors } from "@/components/magicui/meteors";
+import { WhyOpenInulaButton } from "@/components/HomePage/HomePageButton/WhyOpenInulaButton";
+import { WhyOpenInulaModal } from "@/components/HomePage/HomePageButton/WhyOpenInulaModal";
+import { AuroraText } from "@/components/magicui/aurora-text";
+import { useState } from "react";
+
+export default function MeteorDemo() {
+ const [copied, setCopied] = useState(false);
+ const [isHovered, setIsHovered] = useState(false);
+
+ const handleCopy = async () => {
+ try {
+ await navigator.clipboard.writeText("npx create-inula my-app");
+ setCopied(true);
+ setTimeout(() => {
+ setCopied(false);
+ setIsHovered(false);
+ }, 2000);
+ } catch (err) {
+ console.error("复制失败:", err);
+ }
+ };
+
+ return (
+
+
+ {/*
+ OpenInula
+ */}
+ {/* AuroraText 极光渐变文本 */}
+
+ OpenInula
+
+
+ 构建用户界面的
+
+ 响应式
+
+ JavaScript库
+
+ {/* 按钮区域 */}
+
+
+
setIsHovered(true)}
+ onMouseLeave={() => !copied && setIsHovered(false)}
+ title="点击复制命令">
+
+ npx create-inula my-app
+
+ {/* 复制图标 - 悬浮时显示 */}
+ {isHovered && !copied && (
+
+ )}
+
+ {/* 成功勾号 - 复制后显示 */}
+ {copied && (
+
+ )}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/Nav.tsx b/packages/website-next/src/components/HomePage/Nav.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..227ed0125792bafa5505078017f592b53040a2bc
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/Nav.tsx
@@ -0,0 +1,142 @@
+"use client";
+
+import dynamic from "next/dynamic";
+import Image from "next/image";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { useState, useEffect } from "react";
+import DropdownMenu from "./NavComponents/DropdownMenu";
+import ThemeToggle from "@/components/HomePage/NavComponents/ThemeSwitch/ThemeToggle";
+
+// 懒加载搜索组件
+const CustomSearch = dynamic(
+ () => import("@/components/HomePage/NavComponents/CustomSearch"),
+ {
+ loading: () => Loading...
,
+ }
+);
+
+const navItems = [
+ { name: "首页", href: "/" },
+ {
+ name: "教程",
+ href: "/docs", // 默认跳转到响应式API
+ dropdown: [
+ { name: "响应式API", href: "/docs" },
+ { name: "传统API", href: "/docs/conventional/UserInstruction" },
+ { name: "交互式教程", href: "/playground/basic" },
+ ],
+ },
+ { name: "API文档", href: "/api" },
+ { name: "示例", href: "/examples" },
+ {
+ name: "生态系统",
+ href: "/resources",
+ dropdown: [
+ { name: "官方组件", href: "/api" },
+ { name: "课程", href: "/project" },
+ ],
+ },
+ { name: "资讯", href: "/information" },
+ { name: "博客", href: "/blog" },
+ {
+ name: "关于",
+ href: "/about",
+ dropdown: [
+ { name: "贡献", href: "/contribute" },
+ { name: "隐私政策", href: "/privacy" },
+ { name: "联系我们", href: "/contact" },
+ ],
+ },
+];
+
+export default function Nav() {
+ const pathname = usePathname();
+ const [hoveredItem, setHoveredItem] = useState(null);
+ const [isDark, setIsDark] = useState(false);
+
+ useEffect(() => {
+ if (typeof window === "undefined") return;
+
+ const updateDarkMode = () => {
+ setIsDark(document.documentElement.classList.contains("dark"));
+ };
+
+ updateDarkMode(); // 初始化一次
+
+ const observer = new MutationObserver(() => {
+ updateDarkMode();
+ });
+
+ observer.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ["class"], // 只观察 class 属性
+ });
+
+ return () => {
+ observer.disconnect();
+ };
+ }, []);
+
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/NavComponents/CustomSearch.tsx b/packages/website-next/src/components/HomePage/NavComponents/CustomSearch.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..eb60e8217726e977f1879eaeb321a6342a764a35
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/NavComponents/CustomSearch.tsx
@@ -0,0 +1,18 @@
+import { Search } from 'nextra/components';
+
+interface CustomSearchProps {
+ className?: string;
+}
+
+export default function CustomSearch({
+ className = ""
+}: Readonly) {
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/NavComponents/DropdownMenu.tsx b/packages/website-next/src/components/HomePage/NavComponents/DropdownMenu.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..13d2d4c3376b4e7afafd1434f31c16a733205615
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/NavComponents/DropdownMenu.tsx
@@ -0,0 +1,78 @@
+interface DropdownItem {
+ name: string;
+ href: string;
+}
+
+interface DropdownMenuProps {
+ name: string;
+ href: string;
+ dropdown: DropdownItem[];
+ isActive: boolean;
+ isHovered: boolean;
+ onMouseEnter: () => void;
+ onMouseLeave: () => void;
+}
+
+export default function DropdownMenu({
+ name,
+ dropdown,
+ isActive,
+ isHovered,
+ onMouseEnter,
+ onMouseLeave,
+}: Readonly) {
+ return (
+ <>
+ e.preventDefault()}
+ onMouseEnter={onMouseEnter}
+ onMouseLeave={onMouseLeave}
+ >
+ {name}
+
+
+
+ {/* Dropdown menu */}
+
+
+
+ >
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/NavComponents/SearchBar.tsx b/packages/website-next/src/components/HomePage/NavComponents/SearchBar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4b5f6777dab527f5462689370f60e2f952d74d0f
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/NavComponents/SearchBar.tsx
@@ -0,0 +1,49 @@
+"use client";
+import { useState } from 'react';
+import { Search } from 'lucide-react';
+
+interface SearchBarProps {
+ className?: string;
+}
+
+export default function SearchBar({ className = "" }: Readonly) {
+ const [query, setQuery] = useState('');
+ const [isFocused, setIsFocused] = useState(false);
+
+ const handleSearch = (e: React.FormEvent) => {
+ e.preventDefault();
+ if (query.trim()) {
+ // 这里可以添加搜索逻辑
+ console.log('Searching for:', query);
+ }
+ };
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeScript.tsx b/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeScript.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e4a2e4ce011e69cfffa5a30e697896c704fbf373
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeScript.tsx
@@ -0,0 +1,27 @@
+export default function ThemeScript() {
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeToggle.tsx b/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeToggle.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..ed70a8368cda2388878a0cfdcd206ef5bad9d1df
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/NavComponents/ThemeSwitch/ThemeToggle.tsx
@@ -0,0 +1,76 @@
+"use client";
+import { useState, useEffect } from "react";
+import { Sun, Moon } from "lucide-react";
+
+export default function ThemeToggle() {
+ const [isDark, setIsDark] = useState(false);
+
+ // 设置cookie的辅助函数
+ const setCookie = (name: string, value: string, days = 365) => {
+ const expires = new Date();
+ expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
+ document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;
+ };
+
+ useEffect(() => {
+ // 检查初始主题
+ const isDarkMode = document.documentElement.classList.contains("dark");
+ setIsDark(isDarkMode);
+ }, []);
+
+ const toggleTheme = () => {
+ const newTheme = !isDark;
+ setIsDark(newTheme);
+
+ if (newTheme) {
+ document.documentElement.classList.add("dark");
+ // 同时保存到cookie和localStorage
+ setCookie("theme", "dark");
+ try {
+ localStorage.setItem("theme", "dark");
+ } catch {
+ // localStorage不可用时忽略错误
+ }
+ } else {
+ document.documentElement.classList.remove("dark");
+ // 同时保存到cookie和localStorage
+ setCookie("theme", "light");
+ try {
+ localStorage.setItem("theme", "light");
+ } catch {
+ // localStorage不可用时忽略错误
+ }
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {/* 悬停时的光晕效果 */}
+
+
+ {/* 点击时的波纹效果 */}
+
+
+ );
+}
diff --git a/packages/website-next/src/components/HomePage/PerformanceComparison.tsx b/packages/website-next/src/components/HomePage/PerformanceComparison.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..09b1242ca15f022df214d0bf05468ceaa3270ae0
--- /dev/null
+++ b/packages/website-next/src/components/HomePage/PerformanceComparison.tsx
@@ -0,0 +1,165 @@
+import React, { useRef, useEffect, useState } from "react";
+import { useInView } from "react-intersection-observer";
+import gsap from "gsap";
+
+// 框架性能数据,单位越小越快
+const performanceData = [
+ { name: "Solid", value: 1.02, color: "bg-gray-200 dark:bg-[#1f2937]" },
+ /*{ name: "Svelte", value: 1.03, color: "bg-gray-200" },*/
+ { name: "Inula", value: 1.14, color: "bg-blue-500" },
+ { name: "Vue", value: 1.23, color: "bg-gray-200 dark:bg-[#1f2937]" },
+ { name: "Angular", value: 1.43, color: "bg-gray-200 dark:bg-[#1f2937]" },
+ { name: "React", value: 1.47, color: "bg-gray-200 dark:bg-[#1f2937]" },
+];
+
+const maxValue = Math.max(...performanceData.map((d) => d.value));
+
+export default function PerformanceComparison() {
+ const barsRef = useRef<(HTMLDivElement | null)[]>([]);
+ const { ref, inView } = useInView({ triggerOnce: true, threshold: 0.3 });
+ // 数字透明度state
+ const [opacities, setOpacities] = useState(performanceData.map(() => 0));
+
+ useEffect(() => {
+ if (inView) {
+ performanceData.forEach((data, i) => {
+ // 进度条动画
+ gsap.to(barsRef.current[i], {
+ width: `${(data.value / maxValue) * 100}%`,
+ duration: 1.5,
+ delay: i * 0.08 + 0.1,
+ ease: "elastic.out(1,0.5)",
+ });
+ // 数字淡入动画
+ gsap.to(
+ {},
+ {
+ duration: 1.5,
+ delay: i * 0.08 + 0.1,
+ ease: "elastic.out(1,0.5)",
+ onStart: () =>
+ setOpacities((prev) => {
+ const next = [...prev];
+ next[i] = 0;
+ return next;
+ }),
+ onUpdate: function () {
+ setOpacities((prev) => {
+ const next = [...prev];
+ // 进度条宽度百分比 = 当前动画进度
+ // 这里用gsap的progress(),但由于没有目标对象,直接用1
+ next[i] = 1; // 直接到1即可
+ return next;
+ });
+ },
+ onComplete: () =>
+ setOpacities((prev) => {
+ const next = [...prev];
+ next[i] = 1;
+ return next;
+ }),
+ }
+ );
+ });
+ } else {
+ // 离开视口时重置宽度和透明度
+ performanceData.forEach((_, i) => {
+ if (barsRef.current[i]) barsRef.current[i]!.style.width = "0%";
+ });
+ setOpacities(performanceData.map(() => 0));
+ }
+ }, [inView]);
+
+ if (typeof window !== "undefined") {
+ const style = document.createElement("style");
+ style.innerHTML = `
+ .bar-item { cursor: pointer; }
+ .bar-item.bar-hover {
+ box-shadow: 0 4px 24px 0 rgba(59,130,246,0.18), 0 1.5px 8px 0 rgba(0,0,0,0.10);
+ z-index: 2;
+ transform: scale(1.07);
+ }
+ `;
+ if (!document.getElementById("bar-style")) {
+ style.id = "bar-style";
+ document.head.appendChild(style);
+ }
+ }
+
+ return (
+
+
+ {/* 左侧性能条 */}
+
+
+ {performanceData.map((data, i) => (
+
+
+ {data.name}
+
+
+
{
+ barsRef.current[i] = el;
+ }}
+ className={`h-6 rounded-full ${data.color} transition-all flex items-center pl-4 bar-item`}
+ style={{
+ width: "0%",
+ transition: "transform 0.25s cubic-bezier(.4,2,.6,1)",
+ }}
+ onMouseEnter={(e) =>
+ e.currentTarget.classList.add("bar-hover")
+ }
+ onMouseLeave={(e) =>
+ e.currentTarget.classList.remove("bar-hover")
+ }
+ >
+
+ {data.value}
+
+
+
+
+ ))}
+
+
+ {/* 右侧文案 */}
+
+
+
+ 🚀
+
+ 性能优异的前端框架
+
+
+ Inula 在{" "}
+
+ 基准测试
+ {" "}
+ 中表现优异,性能媲美甚至超越主流框架。
+
+ 采用细粒度响应式,极大减少重渲染,体验极致流畅。
+
+
+
+
+ );
+}
diff --git a/packages/website-next/src/components/MDXDetailPage.tsx b/packages/website-next/src/components/MDXDetailPage.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4b2306a3d2b3c3e210534de7fdf46deb57bd83cd
--- /dev/null
+++ b/packages/website-next/src/components/MDXDetailPage.tsx
@@ -0,0 +1,29 @@
+import React from "react";
+import { compileMdx } from "nextra/compile";
+import { MDXRemote } from "nextra/mdx-remote";
+
+interface MDXDetailPageProps {
+ mdContent: string;
+ header?: React.ReactNode;
+ backHref?: string;
+}
+
+export default async function MDXDetailPage({ mdContent, header, backHref }: MDXDetailPageProps) {
+ const compiled = await compileMdx(mdContent);
+
+ return (
+
+
+ {header}
+
+
+
+
+ {backHref && (
+
← 返回
+ )}
+
+ );
+}
+
+
diff --git a/packages/website-next/src/components/MarkdownPage.tsx b/packages/website-next/src/components/MarkdownPage.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d440185ff605d5ac6cc0ea6db6b1c7831e7dc093
--- /dev/null
+++ b/packages/website-next/src/components/MarkdownPage.tsx
@@ -0,0 +1,65 @@
+"use client";
+
+import React, { useEffect } from "react";
+import Markdown from "react-markdown";
+
+const highlightLink = {
+ a: (
+ props: React.AnchorHTMLAttributes & {
+ children?: React.ReactNode;
+ }
+ ) => (
+
+ {props.children}
+
+ ),
+};
+
+interface MarkdownPageProps {
+ mdUrl: string;
+ className?: string;
+}
+
+const defaultClassName =
+ "laws-prose mx-auto max-w-5xl px-4 py-8 bg-white dark:bg-neutral-900 rounded-lg shadow-md prose prose-lg prose-zinc dark:prose-invert";
+
+export default function MarkdownPage({ mdUrl, className }: MarkdownPageProps) {
+ const [md, setMd] = React.useState("");
+
+ useEffect(() => {
+ async function FetchMarkdown() {
+ const res = await fetch(mdUrl);
+ const md = await res.text();
+ setMd(md);
+ }
+ FetchMarkdown();
+ }, [mdUrl]);
+
+ return (
+
+ {md}
+
+ );
+}
diff --git a/packages/website-next/src/components/magicui/aurora-text.tsx b/packages/website-next/src/components/magicui/aurora-text.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d1ce69ca41e64ed91e162cd12a94fca19241089b
--- /dev/null
+++ b/packages/website-next/src/components/magicui/aurora-text.tsx
@@ -0,0 +1,43 @@
+"use client";
+
+import React, { memo } from "react";
+
+interface AuroraTextProps {
+ children: React.ReactNode;
+ className?: string;
+ colors?: string[];
+ speed?: number;
+}
+
+export const AuroraText = memo(
+ ({
+ children,
+ className = "",
+ colors = ["#FF0080", "#60a5fa", "#0070F3", "#38bdf8"],
+ speed = 1,
+ }: AuroraTextProps) => {
+ const gradientStyle = {
+ backgroundImage: `linear-gradient(135deg, ${colors.join(", ")}, ${
+ colors[0]
+ })`,
+ WebkitBackgroundClip: "text",
+ WebkitTextFillColor: "transparent",
+ animationDuration: `${10 / speed}s`,
+ };
+
+ return (
+
+ {children}
+
+ {children}
+
+
+ );
+ },
+);
+
+AuroraText.displayName = "AuroraText";
diff --git a/packages/website-next/src/components/magicui/code-comparison.tsx b/packages/website-next/src/components/magicui/code-comparison.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..292d29a01c463cf42ee5217146b5061845fe25f9
--- /dev/null
+++ b/packages/website-next/src/components/magicui/code-comparison.tsx
@@ -0,0 +1,156 @@
+"use client";
+
+import { cn } from "@/lib/utils";
+import {
+ transformerNotationDiff,
+ transformerNotationFocus,
+} from "@shikijs/transformers";
+import { FileIcon } from "lucide-react";
+import { useTheme } from "next-themes";
+import { useEffect, useState, useMemo } from "react";
+
+interface CodeComparisonProps {
+ beforeCode: string;
+ afterCode: string;
+ language: string;
+ filename: string;
+ lightTheme: string;
+ darkTheme: string;
+ highlightColor?: string;
+}
+
+export function CodeComparison({
+ beforeCode,
+ afterCode,
+ language,
+ filename,
+ lightTheme,
+ darkTheme,
+ highlightColor = "#ff3333",
+}: Readonly) {
+ const { theme, systemTheme } = useTheme();
+ const [highlightedBefore, setHighlightedBefore] = useState("");
+ const [highlightedAfter, setHighlightedAfter] = useState("");
+ const [hasLeftFocus, setHasLeftFocus] = useState(false);
+ const [hasRightFocus, setHasRightFocus] = useState(false);
+
+ const selectedTheme = useMemo(() => {
+ const currentTheme = theme === "system" ? systemTheme : theme;
+ return currentTheme === "dark" ? darkTheme : lightTheme;
+ }, [theme, systemTheme, darkTheme, lightTheme]);
+
+ useEffect(() => {
+ if (highlightedBefore || highlightedAfter) {
+ setHasLeftFocus(highlightedBefore.includes('class="line focused"'));
+ setHasRightFocus(highlightedAfter.includes('class="line focused"'));
+ }
+ }, [highlightedBefore, highlightedAfter]);
+
+ useEffect(() => {
+ async function highlightCode() {
+ try {
+ const { codeToHtml } = await import("shiki");
+ const { transformerNotationHighlight } = await import(
+ "@shikijs/transformers"
+ );
+
+ const before = await codeToHtml(beforeCode, {
+ lang: language,
+ theme: selectedTheme,
+ transformers: [
+ transformerNotationHighlight({ matchAlgorithm: "v3" }),
+ transformerNotationDiff({ matchAlgorithm: "v3" }),
+ transformerNotationFocus({ matchAlgorithm: "v3" }),
+ ],
+ });
+ const after = await codeToHtml(afterCode, {
+ lang: language,
+ theme: selectedTheme,
+ transformers: [
+ transformerNotationHighlight({ matchAlgorithm: "v3" }),
+ transformerNotationDiff({ matchAlgorithm: "v3" }),
+ transformerNotationFocus({ matchAlgorithm: "v3" }),
+ ],
+ });
+ setHighlightedBefore(before);
+ setHighlightedAfter(after);
+ } catch (error) {
+ console.error("Error highlighting code:", error);
+ setHighlightedBefore(`${beforeCode}`);
+ setHighlightedAfter(`${afterCode}`);
+ }
+ }
+ highlightCode();
+ }, [beforeCode, afterCode, language, selectedTheme]);
+
+ const renderCode = (code: string, highlighted: string) => {
+ if (highlighted) {
+ return (
+ pre]:h-full [&>pre]:!w-screen [&>pre]:py-2",
+ "[&>pre>code]:!inline-block [&>pre>code]:!w-full",
+ "[&>pre>code>span]:!inline-block [&>pre>code>span]:w-full [&>pre>code>span]:px-4 [&>pre>code>span]:py-0.5",
+ "[&>pre>code>.highlighted]:inline-block [&>pre>code>.highlighted]:w-full [&>pre>code>.highlighted]:!bg-[var(--highlight-color)]",
+ "group-hover/left:[&>pre>code>:not(.focused)]:!opacity-100 group-hover/left:[&>pre>code>:not(.focused)]:!blur-none",
+ "group-hover/right:[&>pre>code>:not(.focused)]:!opacity-100 group-hover/right:[&>pre>code>:not(.focused)]:!blur-none",
+ "[&>pre>code>.add]:bg-[rgba(16,185,129,.16)] [&>pre>code>.remove]:bg-[rgba(244,63,94,.16)]",
+ "group-hover/left:[&>pre>code>:not(.focused)]:transition-all group-hover/left:[&>pre>code>:not(.focused)]:duration-300",
+ "group-hover/right:[&>pre>code>:not(.focused)]:transition-all group-hover/right:[&>pre>code>:not(.focused)]:duration-300",
+ )}
+ dangerouslySetInnerHTML={{ __html: highlighted }}
+ />
+ );
+ } else {
+ return (
+
+ {code}
+
+ );
+ }
+ };
+
+ return (
+
+
+
+
div>pre>code>:not(.focused)]:!opacity-50 [&>div>pre>code>:not(.focused)]:!blur-[0.095rem]",
+ "[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300",
+ )}
+ >
+
+
+ {filename}
+ before
+
+ {renderCode(beforeCode, highlightedBefore)}
+
+
div>pre>code>:not(.focused)]:!opacity-50 [&>div>pre>code>:not(.focused)]:!blur-[0.095rem]",
+ "[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300",
+ )}
+ >
+
+
+ {filename}
+ after
+
+ {renderCode(afterCode, highlightedAfter)}
+
+
+
+ VS
+
+
+
+ );
+}
diff --git a/packages/website-next/src/components/magicui/magic-card.tsx b/packages/website-next/src/components/magicui/magic-card.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..58b71ef20082f52fcde6a8a4597c641cc7c6f269
--- /dev/null
+++ b/packages/website-next/src/components/magicui/magic-card.tsx
@@ -0,0 +1,108 @@
+"use client";
+
+import { motion, useMotionTemplate, useMotionValue } from "motion/react";
+import React, { useCallback, useEffect, useRef } from "react";
+
+import { cn } from "@/lib/utils";
+
+interface MagicCardProps {
+ children?: React.ReactNode;
+ className?: string;
+ gradientSize?: number;
+ gradientColor?: string;
+ gradientOpacity?: number;
+ gradientFrom?: string;
+ gradientTo?: string;
+}
+
+export function MagicCard({
+ children,
+ className,
+ gradientSize = 200,
+ gradientColor = "#262626",
+ gradientOpacity = 0.8,
+ gradientFrom = "#9E7AFF",
+ gradientTo = "#FE8BBB",
+}: MagicCardProps) {
+ const cardRef = useRef
(null);
+ const mouseX = useMotionValue(-gradientSize);
+ const mouseY = useMotionValue(-gradientSize);
+
+ const handleMouseMove = useCallback(
+ (e: MouseEvent) => {
+ if (cardRef.current) {
+ const { left, top } = cardRef.current.getBoundingClientRect();
+ const clientX = e.clientX;
+ const clientY = e.clientY;
+ mouseX.set(clientX - left);
+ mouseY.set(clientY - top);
+ }
+ },
+ [mouseX, mouseY],
+ );
+
+ const handleMouseOut = useCallback(
+ (e: MouseEvent) => {
+ if (!e.relatedTarget) {
+ document.removeEventListener("mousemove", handleMouseMove);
+ mouseX.set(-gradientSize);
+ mouseY.set(-gradientSize);
+ }
+ },
+ [handleMouseMove, mouseX, gradientSize, mouseY],
+ );
+
+ const handleMouseEnter = useCallback(() => {
+ document.addEventListener("mousemove", handleMouseMove);
+ mouseX.set(-gradientSize);
+ mouseY.set(-gradientSize);
+ }, [handleMouseMove, mouseX, gradientSize, mouseY]);
+
+ useEffect(() => {
+ document.addEventListener("mousemove", handleMouseMove);
+ document.addEventListener("mouseout", handleMouseOut);
+ document.addEventListener("mouseenter", handleMouseEnter);
+
+ return () => {
+ document.removeEventListener("mousemove", handleMouseMove);
+ document.removeEventListener("mouseout", handleMouseOut);
+ document.removeEventListener("mouseenter", handleMouseEnter);
+ };
+ }, [handleMouseEnter, handleMouseMove, handleMouseOut]);
+
+ useEffect(() => {
+ mouseX.set(-gradientSize);
+ mouseY.set(-gradientSize);
+ }, [gradientSize, mouseX, mouseY]);
+
+ return (
+
+ );
+}
diff --git a/packages/website-next/src/components/magicui/meteors.tsx b/packages/website-next/src/components/magicui/meteors.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e463de984a4f2e31c768c00a387907ffa431dfa3
--- /dev/null
+++ b/packages/website-next/src/components/magicui/meteors.tsx
@@ -0,0 +1,60 @@
+"use client";
+
+import { cn } from "@/lib/utils";
+import React, { useEffect, useState } from "react";
+
+interface MeteorsProps {
+ number?: number;
+ minDelay?: number;
+ maxDelay?: number;
+ minDuration?: number;
+ maxDuration?: number;
+ angle?: number;
+ className?: string;
+}
+
+export const Meteors = ({
+ number = 20,
+ minDelay = 0.2,
+ maxDelay = 1.2,
+ minDuration = 2,
+ maxDuration = 10,
+ angle = 215,
+ className,
+}: MeteorsProps) => {
+ const [meteorStyles, setMeteorStyles] = useState>(
+ [],
+ );
+
+ useEffect(() => {
+ const styles = [...new Array(number)].map(() => ({
+ "--angle": -angle + "deg",
+ top: "-5%",
+ left: `calc(0% + ${Math.floor(Math.random() * window.innerWidth)}px)`,
+ animationDelay: Math.random() * (maxDelay - minDelay) + minDelay + "s",
+ animationDuration:
+ Math.floor(Math.random() * (maxDuration - minDuration) + minDuration) +
+ "s",
+ }));
+ setMeteorStyles(styles);
+ }, [number, minDelay, maxDelay, minDuration, maxDuration, angle]);
+
+ return (
+ <>
+ {[...meteorStyles].map((style, idx) => (
+ // Meteor Main
+
+ {/* Meteor Tail */}
+
+
+ ))}
+ >
+ );
+};
diff --git a/packages/website-next/src/lib/utils.ts b/packages/website-next/src/lib/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bd0c391ddd1088e9067844c48835bf4abcd61783
--- /dev/null
+++ b/packages/website-next/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
diff --git a/packages/website-next/src/mdx-components.tsx b/packages/website-next/src/mdx-components.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..db1dde66caa8b7224f61eee181e2c79f79f7cd7f
--- /dev/null
+++ b/packages/website-next/src/mdx-components.tsx
@@ -0,0 +1,14 @@
+import { useMDXComponents as getThemeComponents } from "nextra-theme-docs"; // nextra-theme-blog or your custom theme
+
+// Get the default MDX components
+const themeComponents = getThemeComponents();
+
+// Merge components
+export function useMDXComponents(
+ components: Record>
+) {
+ return {
+ ...themeComponents,
+ ...components,
+ };
+}
diff --git a/packages/website-next/tsconfig.json b/packages/website-next/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..c1effeafc137464fd7495a7a013c95ca15eef1f5
--- /dev/null
+++ b/packages/website-next/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ "src/app/laws/page",
+ "src/app/docs/api/page.mdx",
+ "index.d.ts"
+ ],
+ "exclude": ["node_modules"]
+}