balibabu commited on
Commit
bf32bcf
·
1 Parent(s): 5bc7f36

feat: Add next login page with shadcn/ui #3221 (#3231)

Browse files

### What problem does this PR solve?

feat: Add next login page with shadcn/ui #3221

### Type of change


- [x] New Feature (non-breaking change which adds functionality)

web/.umirc.ts CHANGED
@@ -19,7 +19,10 @@ export default defineConfig({
19
  history: {
20
  type: 'browser',
21
  },
22
- plugins: ['@react-dev-inspector/umi4-plugin'],
 
 
 
23
  jsMinifier: 'terser',
24
  lessLoader: {
25
  modifyVars: {
@@ -38,9 +41,11 @@ export default defineConfig({
38
  // pathRewrite: { '^/v1': '/v1' },
39
  },
40
  ],
 
41
  chainWebpack(memo, args) {
42
  memo.module.rule('markdown').test(/\.md$/).type('asset/source');
43
 
44
  return memo;
45
  },
 
46
  });
 
19
  history: {
20
  type: 'browser',
21
  },
22
+ plugins: [
23
+ '@react-dev-inspector/umi4-plugin',
24
+ '@umijs/plugins/dist/tailwindcss',
25
+ ],
26
  jsMinifier: 'terser',
27
  lessLoader: {
28
  modifyVars: {
 
41
  // pathRewrite: { '^/v1': '/v1' },
42
  },
43
  ],
44
+
45
  chainWebpack(memo, args) {
46
  memo.module.rule('markdown').test(/\.md$/).type('asset/source');
47
 
48
  return memo;
49
  },
50
+ tailwindcss: {},
51
  });
web/package-lock.json CHANGED
@@ -10,15 +10,27 @@
10
  "@ant-design/pro-components": "^2.6.46",
11
  "@ant-design/pro-layout": "^7.17.16",
12
  "@antv/g6": "^5.0.10",
 
13
  "@js-preview/excel": "^1.7.8",
14
  "@monaco-editor/react": "^4.6.0",
 
 
 
 
 
 
 
 
 
15
  "@tanstack/react-query": "^5.40.0",
16
  "@tanstack/react-query-devtools": "^5.51.5",
17
  "@uiw/react-markdown-preview": "^5.1.3",
18
  "ahooks": "^3.7.10",
19
  "antd": "^5.12.7",
20
  "axios": "^1.6.3",
 
21
  "classnames": "^2.5.1",
 
22
  "dayjs": "^1.11.10",
23
  "dompurify": "^3.1.6",
24
  "eventsource-parser": "^1.1.2",
@@ -26,15 +38,18 @@
26
  "i18next": "^23.7.16",
27
  "i18next-browser-languagedetector": "^8.0.0",
28
  "immer": "^10.1.1",
 
29
  "js-base64": "^3.7.5",
30
  "jsencrypt": "^3.3.2",
31
  "lodash": "^4.17.21",
 
32
  "mammoth": "^1.7.2",
33
  "openai-speech-stream-player": "^1.0.8",
34
  "rc-tween-one": "^3.0.6",
35
  "react-copy-to-clipboard": "^5.1.0",
36
  "react-error-boundary": "^4.0.13",
37
  "react-force-graph": "^1.44.4",
 
38
  "react-i18next": "^14.0.0",
39
  "react-markdown": "^9.0.1",
40
  "react-pdf-highlighter": "^6.1.0",
@@ -45,10 +60,13 @@
45
  "recharts": "^2.12.4",
46
  "rehype-raw": "^7.0.0",
47
  "remark-gfm": "^4.0.0",
 
 
48
  "umi": "^4.0.90",
49
  "umi-request": "^1.4.0",
50
  "unist-util-visit-parents": "^6.0.1",
51
  "uuid": "^9.0.1",
 
52
  "zustand": "^4.5.2"
53
  },
54
  "devDependencies": {
@@ -79,6 +97,7 @@
79
  "prettier-plugin-packagejson": "^2.4.9",
80
  "react-dev-inspector": "^2.0.1",
81
  "remark-loader": "^6.0.0",
 
82
  "ts-node": "^10.9.2",
83
  "typescript": "^5.0.3",
84
  "umi-plugin-icons": "^0.1.1"
@@ -99,6 +118,17 @@
99
  "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==",
100
  "dev": true
101
  },
 
 
 
 
 
 
 
 
 
 
 
102
  "node_modules/@ampproject/remapping": {
103
  "version": "2.2.1",
104
  "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz",
@@ -1279,7 +1309,7 @@
1279
  "version": "0.8.1",
1280
  "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
1281
  "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
1282
- "dev": true,
1283
  "dependencies": {
1284
  "@jridgewell/trace-mapping": "0.3.9"
1285
  },
@@ -1291,7 +1321,7 @@
1291
  "version": "0.3.9",
1292
  "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
1293
  "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
1294
- "dev": true,
1295
  "dependencies": {
1296
  "@jridgewell/resolve-uri": "^3.0.3",
1297
  "@jridgewell/sourcemap-codec": "^1.4.10"
@@ -2403,6 +2433,11 @@
2403
  "use-isomorphic-layout-effect": "^1.1.1"
2404
  }
2405
  },
 
 
 
 
 
2406
  "node_modules/@formatjs/intl-displaynames": {
2407
  "version": "1.2.10",
2408
  "resolved": "https://registry.npmmirror.com/@formatjs/intl-displaynames/-/intl-displaynames-1.2.10.tgz",
@@ -2447,6 +2482,14 @@
2447
  "deprecated": "the package is rather renamed to @formatjs/ecma-abstract with some changes in functionality (primarily selectUnit is removed and we don't plan to make any further changes to this package",
2448
  "dev": true
2449
  },
 
 
 
 
 
 
 
 
2450
  "node_modules/@humanwhocodes/config-array": {
2451
  "version": "0.11.13",
2452
  "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@@ -3936,77 +3979,862 @@
3936
  "node": ">= 8"
3937
  }
3938
  },
3939
- "node_modules/@pkgjs/parseargs": {
3940
- "version": "0.11.0",
3941
- "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
3942
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
3943
- "optional": true,
3944
- "engines": {
3945
- "node": ">=14"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3946
  }
3947
  },
3948
- "node_modules/@pkgr/core": {
3949
- "version": "0.1.1",
3950
- "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.1.1.tgz",
3951
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
3952
- "dev": true,
3953
- "engines": {
3954
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
 
 
 
 
 
3955
  }
3956
  },
3957
- "node_modules/@pkgr/utils": {
3958
- "version": "2.4.2",
3959
- "resolved": "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.4.2.tgz",
3960
- "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
3961
  "dependencies": {
3962
- "cross-spawn": "^7.0.3",
3963
- "fast-glob": "^3.3.0",
3964
- "is-glob": "^4.0.3",
3965
- "open": "^9.1.0",
3966
- "picocolors": "^1.0.0",
3967
- "tslib": "^2.6.0"
3968
  },
3969
- "engines": {
3970
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
3971
- }
3972
- },
3973
- "node_modules/@pkgr/utils/node_modules/define-lazy-prop": {
3974
- "version": "3.0.0",
3975
- "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
3976
- "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
3977
- "engines": {
3978
- "node": ">=12"
3979
  }
3980
  },
3981
- "node_modules/@pkgr/utils/node_modules/fast-glob": {
3982
- "version": "3.3.2",
3983
- "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
3984
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
3985
  "dependencies": {
3986
- "@nodelib/fs.stat": "^2.0.2",
3987
- "@nodelib/fs.walk": "^1.2.3",
3988
- "glob-parent": "^5.1.2",
3989
- "merge2": "^1.3.0",
3990
- "micromatch": "^4.0.4"
3991
  },
3992
- "engines": {
3993
- "node": ">=8.6.0"
 
 
 
 
 
 
3994
  }
3995
  },
3996
- "node_modules/@pkgr/utils/node_modules/open": {
3997
- "version": "9.1.0",
3998
- "resolved": "https://registry.npmmirror.com/open/-/open-9.1.0.tgz",
3999
- "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
4000
  "dependencies": {
4001
- "default-browser": "^4.0.0",
4002
- "define-lazy-prop": "^3.0.0",
4003
- "is-inside-container": "^1.0.0",
4004
- "is-wsl": "^2.2.0"
4005
  },
4006
- "engines": {
4007
- "node": ">=14.16"
 
 
 
 
 
 
 
 
 
 
 
4008
  }
4009
  },
 
 
 
 
 
4010
  "node_modules/@rc-component/color-picker": {
4011
  "version": "1.5.1",
4012
  "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-1.5.1.tgz",
@@ -4891,25 +5719,25 @@
4891
  "version": "1.0.11",
4892
  "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz",
4893
  "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
4894
- "dev": true
4895
  },
4896
  "node_modules/@tsconfig/node12": {
4897
  "version": "1.0.11",
4898
  "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz",
4899
  "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
4900
- "dev": true
4901
  },
4902
  "node_modules/@tsconfig/node14": {
4903
  "version": "1.0.3",
4904
  "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz",
4905
  "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
4906
- "dev": true
4907
  },
4908
  "node_modules/@tsconfig/node16": {
4909
  "version": "1.0.4",
4910
  "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz",
4911
  "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
4912
- "dev": true
4913
  },
4914
  "node_modules/@tweenjs/tween.js": {
4915
  "version": "23.1.3",
@@ -5443,7 +6271,7 @@
5443
  "version": "18.2.18",
5444
  "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.2.18.tgz",
5445
  "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==",
5446
- "dev": true,
5447
  "dependencies": {
5448
  "@types/react": "*"
5449
  }
@@ -7753,7 +8581,7 @@
7753
  "version": "8.3.2",
7754
  "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz",
7755
  "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
7756
- "dev": true,
7757
  "engines": {
7758
  "node": ">=0.4.0"
7759
  }
@@ -8038,6 +8866,11 @@
8038
  "dayjs": "*"
8039
  }
8040
  },
 
 
 
 
 
8041
  "node_modules/anymatch": {
8042
  "version": "3.1.3",
8043
  "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
@@ -8054,7 +8887,7 @@
8054
  "version": "4.1.3",
8055
  "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz",
8056
  "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
8057
- "dev": true
8058
  },
8059
  "node_modules/argparse": {
8060
  "version": "1.0.10",
@@ -9130,6 +9963,14 @@
9130
  "node": ">=10"
9131
  }
9132
  },
 
 
 
 
 
 
 
 
9133
  "node_modules/camelcase-keys": {
9134
  "version": "6.2.2",
9135
  "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
@@ -9332,6 +10173,25 @@
9332
  "node": ">= 0.4"
9333
  }
9334
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9335
  "node_modules/classcat": {
9336
  "version": "5.0.5",
9337
  "resolved": "https://registry.npmmirror.com/classcat/-/classcat-5.0.5.tgz",
@@ -9534,9 +10394,9 @@
9534
  }
9535
  },
9536
  "node_modules/clsx": {
9537
- "version": "2.1.0",
9538
- "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.0.tgz",
9539
- "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
9540
  "engines": {
9541
  "node": ">=6"
9542
  }
@@ -10311,7 +11171,7 @@
10311
  "version": "1.1.1",
10312
  "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz",
10313
  "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
10314
- "dev": true
10315
  },
10316
  "node_modules/cross-env": {
10317
  "version": "7.0.3",
@@ -11305,6 +12165,11 @@
11305
  "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
11306
  "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
11307
  },
 
 
 
 
 
11308
  "node_modules/detect-port-alt": {
11309
  "version": "1.1.6",
11310
  "resolved": "https://registry.npmmirror.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
@@ -11345,11 +12210,16 @@
11345
  "dequal": "^2.0.0"
11346
  }
11347
  },
 
 
 
 
 
11348
  "node_modules/diff": {
11349
  "version": "4.0.2",
11350
  "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz",
11351
  "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
11352
- "dev": true,
11353
  "engines": {
11354
  "node": ">=0.3.1"
11355
  }
@@ -11406,6 +12276,11 @@
11406
  "url": "https://github.com/sponsors/wooorm"
11407
  }
11408
  },
 
 
 
 
 
11409
  "node_modules/doctrine": {
11410
  "version": "3.0.0",
11411
  "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
@@ -13627,6 +14502,14 @@
13627
  "node": ">= 0.4"
13628
  }
13629
  },
 
 
 
 
 
 
 
 
13630
  "node_modules/get-package-type": {
13631
  "version": "0.1.0",
13632
  "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -14913,6 +15796,15 @@
14913
  "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz",
14914
  "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ=="
14915
  },
 
 
 
 
 
 
 
 
 
14916
  "node_modules/insert-css": {
14917
  "version": "2.0.0",
14918
  "resolved": "https://registry.npmmirror.com/insert-css/-/insert-css-2.0.0.tgz",
@@ -18081,6 +18973,14 @@
18081
  "node": ">=8"
18082
  }
18083
  },
 
 
 
 
 
 
 
 
18084
  "node_modules/js-base64": {
18085
  "version": "3.7.5",
18086
  "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
@@ -18590,7 +19490,6 @@
18590
  "version": "3.1.2",
18591
  "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.2.tgz",
18592
  "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
18593
- "dev": true,
18594
  "engines": {
18595
  "node": ">=14"
18596
  },
@@ -19229,6 +20128,14 @@
19229
  "yallist": "^3.0.2"
19230
  }
19231
  },
 
 
 
 
 
 
 
 
19232
  "node_modules/lz-string": {
19233
  "version": "1.5.0",
19234
  "resolved": "https://registry.npmmirror.com/lz-string/-/lz-string-1.5.0.tgz",
@@ -19264,7 +20171,7 @@
19264
  "version": "1.3.6",
19265
  "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz",
19266
  "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
19267
- "dev": true
19268
  },
19269
  "node_modules/makeerror": {
19270
  "version": "1.0.12",
@@ -20078,9 +20985,9 @@
20078
  }
20079
  },
20080
  "node_modules/minipass": {
20081
- "version": "7.1.1",
20082
- "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.1.tgz",
20083
- "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
20084
  "engines": {
20085
  "node": ">=16 || 14 >=14.17"
20086
  }
@@ -20175,6 +21082,16 @@
20175
  "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
20176
  "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
20177
  },
 
 
 
 
 
 
 
 
 
 
20178
  "node_modules/nanoid": {
20179
  "version": "3.3.7",
20180
  "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
@@ -20647,6 +21564,14 @@
20647
  "node": ">=0.10.0"
20648
  }
20649
  },
 
 
 
 
 
 
 
 
20650
  "node_modules/object-inspect": {
20651
  "version": "1.13.1",
20652
  "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz",
@@ -20999,6 +21924,11 @@
20999
  "node": ">=6"
21000
  }
21001
  },
 
 
 
 
 
21002
  "node_modules/pako": {
21003
  "version": "1.0.11",
21004
  "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
@@ -21730,6 +22660,38 @@
21730
  "postcss": "^8.2"
21731
  }
21732
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21733
  "node_modules/postcss-initial": {
21734
  "version": "4.0.1",
21735
  "resolved": "https://registry.npmmirror.com/postcss-initial/-/postcss-initial-4.0.1.tgz",
@@ -21738,6 +22700,24 @@
21738
  "postcss": "^8.0.0"
21739
  }
21740
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21741
  "node_modules/postcss-lab-function": {
21742
  "version": "4.2.1",
21743
  "resolved": "https://registry.npmmirror.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
@@ -21753,6 +22733,51 @@
21753
  "postcss": "^8.2"
21754
  }
21755
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21756
  "node_modules/postcss-logical": {
21757
  "version": "5.0.4",
21758
  "resolved": "https://registry.npmmirror.com/postcss-logical/-/postcss-logical-5.0.4.tgz",
@@ -21827,13 +22852,37 @@
21827
  "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
21828
  "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
21829
  "dependencies": {
21830
- "icss-utils": "^5.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21831
  },
21832
  "engines": {
21833
- "node": "^10 || ^12 || >= 14"
21834
  },
21835
  "peerDependencies": {
21836
- "postcss": "^8.1.0"
21837
  }
21838
  },
21839
  "node_modules/postcss-nesting": {
@@ -22016,9 +23065,9 @@
22016
  }
22017
  },
22018
  "node_modules/postcss-selector-parser": {
22019
- "version": "6.0.15",
22020
- "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
22021
- "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
22022
  "dependencies": {
22023
  "cssesc": "^3.0.0",
22024
  "util-deprecate": "^1.0.2"
@@ -23456,6 +24505,21 @@
23456
  "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
23457
  }
23458
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23459
  "node_modules/react-i18next": {
23460
  "version": "14.0.0",
23461
  "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-14.0.0.tgz",
@@ -23567,6 +24631,51 @@
23567
  "node": ">=0.10.0"
23568
  }
23569
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23570
  "node_modules/react-rnd": {
23571
  "version": "10.4.1",
23572
  "resolved": "https://registry.npmmirror.com/react-rnd/-/react-rnd-10.4.1.tgz",
@@ -23706,6 +24815,28 @@
23706
  "node": ">=0.12.0"
23707
  }
23708
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23709
  "node_modules/react-syntax-highlighter": {
23710
  "version": "15.5.0",
23711
  "resolved": "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
@@ -23769,6 +24900,22 @@
23769
  "react-dom": ">=17"
23770
  }
23771
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23772
  "node_modules/read-pkg": {
23773
  "version": "5.2.0",
23774
  "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -26674,6 +27821,90 @@
26674
  "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz",
26675
  "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ=="
26676
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26677
  "node_modules/super-animejs": {
26678
  "version": "3.1.0",
26679
  "resolved": "https://registry.npmmirror.com/super-animejs/-/super-animejs-3.1.0.tgz",
@@ -26899,6 +28130,125 @@
26899
  "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
26900
  "peer": true
26901
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26902
  "node_modules/tapable": {
26903
  "version": "2.2.1",
26904
  "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
@@ -27012,6 +28362,25 @@
27012
  "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
27013
  "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
27014
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27015
  "node_modules/thread-stream": {
27016
  "version": "0.15.2",
27017
  "resolved": "https://registry.npmmirror.com/thread-stream/-/thread-stream-0.15.2.tgz",
@@ -27309,11 +28678,16 @@
27309
  "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz",
27310
  "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="
27311
  },
 
 
 
 
 
27312
  "node_modules/ts-node": {
27313
  "version": "10.9.2",
27314
  "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz",
27315
  "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
27316
- "dev": true,
27317
  "dependencies": {
27318
  "@cspotcode/source-map-support": "^0.8.0",
27319
  "@tsconfig/node10": "^1.0.7",
@@ -27993,6 +29367,26 @@
27993
  "node": ">=0.10.0"
27994
  }
27995
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27996
  "node_modules/use-isomorphic-layout-effect": {
27997
  "version": "1.1.2",
27998
  "resolved": "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
@@ -28006,6 +29400,27 @@
28006
  }
28007
  }
28008
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28009
  "node_modules/use-sync-external-store": {
28010
  "version": "1.2.0",
28011
  "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
@@ -28127,7 +29542,7 @@
28127
  "version": "3.0.1",
28128
  "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
28129
  "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
28130
- "dev": true
28131
  },
28132
  "node_modules/v8-to-istanbul": {
28133
  "version": "9.2.0",
@@ -29240,7 +30655,7 @@
29240
  "version": "3.1.1",
29241
  "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz",
29242
  "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
29243
- "dev": true,
29244
  "engines": {
29245
  "node": ">=6"
29246
  }
@@ -29253,6 +30668,14 @@
29253
  "node": ">=10"
29254
  }
29255
  },
 
 
 
 
 
 
 
 
29256
  "node_modules/zustand": {
29257
  "version": "4.5.2",
29258
  "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
 
10
  "@ant-design/pro-components": "^2.6.46",
11
  "@ant-design/pro-layout": "^7.17.16",
12
  "@antv/g6": "^5.0.10",
13
+ "@hookform/resolvers": "^3.9.1",
14
  "@js-preview/excel": "^1.7.8",
15
  "@monaco-editor/react": "^4.6.0",
16
+ "@radix-ui/react-checkbox": "^1.1.2",
17
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
18
+ "@radix-ui/react-icons": "^1.3.1",
19
+ "@radix-ui/react-label": "^2.1.0",
20
+ "@radix-ui/react-select": "^2.1.2",
21
+ "@radix-ui/react-separator": "^1.1.0",
22
+ "@radix-ui/react-slot": "^1.1.0",
23
+ "@radix-ui/react-switch": "^1.1.1",
24
+ "@radix-ui/react-toast": "^1.2.2",
25
  "@tanstack/react-query": "^5.40.0",
26
  "@tanstack/react-query-devtools": "^5.51.5",
27
  "@uiw/react-markdown-preview": "^5.1.3",
28
  "ahooks": "^3.7.10",
29
  "antd": "^5.12.7",
30
  "axios": "^1.6.3",
31
+ "class-variance-authority": "^0.7.0",
32
  "classnames": "^2.5.1",
33
+ "clsx": "^2.1.1",
34
  "dayjs": "^1.11.10",
35
  "dompurify": "^3.1.6",
36
  "eventsource-parser": "^1.1.2",
 
38
  "i18next": "^23.7.16",
39
  "i18next-browser-languagedetector": "^8.0.0",
40
  "immer": "^10.1.1",
41
+ "input-otp": "^1.4.1",
42
  "js-base64": "^3.7.5",
43
  "jsencrypt": "^3.3.2",
44
  "lodash": "^4.17.21",
45
+ "lucide-react": "^0.454.0",
46
  "mammoth": "^1.7.2",
47
  "openai-speech-stream-player": "^1.0.8",
48
  "rc-tween-one": "^3.0.6",
49
  "react-copy-to-clipboard": "^5.1.0",
50
  "react-error-boundary": "^4.0.13",
51
  "react-force-graph": "^1.44.4",
52
+ "react-hook-form": "^7.53.1",
53
  "react-i18next": "^14.0.0",
54
  "react-markdown": "^9.0.1",
55
  "react-pdf-highlighter": "^6.1.0",
 
60
  "recharts": "^2.12.4",
61
  "rehype-raw": "^7.0.0",
62
  "remark-gfm": "^4.0.0",
63
+ "tailwind-merge": "^2.5.4",
64
+ "tailwindcss-animate": "^1.0.7",
65
  "umi": "^4.0.90",
66
  "umi-request": "^1.4.0",
67
  "unist-util-visit-parents": "^6.0.1",
68
  "uuid": "^9.0.1",
69
+ "zod": "^3.23.8",
70
  "zustand": "^4.5.2"
71
  },
72
  "devDependencies": {
 
97
  "prettier-plugin-packagejson": "^2.4.9",
98
  "react-dev-inspector": "^2.0.1",
99
  "remark-loader": "^6.0.0",
100
+ "tailwindcss": "^3",
101
  "ts-node": "^10.9.2",
102
  "typescript": "^5.0.3",
103
  "umi-plugin-icons": "^0.1.1"
 
118
  "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==",
119
  "dev": true
120
  },
121
+ "node_modules/@alloc/quick-lru": {
122
+ "version": "5.2.0",
123
+ "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
124
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
125
+ "engines": {
126
+ "node": ">=10"
127
+ },
128
+ "funding": {
129
+ "url": "https://github.com/sponsors/sindresorhus"
130
+ }
131
+ },
132
  "node_modules/@ampproject/remapping": {
133
  "version": "2.2.1",
134
  "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz",
 
1309
  "version": "0.8.1",
1310
  "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
1311
  "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
1312
+ "devOptional": true,
1313
  "dependencies": {
1314
  "@jridgewell/trace-mapping": "0.3.9"
1315
  },
 
1321
  "version": "0.3.9",
1322
  "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
1323
  "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
1324
+ "devOptional": true,
1325
  "dependencies": {
1326
  "@jridgewell/resolve-uri": "^3.0.3",
1327
  "@jridgewell/sourcemap-codec": "^1.4.10"
 
2433
  "use-isomorphic-layout-effect": "^1.1.1"
2434
  }
2435
  },
2436
+ "node_modules/@floating-ui/utils": {
2437
+ "version": "0.2.8",
2438
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz",
2439
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
2440
+ },
2441
  "node_modules/@formatjs/intl-displaynames": {
2442
  "version": "1.2.10",
2443
  "resolved": "https://registry.npmmirror.com/@formatjs/intl-displaynames/-/intl-displaynames-1.2.10.tgz",
 
2482
  "deprecated": "the package is rather renamed to @formatjs/ecma-abstract with some changes in functionality (primarily selectUnit is removed and we don't plan to make any further changes to this package",
2483
  "dev": true
2484
  },
2485
+ "node_modules/@hookform/resolvers": {
2486
+ "version": "3.9.1",
2487
+ "resolved": "https://registry.npmmirror.com/@hookform/resolvers/-/resolvers-3.9.1.tgz",
2488
+ "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==",
2489
+ "peerDependencies": {
2490
+ "react-hook-form": "^7.0.0"
2491
+ }
2492
+ },
2493
  "node_modules/@humanwhocodes/config-array": {
2494
  "version": "0.11.13",
2495
  "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
 
3979
  "node": ">= 8"
3980
  }
3981
  },
3982
+ "node_modules/@pkgjs/parseargs": {
3983
+ "version": "0.11.0",
3984
+ "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
3985
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
3986
+ "optional": true,
3987
+ "engines": {
3988
+ "node": ">=14"
3989
+ }
3990
+ },
3991
+ "node_modules/@pkgr/core": {
3992
+ "version": "0.1.1",
3993
+ "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.1.1.tgz",
3994
+ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
3995
+ "dev": true,
3996
+ "engines": {
3997
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
3998
+ }
3999
+ },
4000
+ "node_modules/@pkgr/utils": {
4001
+ "version": "2.4.2",
4002
+ "resolved": "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.4.2.tgz",
4003
+ "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
4004
+ "dependencies": {
4005
+ "cross-spawn": "^7.0.3",
4006
+ "fast-glob": "^3.3.0",
4007
+ "is-glob": "^4.0.3",
4008
+ "open": "^9.1.0",
4009
+ "picocolors": "^1.0.0",
4010
+ "tslib": "^2.6.0"
4011
+ },
4012
+ "engines": {
4013
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
4014
+ }
4015
+ },
4016
+ "node_modules/@pkgr/utils/node_modules/define-lazy-prop": {
4017
+ "version": "3.0.0",
4018
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
4019
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
4020
+ "engines": {
4021
+ "node": ">=12"
4022
+ }
4023
+ },
4024
+ "node_modules/@pkgr/utils/node_modules/fast-glob": {
4025
+ "version": "3.3.2",
4026
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
4027
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
4028
+ "dependencies": {
4029
+ "@nodelib/fs.stat": "^2.0.2",
4030
+ "@nodelib/fs.walk": "^1.2.3",
4031
+ "glob-parent": "^5.1.2",
4032
+ "merge2": "^1.3.0",
4033
+ "micromatch": "^4.0.4"
4034
+ },
4035
+ "engines": {
4036
+ "node": ">=8.6.0"
4037
+ }
4038
+ },
4039
+ "node_modules/@pkgr/utils/node_modules/open": {
4040
+ "version": "9.1.0",
4041
+ "resolved": "https://registry.npmmirror.com/open/-/open-9.1.0.tgz",
4042
+ "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
4043
+ "dependencies": {
4044
+ "default-browser": "^4.0.0",
4045
+ "define-lazy-prop": "^3.0.0",
4046
+ "is-inside-container": "^1.0.0",
4047
+ "is-wsl": "^2.2.0"
4048
+ },
4049
+ "engines": {
4050
+ "node": ">=14.16"
4051
+ }
4052
+ },
4053
+ "node_modules/@radix-ui/number": {
4054
+ "version": "1.1.0",
4055
+ "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.0.tgz",
4056
+ "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ=="
4057
+ },
4058
+ "node_modules/@radix-ui/primitive": {
4059
+ "version": "1.1.0",
4060
+ "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz",
4061
+ "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA=="
4062
+ },
4063
+ "node_modules/@radix-ui/react-arrow": {
4064
+ "version": "1.1.0",
4065
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
4066
+ "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==",
4067
+ "dependencies": {
4068
+ "@radix-ui/react-primitive": "2.0.0"
4069
+ },
4070
+ "peerDependencies": {
4071
+ "@types/react": "*",
4072
+ "@types/react-dom": "*",
4073
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4074
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4075
+ },
4076
+ "peerDependenciesMeta": {
4077
+ "@types/react": {
4078
+ "optional": true
4079
+ },
4080
+ "@types/react-dom": {
4081
+ "optional": true
4082
+ }
4083
+ }
4084
+ },
4085
+ "node_modules/@radix-ui/react-checkbox": {
4086
+ "version": "1.1.2",
4087
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz",
4088
+ "integrity": "sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==",
4089
+ "dependencies": {
4090
+ "@radix-ui/primitive": "1.1.0",
4091
+ "@radix-ui/react-compose-refs": "1.1.0",
4092
+ "@radix-ui/react-context": "1.1.1",
4093
+ "@radix-ui/react-presence": "1.1.1",
4094
+ "@radix-ui/react-primitive": "2.0.0",
4095
+ "@radix-ui/react-use-controllable-state": "1.1.0",
4096
+ "@radix-ui/react-use-previous": "1.1.0",
4097
+ "@radix-ui/react-use-size": "1.1.0"
4098
+ },
4099
+ "peerDependencies": {
4100
+ "@types/react": "*",
4101
+ "@types/react-dom": "*",
4102
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4103
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4104
+ },
4105
+ "peerDependenciesMeta": {
4106
+ "@types/react": {
4107
+ "optional": true
4108
+ },
4109
+ "@types/react-dom": {
4110
+ "optional": true
4111
+ }
4112
+ }
4113
+ },
4114
+ "node_modules/@radix-ui/react-collection": {
4115
+ "version": "1.1.0",
4116
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz",
4117
+ "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==",
4118
+ "dependencies": {
4119
+ "@radix-ui/react-compose-refs": "1.1.0",
4120
+ "@radix-ui/react-context": "1.1.0",
4121
+ "@radix-ui/react-primitive": "2.0.0",
4122
+ "@radix-ui/react-slot": "1.1.0"
4123
+ },
4124
+ "peerDependencies": {
4125
+ "@types/react": "*",
4126
+ "@types/react-dom": "*",
4127
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4128
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4129
+ },
4130
+ "peerDependenciesMeta": {
4131
+ "@types/react": {
4132
+ "optional": true
4133
+ },
4134
+ "@types/react-dom": {
4135
+ "optional": true
4136
+ }
4137
+ }
4138
+ },
4139
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": {
4140
+ "version": "1.1.0",
4141
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz",
4142
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
4143
+ "peerDependencies": {
4144
+ "@types/react": "*",
4145
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4146
+ },
4147
+ "peerDependenciesMeta": {
4148
+ "@types/react": {
4149
+ "optional": true
4150
+ }
4151
+ }
4152
+ },
4153
+ "node_modules/@radix-ui/react-compose-refs": {
4154
+ "version": "1.1.0",
4155
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz",
4156
+ "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==",
4157
+ "peerDependencies": {
4158
+ "@types/react": "*",
4159
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4160
+ },
4161
+ "peerDependenciesMeta": {
4162
+ "@types/react": {
4163
+ "optional": true
4164
+ }
4165
+ }
4166
+ },
4167
+ "node_modules/@radix-ui/react-context": {
4168
+ "version": "1.1.1",
4169
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.1.tgz",
4170
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
4171
+ "peerDependencies": {
4172
+ "@types/react": "*",
4173
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4174
+ },
4175
+ "peerDependenciesMeta": {
4176
+ "@types/react": {
4177
+ "optional": true
4178
+ }
4179
+ }
4180
+ },
4181
+ "node_modules/@radix-ui/react-direction": {
4182
+ "version": "1.1.0",
4183
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
4184
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
4185
+ "peerDependencies": {
4186
+ "@types/react": "*",
4187
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4188
+ },
4189
+ "peerDependenciesMeta": {
4190
+ "@types/react": {
4191
+ "optional": true
4192
+ }
4193
+ }
4194
+ },
4195
+ "node_modules/@radix-ui/react-dismissable-layer": {
4196
+ "version": "1.1.1",
4197
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz",
4198
+ "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==",
4199
+ "dependencies": {
4200
+ "@radix-ui/primitive": "1.1.0",
4201
+ "@radix-ui/react-compose-refs": "1.1.0",
4202
+ "@radix-ui/react-primitive": "2.0.0",
4203
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4204
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
4205
+ },
4206
+ "peerDependencies": {
4207
+ "@types/react": "*",
4208
+ "@types/react-dom": "*",
4209
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4210
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4211
+ },
4212
+ "peerDependenciesMeta": {
4213
+ "@types/react": {
4214
+ "optional": true
4215
+ },
4216
+ "@types/react-dom": {
4217
+ "optional": true
4218
+ }
4219
+ }
4220
+ },
4221
+ "node_modules/@radix-ui/react-dropdown-menu": {
4222
+ "version": "2.1.2",
4223
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz",
4224
+ "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==",
4225
+ "dependencies": {
4226
+ "@radix-ui/primitive": "1.1.0",
4227
+ "@radix-ui/react-compose-refs": "1.1.0",
4228
+ "@radix-ui/react-context": "1.1.1",
4229
+ "@radix-ui/react-id": "1.1.0",
4230
+ "@radix-ui/react-menu": "2.1.2",
4231
+ "@radix-ui/react-primitive": "2.0.0",
4232
+ "@radix-ui/react-use-controllable-state": "1.1.0"
4233
+ },
4234
+ "peerDependencies": {
4235
+ "@types/react": "*",
4236
+ "@types/react-dom": "*",
4237
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4238
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4239
+ },
4240
+ "peerDependenciesMeta": {
4241
+ "@types/react": {
4242
+ "optional": true
4243
+ },
4244
+ "@types/react-dom": {
4245
+ "optional": true
4246
+ }
4247
+ }
4248
+ },
4249
+ "node_modules/@radix-ui/react-focus-guards": {
4250
+ "version": "1.1.1",
4251
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
4252
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
4253
+ "peerDependencies": {
4254
+ "@types/react": "*",
4255
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4256
+ },
4257
+ "peerDependenciesMeta": {
4258
+ "@types/react": {
4259
+ "optional": true
4260
+ }
4261
+ }
4262
+ },
4263
+ "node_modules/@radix-ui/react-focus-scope": {
4264
+ "version": "1.1.0",
4265
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz",
4266
+ "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==",
4267
+ "dependencies": {
4268
+ "@radix-ui/react-compose-refs": "1.1.0",
4269
+ "@radix-ui/react-primitive": "2.0.0",
4270
+ "@radix-ui/react-use-callback-ref": "1.1.0"
4271
+ },
4272
+ "peerDependencies": {
4273
+ "@types/react": "*",
4274
+ "@types/react-dom": "*",
4275
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4276
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4277
+ },
4278
+ "peerDependenciesMeta": {
4279
+ "@types/react": {
4280
+ "optional": true
4281
+ },
4282
+ "@types/react-dom": {
4283
+ "optional": true
4284
+ }
4285
+ }
4286
+ },
4287
+ "node_modules/@radix-ui/react-icons": {
4288
+ "version": "1.3.1",
4289
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-icons/-/react-icons-1.3.1.tgz",
4290
+ "integrity": "sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==",
4291
+ "peerDependencies": {
4292
+ "react": "^16.x || ^17.x || ^18.x || ^19.x"
4293
+ }
4294
+ },
4295
+ "node_modules/@radix-ui/react-id": {
4296
+ "version": "1.1.0",
4297
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz",
4298
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
4299
+ "dependencies": {
4300
+ "@radix-ui/react-use-layout-effect": "1.1.0"
4301
+ },
4302
+ "peerDependencies": {
4303
+ "@types/react": "*",
4304
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4305
+ },
4306
+ "peerDependenciesMeta": {
4307
+ "@types/react": {
4308
+ "optional": true
4309
+ }
4310
+ }
4311
+ },
4312
+ "node_modules/@radix-ui/react-label": {
4313
+ "version": "2.1.0",
4314
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.0.tgz",
4315
+ "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==",
4316
+ "dependencies": {
4317
+ "@radix-ui/react-primitive": "2.0.0"
4318
+ },
4319
+ "peerDependencies": {
4320
+ "@types/react": "*",
4321
+ "@types/react-dom": "*",
4322
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4323
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4324
+ },
4325
+ "peerDependenciesMeta": {
4326
+ "@types/react": {
4327
+ "optional": true
4328
+ },
4329
+ "@types/react-dom": {
4330
+ "optional": true
4331
+ }
4332
+ }
4333
+ },
4334
+ "node_modules/@radix-ui/react-menu": {
4335
+ "version": "2.1.2",
4336
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.2.tgz",
4337
+ "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==",
4338
+ "dependencies": {
4339
+ "@radix-ui/primitive": "1.1.0",
4340
+ "@radix-ui/react-collection": "1.1.0",
4341
+ "@radix-ui/react-compose-refs": "1.1.0",
4342
+ "@radix-ui/react-context": "1.1.1",
4343
+ "@radix-ui/react-direction": "1.1.0",
4344
+ "@radix-ui/react-dismissable-layer": "1.1.1",
4345
+ "@radix-ui/react-focus-guards": "1.1.1",
4346
+ "@radix-ui/react-focus-scope": "1.1.0",
4347
+ "@radix-ui/react-id": "1.1.0",
4348
+ "@radix-ui/react-popper": "1.2.0",
4349
+ "@radix-ui/react-portal": "1.1.2",
4350
+ "@radix-ui/react-presence": "1.1.1",
4351
+ "@radix-ui/react-primitive": "2.0.0",
4352
+ "@radix-ui/react-roving-focus": "1.1.0",
4353
+ "@radix-ui/react-slot": "1.1.0",
4354
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4355
+ "aria-hidden": "^1.1.1",
4356
+ "react-remove-scroll": "2.6.0"
4357
+ },
4358
+ "peerDependencies": {
4359
+ "@types/react": "*",
4360
+ "@types/react-dom": "*",
4361
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4362
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4363
+ },
4364
+ "peerDependenciesMeta": {
4365
+ "@types/react": {
4366
+ "optional": true
4367
+ },
4368
+ "@types/react-dom": {
4369
+ "optional": true
4370
+ }
4371
+ }
4372
+ },
4373
+ "node_modules/@radix-ui/react-popper": {
4374
+ "version": "1.2.0",
4375
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz",
4376
+ "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==",
4377
+ "dependencies": {
4378
+ "@floating-ui/react-dom": "^2.0.0",
4379
+ "@radix-ui/react-arrow": "1.1.0",
4380
+ "@radix-ui/react-compose-refs": "1.1.0",
4381
+ "@radix-ui/react-context": "1.1.0",
4382
+ "@radix-ui/react-primitive": "2.0.0",
4383
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4384
+ "@radix-ui/react-use-layout-effect": "1.1.0",
4385
+ "@radix-ui/react-use-rect": "1.1.0",
4386
+ "@radix-ui/react-use-size": "1.1.0",
4387
+ "@radix-ui/rect": "1.1.0"
4388
+ },
4389
+ "peerDependencies": {
4390
+ "@types/react": "*",
4391
+ "@types/react-dom": "*",
4392
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4393
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4394
+ },
4395
+ "peerDependenciesMeta": {
4396
+ "@types/react": {
4397
+ "optional": true
4398
+ },
4399
+ "@types/react-dom": {
4400
+ "optional": true
4401
+ }
4402
+ }
4403
+ },
4404
+ "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/core": {
4405
+ "version": "1.6.8",
4406
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz",
4407
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
4408
+ "dependencies": {
4409
+ "@floating-ui/utils": "^0.2.8"
4410
+ }
4411
+ },
4412
+ "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/dom": {
4413
+ "version": "1.6.12",
4414
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz",
4415
+ "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
4416
+ "dependencies": {
4417
+ "@floating-ui/core": "^1.6.0",
4418
+ "@floating-ui/utils": "^0.2.8"
4419
+ }
4420
+ },
4421
+ "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": {
4422
+ "version": "2.1.2",
4423
+ "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
4424
+ "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
4425
+ "dependencies": {
4426
+ "@floating-ui/dom": "^1.0.0"
4427
+ },
4428
+ "peerDependencies": {
4429
+ "react": ">=16.8.0",
4430
+ "react-dom": ">=16.8.0"
4431
+ }
4432
+ },
4433
+ "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": {
4434
+ "version": "1.1.0",
4435
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz",
4436
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
4437
+ "peerDependencies": {
4438
+ "@types/react": "*",
4439
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4440
+ },
4441
+ "peerDependenciesMeta": {
4442
+ "@types/react": {
4443
+ "optional": true
4444
+ }
4445
+ }
4446
+ },
4447
+ "node_modules/@radix-ui/react-portal": {
4448
+ "version": "1.1.2",
4449
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz",
4450
+ "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==",
4451
+ "dependencies": {
4452
+ "@radix-ui/react-primitive": "2.0.0",
4453
+ "@radix-ui/react-use-layout-effect": "1.1.0"
4454
+ },
4455
+ "peerDependencies": {
4456
+ "@types/react": "*",
4457
+ "@types/react-dom": "*",
4458
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4459
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4460
+ },
4461
+ "peerDependenciesMeta": {
4462
+ "@types/react": {
4463
+ "optional": true
4464
+ },
4465
+ "@types/react-dom": {
4466
+ "optional": true
4467
+ }
4468
+ }
4469
+ },
4470
+ "node_modules/@radix-ui/react-presence": {
4471
+ "version": "1.1.1",
4472
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
4473
+ "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
4474
+ "dependencies": {
4475
+ "@radix-ui/react-compose-refs": "1.1.0",
4476
+ "@radix-ui/react-use-layout-effect": "1.1.0"
4477
+ },
4478
+ "peerDependencies": {
4479
+ "@types/react": "*",
4480
+ "@types/react-dom": "*",
4481
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4482
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4483
+ },
4484
+ "peerDependenciesMeta": {
4485
+ "@types/react": {
4486
+ "optional": true
4487
+ },
4488
+ "@types/react-dom": {
4489
+ "optional": true
4490
+ }
4491
+ }
4492
+ },
4493
+ "node_modules/@radix-ui/react-primitive": {
4494
+ "version": "2.0.0",
4495
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz",
4496
+ "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==",
4497
+ "dependencies": {
4498
+ "@radix-ui/react-slot": "1.1.0"
4499
+ },
4500
+ "peerDependencies": {
4501
+ "@types/react": "*",
4502
+ "@types/react-dom": "*",
4503
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4504
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4505
+ },
4506
+ "peerDependenciesMeta": {
4507
+ "@types/react": {
4508
+ "optional": true
4509
+ },
4510
+ "@types/react-dom": {
4511
+ "optional": true
4512
+ }
4513
+ }
4514
+ },
4515
+ "node_modules/@radix-ui/react-roving-focus": {
4516
+ "version": "1.1.0",
4517
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz",
4518
+ "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==",
4519
+ "dependencies": {
4520
+ "@radix-ui/primitive": "1.1.0",
4521
+ "@radix-ui/react-collection": "1.1.0",
4522
+ "@radix-ui/react-compose-refs": "1.1.0",
4523
+ "@radix-ui/react-context": "1.1.0",
4524
+ "@radix-ui/react-direction": "1.1.0",
4525
+ "@radix-ui/react-id": "1.1.0",
4526
+ "@radix-ui/react-primitive": "2.0.0",
4527
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4528
+ "@radix-ui/react-use-controllable-state": "1.1.0"
4529
+ },
4530
+ "peerDependencies": {
4531
+ "@types/react": "*",
4532
+ "@types/react-dom": "*",
4533
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4534
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4535
+ },
4536
+ "peerDependenciesMeta": {
4537
+ "@types/react": {
4538
+ "optional": true
4539
+ },
4540
+ "@types/react-dom": {
4541
+ "optional": true
4542
+ }
4543
+ }
4544
+ },
4545
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": {
4546
+ "version": "1.1.0",
4547
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz",
4548
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
4549
+ "peerDependencies": {
4550
+ "@types/react": "*",
4551
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4552
+ },
4553
+ "peerDependenciesMeta": {
4554
+ "@types/react": {
4555
+ "optional": true
4556
+ }
4557
+ }
4558
+ },
4559
+ "node_modules/@radix-ui/react-select": {
4560
+ "version": "2.1.2",
4561
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.1.2.tgz",
4562
+ "integrity": "sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==",
4563
+ "dependencies": {
4564
+ "@radix-ui/number": "1.1.0",
4565
+ "@radix-ui/primitive": "1.1.0",
4566
+ "@radix-ui/react-collection": "1.1.0",
4567
+ "@radix-ui/react-compose-refs": "1.1.0",
4568
+ "@radix-ui/react-context": "1.1.1",
4569
+ "@radix-ui/react-direction": "1.1.0",
4570
+ "@radix-ui/react-dismissable-layer": "1.1.1",
4571
+ "@radix-ui/react-focus-guards": "1.1.1",
4572
+ "@radix-ui/react-focus-scope": "1.1.0",
4573
+ "@radix-ui/react-id": "1.1.0",
4574
+ "@radix-ui/react-popper": "1.2.0",
4575
+ "@radix-ui/react-portal": "1.1.2",
4576
+ "@radix-ui/react-primitive": "2.0.0",
4577
+ "@radix-ui/react-slot": "1.1.0",
4578
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4579
+ "@radix-ui/react-use-controllable-state": "1.1.0",
4580
+ "@radix-ui/react-use-layout-effect": "1.1.0",
4581
+ "@radix-ui/react-use-previous": "1.1.0",
4582
+ "@radix-ui/react-visually-hidden": "1.1.0",
4583
+ "aria-hidden": "^1.1.1",
4584
+ "react-remove-scroll": "2.6.0"
4585
+ },
4586
+ "peerDependencies": {
4587
+ "@types/react": "*",
4588
+ "@types/react-dom": "*",
4589
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4590
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4591
+ },
4592
+ "peerDependenciesMeta": {
4593
+ "@types/react": {
4594
+ "optional": true
4595
+ },
4596
+ "@types/react-dom": {
4597
+ "optional": true
4598
+ }
4599
+ }
4600
+ },
4601
+ "node_modules/@radix-ui/react-separator": {
4602
+ "version": "1.1.0",
4603
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz",
4604
+ "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==",
4605
+ "dependencies": {
4606
+ "@radix-ui/react-primitive": "2.0.0"
4607
+ },
4608
+ "peerDependencies": {
4609
+ "@types/react": "*",
4610
+ "@types/react-dom": "*",
4611
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4612
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4613
+ },
4614
+ "peerDependenciesMeta": {
4615
+ "@types/react": {
4616
+ "optional": true
4617
+ },
4618
+ "@types/react-dom": {
4619
+ "optional": true
4620
+ }
4621
+ }
4622
+ },
4623
+ "node_modules/@radix-ui/react-slot": {
4624
+ "version": "1.1.0",
4625
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
4626
+ "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==",
4627
+ "dependencies": {
4628
+ "@radix-ui/react-compose-refs": "1.1.0"
4629
+ },
4630
+ "peerDependencies": {
4631
+ "@types/react": "*",
4632
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4633
+ },
4634
+ "peerDependenciesMeta": {
4635
+ "@types/react": {
4636
+ "optional": true
4637
+ }
4638
+ }
4639
+ },
4640
+ "node_modules/@radix-ui/react-switch": {
4641
+ "version": "1.1.1",
4642
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.1.tgz",
4643
+ "integrity": "sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==",
4644
+ "dependencies": {
4645
+ "@radix-ui/primitive": "1.1.0",
4646
+ "@radix-ui/react-compose-refs": "1.1.0",
4647
+ "@radix-ui/react-context": "1.1.1",
4648
+ "@radix-ui/react-primitive": "2.0.0",
4649
+ "@radix-ui/react-use-controllable-state": "1.1.0",
4650
+ "@radix-ui/react-use-previous": "1.1.0",
4651
+ "@radix-ui/react-use-size": "1.1.0"
4652
+ },
4653
+ "peerDependencies": {
4654
+ "@types/react": "*",
4655
+ "@types/react-dom": "*",
4656
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4657
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4658
+ },
4659
+ "peerDependenciesMeta": {
4660
+ "@types/react": {
4661
+ "optional": true
4662
+ },
4663
+ "@types/react-dom": {
4664
+ "optional": true
4665
+ }
4666
+ }
4667
+ },
4668
+ "node_modules/@radix-ui/react-toast": {
4669
+ "version": "1.2.2",
4670
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.2.tgz",
4671
+ "integrity": "sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==",
4672
+ "dependencies": {
4673
+ "@radix-ui/primitive": "1.1.0",
4674
+ "@radix-ui/react-collection": "1.1.0",
4675
+ "@radix-ui/react-compose-refs": "1.1.0",
4676
+ "@radix-ui/react-context": "1.1.1",
4677
+ "@radix-ui/react-dismissable-layer": "1.1.1",
4678
+ "@radix-ui/react-portal": "1.1.2",
4679
+ "@radix-ui/react-presence": "1.1.1",
4680
+ "@radix-ui/react-primitive": "2.0.0",
4681
+ "@radix-ui/react-use-callback-ref": "1.1.0",
4682
+ "@radix-ui/react-use-controllable-state": "1.1.0",
4683
+ "@radix-ui/react-use-layout-effect": "1.1.0",
4684
+ "@radix-ui/react-visually-hidden": "1.1.0"
4685
+ },
4686
+ "peerDependencies": {
4687
+ "@types/react": "*",
4688
+ "@types/react-dom": "*",
4689
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4690
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4691
+ },
4692
+ "peerDependenciesMeta": {
4693
+ "@types/react": {
4694
+ "optional": true
4695
+ },
4696
+ "@types/react-dom": {
4697
+ "optional": true
4698
+ }
4699
+ }
4700
+ },
4701
+ "node_modules/@radix-ui/react-use-callback-ref": {
4702
+ "version": "1.1.0",
4703
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
4704
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
4705
+ "peerDependencies": {
4706
+ "@types/react": "*",
4707
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4708
+ },
4709
+ "peerDependenciesMeta": {
4710
+ "@types/react": {
4711
+ "optional": true
4712
+ }
4713
+ }
4714
+ },
4715
+ "node_modules/@radix-ui/react-use-controllable-state": {
4716
+ "version": "1.1.0",
4717
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
4718
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
4719
+ "dependencies": {
4720
+ "@radix-ui/react-use-callback-ref": "1.1.0"
4721
+ },
4722
+ "peerDependencies": {
4723
+ "@types/react": "*",
4724
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4725
+ },
4726
+ "peerDependenciesMeta": {
4727
+ "@types/react": {
4728
+ "optional": true
4729
+ }
4730
+ }
4731
+ },
4732
+ "node_modules/@radix-ui/react-use-escape-keydown": {
4733
+ "version": "1.1.0",
4734
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
4735
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
4736
+ "dependencies": {
4737
+ "@radix-ui/react-use-callback-ref": "1.1.0"
4738
+ },
4739
+ "peerDependencies": {
4740
+ "@types/react": "*",
4741
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4742
+ },
4743
+ "peerDependenciesMeta": {
4744
+ "@types/react": {
4745
+ "optional": true
4746
+ }
4747
+ }
4748
+ },
4749
+ "node_modules/@radix-ui/react-use-layout-effect": {
4750
+ "version": "1.1.0",
4751
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
4752
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
4753
+ "peerDependencies": {
4754
+ "@types/react": "*",
4755
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4756
+ },
4757
+ "peerDependenciesMeta": {
4758
+ "@types/react": {
4759
+ "optional": true
4760
+ }
4761
  }
4762
  },
4763
+ "node_modules/@radix-ui/react-use-previous": {
4764
+ "version": "1.1.0",
4765
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
4766
+ "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
4767
+ "peerDependencies": {
4768
+ "@types/react": "*",
4769
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4770
+ },
4771
+ "peerDependenciesMeta": {
4772
+ "@types/react": {
4773
+ "optional": true
4774
+ }
4775
  }
4776
  },
4777
+ "node_modules/@radix-ui/react-use-rect": {
4778
+ "version": "1.1.0",
4779
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
4780
+ "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
4781
  "dependencies": {
4782
+ "@radix-ui/rect": "1.1.0"
 
 
 
 
 
4783
  },
4784
+ "peerDependencies": {
4785
+ "@types/react": "*",
4786
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4787
+ },
4788
+ "peerDependenciesMeta": {
4789
+ "@types/react": {
4790
+ "optional": true
4791
+ }
 
 
4792
  }
4793
  },
4794
+ "node_modules/@radix-ui/react-use-size": {
4795
+ "version": "1.1.0",
4796
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
4797
+ "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
4798
  "dependencies": {
4799
+ "@radix-ui/react-use-layout-effect": "1.1.0"
 
 
 
 
4800
  },
4801
+ "peerDependencies": {
4802
+ "@types/react": "*",
4803
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4804
+ },
4805
+ "peerDependenciesMeta": {
4806
+ "@types/react": {
4807
+ "optional": true
4808
+ }
4809
  }
4810
  },
4811
+ "node_modules/@radix-ui/react-visually-hidden": {
4812
+ "version": "1.1.0",
4813
+ "resolved": "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz",
4814
+ "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==",
4815
  "dependencies": {
4816
+ "@radix-ui/react-primitive": "2.0.0"
 
 
 
4817
  },
4818
+ "peerDependencies": {
4819
+ "@types/react": "*",
4820
+ "@types/react-dom": "*",
4821
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
4822
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
4823
+ },
4824
+ "peerDependenciesMeta": {
4825
+ "@types/react": {
4826
+ "optional": true
4827
+ },
4828
+ "@types/react-dom": {
4829
+ "optional": true
4830
+ }
4831
  }
4832
  },
4833
+ "node_modules/@radix-ui/rect": {
4834
+ "version": "1.1.0",
4835
+ "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz",
4836
+ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="
4837
+ },
4838
  "node_modules/@rc-component/color-picker": {
4839
  "version": "1.5.1",
4840
  "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-1.5.1.tgz",
 
5719
  "version": "1.0.11",
5720
  "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz",
5721
  "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
5722
+ "devOptional": true
5723
  },
5724
  "node_modules/@tsconfig/node12": {
5725
  "version": "1.0.11",
5726
  "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz",
5727
  "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
5728
+ "devOptional": true
5729
  },
5730
  "node_modules/@tsconfig/node14": {
5731
  "version": "1.0.3",
5732
  "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz",
5733
  "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
5734
+ "devOptional": true
5735
  },
5736
  "node_modules/@tsconfig/node16": {
5737
  "version": "1.0.4",
5738
  "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz",
5739
  "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
5740
+ "devOptional": true
5741
  },
5742
  "node_modules/@tweenjs/tween.js": {
5743
  "version": "23.1.3",
 
6271
  "version": "18.2.18",
6272
  "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.2.18.tgz",
6273
  "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==",
6274
+ "devOptional": true,
6275
  "dependencies": {
6276
  "@types/react": "*"
6277
  }
 
8581
  "version": "8.3.2",
8582
  "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz",
8583
  "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
8584
+ "devOptional": true,
8585
  "engines": {
8586
  "node": ">=0.4.0"
8587
  }
 
8866
  "dayjs": "*"
8867
  }
8868
  },
8869
+ "node_modules/any-promise": {
8870
+ "version": "1.3.0",
8871
+ "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz",
8872
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
8873
+ },
8874
  "node_modules/anymatch": {
8875
  "version": "3.1.3",
8876
  "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
 
8887
  "version": "4.1.3",
8888
  "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz",
8889
  "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
8890
+ "devOptional": true
8891
  },
8892
  "node_modules/argparse": {
8893
  "version": "1.0.10",
 
9963
  "node": ">=10"
9964
  }
9965
  },
9966
+ "node_modules/camelcase-css": {
9967
+ "version": "2.0.1",
9968
+ "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz",
9969
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
9970
+ "engines": {
9971
+ "node": ">= 6"
9972
+ }
9973
+ },
9974
  "node_modules/camelcase-keys": {
9975
  "version": "6.2.2",
9976
  "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
 
10173
  "node": ">= 0.4"
10174
  }
10175
  },
10176
+ "node_modules/class-variance-authority": {
10177
+ "version": "0.7.0",
10178
+ "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
10179
+ "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
10180
+ "dependencies": {
10181
+ "clsx": "2.0.0"
10182
+ },
10183
+ "funding": {
10184
+ "url": "https://joebell.co.uk"
10185
+ }
10186
+ },
10187
+ "node_modules/class-variance-authority/node_modules/clsx": {
10188
+ "version": "2.0.0",
10189
+ "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.0.0.tgz",
10190
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
10191
+ "engines": {
10192
+ "node": ">=6"
10193
+ }
10194
+ },
10195
  "node_modules/classcat": {
10196
  "version": "5.0.5",
10197
  "resolved": "https://registry.npmmirror.com/classcat/-/classcat-5.0.5.tgz",
 
10394
  }
10395
  },
10396
  "node_modules/clsx": {
10397
+ "version": "2.1.1",
10398
+ "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz",
10399
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
10400
  "engines": {
10401
  "node": ">=6"
10402
  }
 
11171
  "version": "1.1.1",
11172
  "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz",
11173
  "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
11174
+ "devOptional": true
11175
  },
11176
  "node_modules/cross-env": {
11177
  "version": "7.0.3",
 
12165
  "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
12166
  "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
12167
  },
12168
+ "node_modules/detect-node-es": {
12169
+ "version": "1.1.0",
12170
+ "resolved": "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz",
12171
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
12172
+ },
12173
  "node_modules/detect-port-alt": {
12174
  "version": "1.1.6",
12175
  "resolved": "https://registry.npmmirror.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
 
12210
  "dequal": "^2.0.0"
12211
  }
12212
  },
12213
+ "node_modules/didyoumean": {
12214
+ "version": "1.2.2",
12215
+ "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz",
12216
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
12217
+ },
12218
  "node_modules/diff": {
12219
  "version": "4.0.2",
12220
  "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz",
12221
  "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
12222
+ "devOptional": true,
12223
  "engines": {
12224
  "node": ">=0.3.1"
12225
  }
 
12276
  "url": "https://github.com/sponsors/wooorm"
12277
  }
12278
  },
12279
+ "node_modules/dlv": {
12280
+ "version": "1.1.3",
12281
+ "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz",
12282
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
12283
+ },
12284
  "node_modules/doctrine": {
12285
  "version": "3.0.0",
12286
  "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
 
14502
  "node": ">= 0.4"
14503
  }
14504
  },
14505
+ "node_modules/get-nonce": {
14506
+ "version": "1.0.1",
14507
+ "resolved": "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz",
14508
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
14509
+ "engines": {
14510
+ "node": ">=6"
14511
+ }
14512
+ },
14513
  "node_modules/get-package-type": {
14514
  "version": "0.1.0",
14515
  "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz",
 
15796
  "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz",
15797
  "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ=="
15798
  },
15799
+ "node_modules/input-otp": {
15800
+ "version": "1.4.1",
15801
+ "resolved": "https://registry.npmmirror.com/input-otp/-/input-otp-1.4.1.tgz",
15802
+ "integrity": "sha512-+yvpmKYKHi9jIGngxagY9oWiiblPB7+nEO75F2l2o4vs+6vpPZZmUl4tBNYuTCvQjhvEIbdNeJu70bhfYP2nbw==",
15803
+ "peerDependencies": {
15804
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc",
15805
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
15806
+ }
15807
+ },
15808
  "node_modules/insert-css": {
15809
  "version": "2.0.0",
15810
  "resolved": "https://registry.npmmirror.com/insert-css/-/insert-css-2.0.0.tgz",
 
18973
  "node": ">=8"
18974
  }
18975
  },
18976
+ "node_modules/jiti": {
18977
+ "version": "1.21.6",
18978
+ "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.6.tgz",
18979
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
18980
+ "bin": {
18981
+ "jiti": "bin/jiti.js"
18982
+ }
18983
+ },
18984
  "node_modules/js-base64": {
18985
  "version": "3.7.5",
18986
  "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
 
19490
  "version": "3.1.2",
19491
  "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.2.tgz",
19492
  "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
 
19493
  "engines": {
19494
  "node": ">=14"
19495
  },
 
20128
  "yallist": "^3.0.2"
20129
  }
20130
  },
20131
+ "node_modules/lucide-react": {
20132
+ "version": "0.454.0",
20133
+ "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.454.0.tgz",
20134
+ "integrity": "sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==",
20135
+ "peerDependencies": {
20136
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
20137
+ }
20138
+ },
20139
  "node_modules/lz-string": {
20140
  "version": "1.5.0",
20141
  "resolved": "https://registry.npmmirror.com/lz-string/-/lz-string-1.5.0.tgz",
 
20171
  "version": "1.3.6",
20172
  "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz",
20173
  "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
20174
+ "devOptional": true
20175
  },
20176
  "node_modules/makeerror": {
20177
  "version": "1.0.12",
 
20985
  }
20986
  },
20987
  "node_modules/minipass": {
20988
+ "version": "7.1.2",
20989
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz",
20990
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
20991
  "engines": {
20992
  "node": ">=16 || 14 >=14.17"
20993
  }
 
21082
  "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
21083
  "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
21084
  },
21085
+ "node_modules/mz": {
21086
+ "version": "2.7.0",
21087
+ "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz",
21088
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
21089
+ "dependencies": {
21090
+ "any-promise": "^1.0.0",
21091
+ "object-assign": "^4.0.1",
21092
+ "thenify-all": "^1.0.0"
21093
+ }
21094
+ },
21095
  "node_modules/nanoid": {
21096
  "version": "3.3.7",
21097
  "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
 
21564
  "node": ">=0.10.0"
21565
  }
21566
  },
21567
+ "node_modules/object-hash": {
21568
+ "version": "3.0.0",
21569
+ "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz",
21570
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
21571
+ "engines": {
21572
+ "node": ">= 6"
21573
+ }
21574
+ },
21575
  "node_modules/object-inspect": {
21576
  "version": "1.13.1",
21577
  "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz",
 
21924
  "node": ">=6"
21925
  }
21926
  },
21927
+ "node_modules/package-json-from-dist": {
21928
+ "version": "1.0.1",
21929
+ "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
21930
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
21931
+ },
21932
  "node_modules/pako": {
21933
  "version": "1.0.11",
21934
  "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
 
22660
  "postcss": "^8.2"
22661
  }
22662
  },
22663
+ "node_modules/postcss-import": {
22664
+ "version": "15.1.0",
22665
+ "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz",
22666
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
22667
+ "dependencies": {
22668
+ "postcss-value-parser": "^4.0.0",
22669
+ "read-cache": "^1.0.0",
22670
+ "resolve": "^1.1.7"
22671
+ },
22672
+ "engines": {
22673
+ "node": ">=14.0.0"
22674
+ },
22675
+ "peerDependencies": {
22676
+ "postcss": "^8.0.0"
22677
+ }
22678
+ },
22679
+ "node_modules/postcss-import/node_modules/resolve": {
22680
+ "version": "1.22.8",
22681
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
22682
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
22683
+ "dependencies": {
22684
+ "is-core-module": "^2.13.0",
22685
+ "path-parse": "^1.0.7",
22686
+ "supports-preserve-symlinks-flag": "^1.0.0"
22687
+ },
22688
+ "bin": {
22689
+ "resolve": "bin/resolve"
22690
+ },
22691
+ "funding": {
22692
+ "url": "https://github.com/sponsors/ljharb"
22693
+ }
22694
+ },
22695
  "node_modules/postcss-initial": {
22696
  "version": "4.0.1",
22697
  "resolved": "https://registry.npmmirror.com/postcss-initial/-/postcss-initial-4.0.1.tgz",
 
22700
  "postcss": "^8.0.0"
22701
  }
22702
  },
22703
+ "node_modules/postcss-js": {
22704
+ "version": "4.0.1",
22705
+ "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz",
22706
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
22707
+ "dependencies": {
22708
+ "camelcase-css": "^2.0.1"
22709
+ },
22710
+ "engines": {
22711
+ "node": "^12 || ^14 || >= 16"
22712
+ },
22713
+ "funding": {
22714
+ "type": "opencollective",
22715
+ "url": "https://opencollective.com/postcss/"
22716
+ },
22717
+ "peerDependencies": {
22718
+ "postcss": "^8.4.21"
22719
+ }
22720
+ },
22721
  "node_modules/postcss-lab-function": {
22722
  "version": "4.2.1",
22723
  "resolved": "https://registry.npmmirror.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
 
22733
  "postcss": "^8.2"
22734
  }
22735
  },
22736
+ "node_modules/postcss-load-config": {
22737
+ "version": "4.0.2",
22738
+ "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
22739
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
22740
+ "funding": [
22741
+ {
22742
+ "type": "opencollective",
22743
+ "url": "https://opencollective.com/postcss/"
22744
+ },
22745
+ {
22746
+ "type": "github",
22747
+ "url": "https://github.com/sponsors/ai"
22748
+ }
22749
+ ],
22750
+ "dependencies": {
22751
+ "lilconfig": "^3.0.0",
22752
+ "yaml": "^2.3.4"
22753
+ },
22754
+ "engines": {
22755
+ "node": ">= 14"
22756
+ },
22757
+ "peerDependencies": {
22758
+ "postcss": ">=8.0.9",
22759
+ "ts-node": ">=9.0.0"
22760
+ },
22761
+ "peerDependenciesMeta": {
22762
+ "postcss": {
22763
+ "optional": true
22764
+ },
22765
+ "ts-node": {
22766
+ "optional": true
22767
+ }
22768
+ }
22769
+ },
22770
+ "node_modules/postcss-load-config/node_modules/yaml": {
22771
+ "version": "2.6.0",
22772
+ "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.6.0.tgz",
22773
+ "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
22774
+ "bin": {
22775
+ "yaml": "bin.mjs"
22776
+ },
22777
+ "engines": {
22778
+ "node": ">= 14"
22779
+ }
22780
+ },
22781
  "node_modules/postcss-logical": {
22782
  "version": "5.0.4",
22783
  "resolved": "https://registry.npmmirror.com/postcss-logical/-/postcss-logical-5.0.4.tgz",
 
22852
  "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
22853
  "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
22854
  "dependencies": {
22855
+ "icss-utils": "^5.0.0"
22856
+ },
22857
+ "engines": {
22858
+ "node": "^10 || ^12 || >= 14"
22859
+ },
22860
+ "peerDependencies": {
22861
+ "postcss": "^8.1.0"
22862
+ }
22863
+ },
22864
+ "node_modules/postcss-nested": {
22865
+ "version": "6.2.0",
22866
+ "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz",
22867
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
22868
+ "funding": [
22869
+ {
22870
+ "type": "opencollective",
22871
+ "url": "https://opencollective.com/postcss/"
22872
+ },
22873
+ {
22874
+ "type": "github",
22875
+ "url": "https://github.com/sponsors/ai"
22876
+ }
22877
+ ],
22878
+ "dependencies": {
22879
+ "postcss-selector-parser": "^6.1.1"
22880
  },
22881
  "engines": {
22882
+ "node": ">=12.0"
22883
  },
22884
  "peerDependencies": {
22885
+ "postcss": "^8.2.14"
22886
  }
22887
  },
22888
  "node_modules/postcss-nesting": {
 
23065
  }
23066
  },
23067
  "node_modules/postcss-selector-parser": {
23068
+ "version": "6.1.2",
23069
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
23070
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
23071
  "dependencies": {
23072
  "cssesc": "^3.0.0",
23073
  "util-deprecate": "^1.0.2"
 
24505
  "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
24506
  }
24507
  },
24508
+ "node_modules/react-hook-form": {
24509
+ "version": "7.53.1",
24510
+ "resolved": "https://registry.npmmirror.com/react-hook-form/-/react-hook-form-7.53.1.tgz",
24511
+ "integrity": "sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==",
24512
+ "engines": {
24513
+ "node": ">=18.0.0"
24514
+ },
24515
+ "funding": {
24516
+ "type": "opencollective",
24517
+ "url": "https://opencollective.com/react-hook-form"
24518
+ },
24519
+ "peerDependencies": {
24520
+ "react": "^16.8.0 || ^17 || ^18 || ^19"
24521
+ }
24522
+ },
24523
  "node_modules/react-i18next": {
24524
  "version": "14.0.0",
24525
  "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-14.0.0.tgz",
 
24631
  "node": ">=0.10.0"
24632
  }
24633
  },
24634
+ "node_modules/react-remove-scroll": {
24635
+ "version": "2.6.0",
24636
+ "resolved": "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz",
24637
+ "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==",
24638
+ "dependencies": {
24639
+ "react-remove-scroll-bar": "^2.3.6",
24640
+ "react-style-singleton": "^2.2.1",
24641
+ "tslib": "^2.1.0",
24642
+ "use-callback-ref": "^1.3.0",
24643
+ "use-sidecar": "^1.1.2"
24644
+ },
24645
+ "engines": {
24646
+ "node": ">=10"
24647
+ },
24648
+ "peerDependencies": {
24649
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
24650
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
24651
+ },
24652
+ "peerDependenciesMeta": {
24653
+ "@types/react": {
24654
+ "optional": true
24655
+ }
24656
+ }
24657
+ },
24658
+ "node_modules/react-remove-scroll-bar": {
24659
+ "version": "2.3.6",
24660
+ "resolved": "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
24661
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
24662
+ "dependencies": {
24663
+ "react-style-singleton": "^2.2.1",
24664
+ "tslib": "^2.0.0"
24665
+ },
24666
+ "engines": {
24667
+ "node": ">=10"
24668
+ },
24669
+ "peerDependencies": {
24670
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
24671
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
24672
+ },
24673
+ "peerDependenciesMeta": {
24674
+ "@types/react": {
24675
+ "optional": true
24676
+ }
24677
+ }
24678
+ },
24679
  "node_modules/react-rnd": {
24680
  "version": "10.4.1",
24681
  "resolved": "https://registry.npmmirror.com/react-rnd/-/react-rnd-10.4.1.tgz",
 
24815
  "node": ">=0.12.0"
24816
  }
24817
  },
24818
+ "node_modules/react-style-singleton": {
24819
+ "version": "2.2.1",
24820
+ "resolved": "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
24821
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
24822
+ "dependencies": {
24823
+ "get-nonce": "^1.0.0",
24824
+ "invariant": "^2.2.4",
24825
+ "tslib": "^2.0.0"
24826
+ },
24827
+ "engines": {
24828
+ "node": ">=10"
24829
+ },
24830
+ "peerDependencies": {
24831
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
24832
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
24833
+ },
24834
+ "peerDependenciesMeta": {
24835
+ "@types/react": {
24836
+ "optional": true
24837
+ }
24838
+ }
24839
+ },
24840
  "node_modules/react-syntax-highlighter": {
24841
  "version": "15.5.0",
24842
  "resolved": "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
 
24900
  "react-dom": ">=17"
24901
  }
24902
  },
24903
+ "node_modules/read-cache": {
24904
+ "version": "1.0.0",
24905
+ "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
24906
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
24907
+ "dependencies": {
24908
+ "pify": "^2.3.0"
24909
+ }
24910
+ },
24911
+ "node_modules/read-cache/node_modules/pify": {
24912
+ "version": "2.3.0",
24913
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
24914
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
24915
+ "engines": {
24916
+ "node": ">=0.10.0"
24917
+ }
24918
+ },
24919
  "node_modules/read-pkg": {
24920
  "version": "5.2.0",
24921
  "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
 
27821
  "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz",
27822
  "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ=="
27823
  },
27824
+ "node_modules/sucrase": {
27825
+ "version": "3.35.0",
27826
+ "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz",
27827
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
27828
+ "dependencies": {
27829
+ "@jridgewell/gen-mapping": "^0.3.2",
27830
+ "commander": "^4.0.0",
27831
+ "glob": "^10.3.10",
27832
+ "lines-and-columns": "^1.1.6",
27833
+ "mz": "^2.7.0",
27834
+ "pirates": "^4.0.1",
27835
+ "ts-interface-checker": "^0.1.9"
27836
+ },
27837
+ "bin": {
27838
+ "sucrase": "bin/sucrase",
27839
+ "sucrase-node": "bin/sucrase-node"
27840
+ },
27841
+ "engines": {
27842
+ "node": ">=16 || 14 >=14.17"
27843
+ }
27844
+ },
27845
+ "node_modules/sucrase/node_modules/brace-expansion": {
27846
+ "version": "2.0.1",
27847
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
27848
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
27849
+ "dependencies": {
27850
+ "balanced-match": "^1.0.0"
27851
+ }
27852
+ },
27853
+ "node_modules/sucrase/node_modules/commander": {
27854
+ "version": "4.1.1",
27855
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz",
27856
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
27857
+ "engines": {
27858
+ "node": ">= 6"
27859
+ }
27860
+ },
27861
+ "node_modules/sucrase/node_modules/glob": {
27862
+ "version": "10.4.5",
27863
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz",
27864
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
27865
+ "dependencies": {
27866
+ "foreground-child": "^3.1.0",
27867
+ "jackspeak": "^3.1.2",
27868
+ "minimatch": "^9.0.4",
27869
+ "minipass": "^7.1.2",
27870
+ "package-json-from-dist": "^1.0.0",
27871
+ "path-scurry": "^1.11.1"
27872
+ },
27873
+ "bin": {
27874
+ "glob": "dist/esm/bin.mjs"
27875
+ },
27876
+ "funding": {
27877
+ "url": "https://github.com/sponsors/isaacs"
27878
+ }
27879
+ },
27880
+ "node_modules/sucrase/node_modules/jackspeak": {
27881
+ "version": "3.4.3",
27882
+ "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz",
27883
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
27884
+ "dependencies": {
27885
+ "@isaacs/cliui": "^8.0.2"
27886
+ },
27887
+ "funding": {
27888
+ "url": "https://github.com/sponsors/isaacs"
27889
+ },
27890
+ "optionalDependencies": {
27891
+ "@pkgjs/parseargs": "^0.11.0"
27892
+ }
27893
+ },
27894
+ "node_modules/sucrase/node_modules/minimatch": {
27895
+ "version": "9.0.5",
27896
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
27897
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
27898
+ "dependencies": {
27899
+ "brace-expansion": "^2.0.1"
27900
+ },
27901
+ "engines": {
27902
+ "node": ">=16 || 14 >=14.17"
27903
+ },
27904
+ "funding": {
27905
+ "url": "https://github.com/sponsors/isaacs"
27906
+ }
27907
+ },
27908
  "node_modules/super-animejs": {
27909
  "version": "3.1.0",
27910
  "resolved": "https://registry.npmmirror.com/super-animejs/-/super-animejs-3.1.0.tgz",
 
28130
  "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
28131
  "peer": true
28132
  },
28133
+ "node_modules/tailwind-merge": {
28134
+ "version": "2.5.4",
28135
+ "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz",
28136
+ "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==",
28137
+ "funding": {
28138
+ "type": "github",
28139
+ "url": "https://github.com/sponsors/dcastil"
28140
+ }
28141
+ },
28142
+ "node_modules/tailwindcss": {
28143
+ "version": "3.4.14",
28144
+ "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.14.tgz",
28145
+ "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
28146
+ "dependencies": {
28147
+ "@alloc/quick-lru": "^5.2.0",
28148
+ "arg": "^5.0.2",
28149
+ "chokidar": "^3.5.3",
28150
+ "didyoumean": "^1.2.2",
28151
+ "dlv": "^1.1.3",
28152
+ "fast-glob": "^3.3.0",
28153
+ "glob-parent": "^6.0.2",
28154
+ "is-glob": "^4.0.3",
28155
+ "jiti": "^1.21.0",
28156
+ "lilconfig": "^2.1.0",
28157
+ "micromatch": "^4.0.5",
28158
+ "normalize-path": "^3.0.0",
28159
+ "object-hash": "^3.0.0",
28160
+ "picocolors": "^1.0.0",
28161
+ "postcss": "^8.4.23",
28162
+ "postcss-import": "^15.1.0",
28163
+ "postcss-js": "^4.0.1",
28164
+ "postcss-load-config": "^4.0.1",
28165
+ "postcss-nested": "^6.0.1",
28166
+ "postcss-selector-parser": "^6.0.11",
28167
+ "resolve": "^1.22.2",
28168
+ "sucrase": "^3.32.0"
28169
+ },
28170
+ "bin": {
28171
+ "tailwind": "lib/cli.js",
28172
+ "tailwindcss": "lib/cli.js"
28173
+ },
28174
+ "engines": {
28175
+ "node": ">=14.0.0"
28176
+ }
28177
+ },
28178
+ "node_modules/tailwindcss-animate": {
28179
+ "version": "1.0.7",
28180
+ "resolved": "https://registry.npmmirror.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
28181
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
28182
+ "peerDependencies": {
28183
+ "tailwindcss": ">=3.0.0 || insiders"
28184
+ }
28185
+ },
28186
+ "node_modules/tailwindcss/node_modules/arg": {
28187
+ "version": "5.0.2",
28188
+ "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz",
28189
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
28190
+ },
28191
+ "node_modules/tailwindcss/node_modules/fast-glob": {
28192
+ "version": "3.3.2",
28193
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
28194
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
28195
+ "dependencies": {
28196
+ "@nodelib/fs.stat": "^2.0.2",
28197
+ "@nodelib/fs.walk": "^1.2.3",
28198
+ "glob-parent": "^5.1.2",
28199
+ "merge2": "^1.3.0",
28200
+ "micromatch": "^4.0.4"
28201
+ },
28202
+ "engines": {
28203
+ "node": ">=8.6.0"
28204
+ }
28205
+ },
28206
+ "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": {
28207
+ "version": "5.1.2",
28208
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
28209
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
28210
+ "dependencies": {
28211
+ "is-glob": "^4.0.1"
28212
+ },
28213
+ "engines": {
28214
+ "node": ">= 6"
28215
+ }
28216
+ },
28217
+ "node_modules/tailwindcss/node_modules/glob-parent": {
28218
+ "version": "6.0.2",
28219
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
28220
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
28221
+ "dependencies": {
28222
+ "is-glob": "^4.0.3"
28223
+ },
28224
+ "engines": {
28225
+ "node": ">=10.13.0"
28226
+ }
28227
+ },
28228
+ "node_modules/tailwindcss/node_modules/lilconfig": {
28229
+ "version": "2.1.0",
28230
+ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
28231
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
28232
+ "engines": {
28233
+ "node": ">=10"
28234
+ }
28235
+ },
28236
+ "node_modules/tailwindcss/node_modules/resolve": {
28237
+ "version": "1.22.8",
28238
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
28239
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
28240
+ "dependencies": {
28241
+ "is-core-module": "^2.13.0",
28242
+ "path-parse": "^1.0.7",
28243
+ "supports-preserve-symlinks-flag": "^1.0.0"
28244
+ },
28245
+ "bin": {
28246
+ "resolve": "bin/resolve"
28247
+ },
28248
+ "funding": {
28249
+ "url": "https://github.com/sponsors/ljharb"
28250
+ }
28251
+ },
28252
  "node_modules/tapable": {
28253
  "version": "2.2.1",
28254
  "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
 
28362
  "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
28363
  "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
28364
  },
28365
+ "node_modules/thenify": {
28366
+ "version": "3.3.1",
28367
+ "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz",
28368
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
28369
+ "dependencies": {
28370
+ "any-promise": "^1.0.0"
28371
+ }
28372
+ },
28373
+ "node_modules/thenify-all": {
28374
+ "version": "1.6.0",
28375
+ "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz",
28376
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
28377
+ "dependencies": {
28378
+ "thenify": ">= 3.1.0 < 4"
28379
+ },
28380
+ "engines": {
28381
+ "node": ">=0.8"
28382
+ }
28383
+ },
28384
  "node_modules/thread-stream": {
28385
  "version": "0.15.2",
28386
  "resolved": "https://registry.npmmirror.com/thread-stream/-/thread-stream-0.15.2.tgz",
 
28678
  "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz",
28679
  "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="
28680
  },
28681
+ "node_modules/ts-interface-checker": {
28682
+ "version": "0.1.13",
28683
+ "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
28684
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
28685
+ },
28686
  "node_modules/ts-node": {
28687
  "version": "10.9.2",
28688
  "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz",
28689
  "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
28690
+ "devOptional": true,
28691
  "dependencies": {
28692
  "@cspotcode/source-map-support": "^0.8.0",
28693
  "@tsconfig/node10": "^1.0.7",
 
29367
  "node": ">=0.10.0"
29368
  }
29369
  },
29370
+ "node_modules/use-callback-ref": {
29371
+ "version": "1.3.2",
29372
+ "resolved": "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
29373
+ "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
29374
+ "dependencies": {
29375
+ "tslib": "^2.0.0"
29376
+ },
29377
+ "engines": {
29378
+ "node": ">=10"
29379
+ },
29380
+ "peerDependencies": {
29381
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
29382
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
29383
+ },
29384
+ "peerDependenciesMeta": {
29385
+ "@types/react": {
29386
+ "optional": true
29387
+ }
29388
+ }
29389
+ },
29390
  "node_modules/use-isomorphic-layout-effect": {
29391
  "version": "1.1.2",
29392
  "resolved": "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
 
29400
  }
29401
  }
29402
  },
29403
+ "node_modules/use-sidecar": {
29404
+ "version": "1.1.2",
29405
+ "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.2.tgz",
29406
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
29407
+ "dependencies": {
29408
+ "detect-node-es": "^1.1.0",
29409
+ "tslib": "^2.0.0"
29410
+ },
29411
+ "engines": {
29412
+ "node": ">=10"
29413
+ },
29414
+ "peerDependencies": {
29415
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
29416
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
29417
+ },
29418
+ "peerDependenciesMeta": {
29419
+ "@types/react": {
29420
+ "optional": true
29421
+ }
29422
+ }
29423
+ },
29424
  "node_modules/use-sync-external-store": {
29425
  "version": "1.2.0",
29426
  "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
 
29542
  "version": "3.0.1",
29543
  "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
29544
  "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
29545
+ "devOptional": true
29546
  },
29547
  "node_modules/v8-to-istanbul": {
29548
  "version": "9.2.0",
 
30655
  "version": "3.1.1",
30656
  "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz",
30657
  "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
30658
+ "devOptional": true,
30659
  "engines": {
30660
  "node": ">=6"
30661
  }
 
30668
  "node": ">=10"
30669
  }
30670
  },
30671
+ "node_modules/zod": {
30672
+ "version": "3.23.8",
30673
+ "resolved": "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz",
30674
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
30675
+ "funding": {
30676
+ "url": "https://github.com/sponsors/colinhacks"
30677
+ }
30678
+ },
30679
  "node_modules/zustand": {
30680
  "version": "4.5.2",
30681
  "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
web/package.json CHANGED
@@ -21,15 +21,27 @@
21
  "@ant-design/pro-components": "^2.6.46",
22
  "@ant-design/pro-layout": "^7.17.16",
23
  "@antv/g6": "^5.0.10",
 
24
  "@js-preview/excel": "^1.7.8",
25
  "@monaco-editor/react": "^4.6.0",
 
 
 
 
 
 
 
 
 
26
  "@tanstack/react-query": "^5.40.0",
27
  "@tanstack/react-query-devtools": "^5.51.5",
28
  "@uiw/react-markdown-preview": "^5.1.3",
29
  "ahooks": "^3.7.10",
30
  "antd": "^5.12.7",
31
  "axios": "^1.6.3",
 
32
  "classnames": "^2.5.1",
 
33
  "dayjs": "^1.11.10",
34
  "dompurify": "^3.1.6",
35
  "eventsource-parser": "^1.1.2",
@@ -37,15 +49,18 @@
37
  "i18next": "^23.7.16",
38
  "i18next-browser-languagedetector": "^8.0.0",
39
  "immer": "^10.1.1",
 
40
  "js-base64": "^3.7.5",
41
  "jsencrypt": "^3.3.2",
42
  "lodash": "^4.17.21",
 
43
  "mammoth": "^1.7.2",
44
  "openai-speech-stream-player": "^1.0.8",
45
  "rc-tween-one": "^3.0.6",
46
  "react-copy-to-clipboard": "^5.1.0",
47
  "react-error-boundary": "^4.0.13",
48
  "react-force-graph": "^1.44.4",
 
49
  "react-i18next": "^14.0.0",
50
  "react-markdown": "^9.0.1",
51
  "react-pdf-highlighter": "^6.1.0",
@@ -56,10 +71,13 @@
56
  "recharts": "^2.12.4",
57
  "rehype-raw": "^7.0.0",
58
  "remark-gfm": "^4.0.0",
 
 
59
  "umi": "^4.0.90",
60
  "umi-request": "^1.4.0",
61
  "unist-util-visit-parents": "^6.0.1",
62
  "uuid": "^9.0.1",
 
63
  "zustand": "^4.5.2"
64
  },
65
  "devDependencies": {
@@ -90,6 +108,7 @@
90
  "prettier-plugin-packagejson": "^2.4.9",
91
  "react-dev-inspector": "^2.0.1",
92
  "remark-loader": "^6.0.0",
 
93
  "ts-node": "^10.9.2",
94
  "typescript": "^5.0.3",
95
  "umi-plugin-icons": "^0.1.1"
 
21
  "@ant-design/pro-components": "^2.6.46",
22
  "@ant-design/pro-layout": "^7.17.16",
23
  "@antv/g6": "^5.0.10",
24
+ "@hookform/resolvers": "^3.9.1",
25
  "@js-preview/excel": "^1.7.8",
26
  "@monaco-editor/react": "^4.6.0",
27
+ "@radix-ui/react-checkbox": "^1.1.2",
28
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
29
+ "@radix-ui/react-icons": "^1.3.1",
30
+ "@radix-ui/react-label": "^2.1.0",
31
+ "@radix-ui/react-select": "^2.1.2",
32
+ "@radix-ui/react-separator": "^1.1.0",
33
+ "@radix-ui/react-slot": "^1.1.0",
34
+ "@radix-ui/react-switch": "^1.1.1",
35
+ "@radix-ui/react-toast": "^1.2.2",
36
  "@tanstack/react-query": "^5.40.0",
37
  "@tanstack/react-query-devtools": "^5.51.5",
38
  "@uiw/react-markdown-preview": "^5.1.3",
39
  "ahooks": "^3.7.10",
40
  "antd": "^5.12.7",
41
  "axios": "^1.6.3",
42
+ "class-variance-authority": "^0.7.0",
43
  "classnames": "^2.5.1",
44
+ "clsx": "^2.1.1",
45
  "dayjs": "^1.11.10",
46
  "dompurify": "^3.1.6",
47
  "eventsource-parser": "^1.1.2",
 
49
  "i18next": "^23.7.16",
50
  "i18next-browser-languagedetector": "^8.0.0",
51
  "immer": "^10.1.1",
52
+ "input-otp": "^1.4.1",
53
  "js-base64": "^3.7.5",
54
  "jsencrypt": "^3.3.2",
55
  "lodash": "^4.17.21",
56
+ "lucide-react": "^0.454.0",
57
  "mammoth": "^1.7.2",
58
  "openai-speech-stream-player": "^1.0.8",
59
  "rc-tween-one": "^3.0.6",
60
  "react-copy-to-clipboard": "^5.1.0",
61
  "react-error-boundary": "^4.0.13",
62
  "react-force-graph": "^1.44.4",
63
+ "react-hook-form": "^7.53.1",
64
  "react-i18next": "^14.0.0",
65
  "react-markdown": "^9.0.1",
66
  "react-pdf-highlighter": "^6.1.0",
 
71
  "recharts": "^2.12.4",
72
  "rehype-raw": "^7.0.0",
73
  "remark-gfm": "^4.0.0",
74
+ "tailwind-merge": "^2.5.4",
75
+ "tailwindcss-animate": "^1.0.7",
76
  "umi": "^4.0.90",
77
  "umi-request": "^1.4.0",
78
  "unist-util-visit-parents": "^6.0.1",
79
  "uuid": "^9.0.1",
80
+ "zod": "^3.23.8",
81
  "zustand": "^4.5.2"
82
  },
83
  "devDependencies": {
 
108
  "prettier-plugin-packagejson": "^2.4.9",
109
  "react-dev-inspector": "^2.0.1",
110
  "remark-loader": "^6.0.0",
111
+ "tailwindcss": "^3",
112
  "ts-node": "^10.9.2",
113
  "typescript": "^5.0.3",
114
  "umi-plugin-icons": "^0.1.1"
web/src/app.tsx CHANGED
@@ -13,6 +13,7 @@ import weekOfYear from 'dayjs/plugin/weekOfYear';
13
  import weekYear from 'dayjs/plugin/weekYear';
14
  import weekday from 'dayjs/plugin/weekday';
15
  import React, { ReactNode, useEffect, useState } from 'react';
 
16
  import storage from './utils/authorization-util';
17
 
18
  dayjs.extend(customParseFormat);
@@ -53,17 +54,19 @@ const RootProvider = ({ children }: React.PropsWithChildren) => {
53
 
54
  return (
55
  <QueryClientProvider client={queryClient}>
56
- <ConfigProvider
57
- theme={{
58
- token: {
59
- fontFamily: 'Inter',
60
- },
61
- }}
62
- locale={locale}
63
- >
64
- <App> {children}</App>
65
- </ConfigProvider>
66
- <ReactQueryDevtools buttonPosition={'top-left'} />
 
 
67
  </QueryClientProvider>
68
  );
69
  };
 
13
  import weekYear from 'dayjs/plugin/weekYear';
14
  import weekday from 'dayjs/plugin/weekday';
15
  import React, { ReactNode, useEffect, useState } from 'react';
16
+ import { ThemeProvider } from './components/theme-provider';
17
  import storage from './utils/authorization-util';
18
 
19
  dayjs.extend(customParseFormat);
 
54
 
55
  return (
56
  <QueryClientProvider client={queryClient}>
57
+ <ThemeProvider defaultTheme="light" storageKey="ragflow-ui-theme">
58
+ <ConfigProvider
59
+ theme={{
60
+ token: {
61
+ fontFamily: 'Inter',
62
+ },
63
+ }}
64
+ locale={locale}
65
+ >
66
+ <App> {children}</App>
67
+ </ConfigProvider>
68
+ <ReactQueryDevtools buttonPosition={'top-left'} />
69
+ </ThemeProvider>
70
  </QueryClientProvider>
71
  );
72
  };
web/src/components/hooks/use-toast.tsx ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ // Inspired by react-hot-toast library
4
+ import * as React from 'react';
5
+
6
+ import type { ToastActionElement, ToastProps } from '@/components/ui/toast';
7
+
8
+ const TOAST_LIMIT = 1;
9
+ const TOAST_REMOVE_DELAY = 1000000;
10
+
11
+ type ToasterToast = ToastProps & {
12
+ id: string;
13
+ title?: React.ReactNode;
14
+ description?: React.ReactNode;
15
+ action?: ToastActionElement;
16
+ };
17
+
18
+ const actionTypes = {
19
+ ADD_TOAST: 'ADD_TOAST',
20
+ UPDATE_TOAST: 'UPDATE_TOAST',
21
+ DISMISS_TOAST: 'DISMISS_TOAST',
22
+ REMOVE_TOAST: 'REMOVE_TOAST',
23
+ } as const;
24
+
25
+ let count = 0;
26
+
27
+ function genId() {
28
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
29
+ return count.toString();
30
+ }
31
+
32
+ type ActionType = typeof actionTypes;
33
+
34
+ type Action =
35
+ | {
36
+ type: ActionType['ADD_TOAST'];
37
+ toast: ToasterToast;
38
+ }
39
+ | {
40
+ type: ActionType['UPDATE_TOAST'];
41
+ toast: Partial<ToasterToast>;
42
+ }
43
+ | {
44
+ type: ActionType['DISMISS_TOAST'];
45
+ toastId?: ToasterToast['id'];
46
+ }
47
+ | {
48
+ type: ActionType['REMOVE_TOAST'];
49
+ toastId?: ToasterToast['id'];
50
+ };
51
+
52
+ interface State {
53
+ toasts: ToasterToast[];
54
+ }
55
+
56
+ const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
57
+
58
+ const addToRemoveQueue = (toastId: string) => {
59
+ if (toastTimeouts.has(toastId)) {
60
+ return;
61
+ }
62
+
63
+ const timeout = setTimeout(() => {
64
+ toastTimeouts.delete(toastId);
65
+ dispatch({
66
+ type: 'REMOVE_TOAST',
67
+ toastId: toastId,
68
+ });
69
+ }, TOAST_REMOVE_DELAY);
70
+
71
+ toastTimeouts.set(toastId, timeout);
72
+ };
73
+
74
+ export const reducer = (state: State, action: Action): State => {
75
+ switch (action.type) {
76
+ case 'ADD_TOAST':
77
+ return {
78
+ ...state,
79
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
80
+ };
81
+
82
+ case 'UPDATE_TOAST':
83
+ return {
84
+ ...state,
85
+ toasts: state.toasts.map((t) =>
86
+ t.id === action.toast.id ? { ...t, ...action.toast } : t,
87
+ ),
88
+ };
89
+
90
+ case 'DISMISS_TOAST': {
91
+ const { toastId } = action;
92
+
93
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
94
+ // but I'll keep it here for simplicity
95
+ if (toastId) {
96
+ addToRemoveQueue(toastId);
97
+ } else {
98
+ state.toasts.forEach((toast) => {
99
+ addToRemoveQueue(toast.id);
100
+ });
101
+ }
102
+
103
+ return {
104
+ ...state,
105
+ toasts: state.toasts.map((t) =>
106
+ t.id === toastId || toastId === undefined
107
+ ? {
108
+ ...t,
109
+ open: false,
110
+ }
111
+ : t,
112
+ ),
113
+ };
114
+ }
115
+ case 'REMOVE_TOAST':
116
+ if (action.toastId === undefined) {
117
+ return {
118
+ ...state,
119
+ toasts: [],
120
+ };
121
+ }
122
+ return {
123
+ ...state,
124
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
125
+ };
126
+ }
127
+ };
128
+
129
+ const listeners: Array<(state: State) => void> = [];
130
+
131
+ let memoryState: State = { toasts: [] };
132
+
133
+ function dispatch(action: Action) {
134
+ memoryState = reducer(memoryState, action);
135
+ listeners.forEach((listener) => {
136
+ listener(memoryState);
137
+ });
138
+ }
139
+
140
+ type Toast = Omit<ToasterToast, 'id'>;
141
+
142
+ function toast({ ...props }: Toast) {
143
+ const id = genId();
144
+
145
+ const update = (props: ToasterToast) =>
146
+ dispatch({
147
+ type: 'UPDATE_TOAST',
148
+ toast: { ...props, id },
149
+ });
150
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
151
+
152
+ dispatch({
153
+ type: 'ADD_TOAST',
154
+ toast: {
155
+ ...props,
156
+ id,
157
+ open: true,
158
+ onOpenChange: (open) => {
159
+ if (!open) dismiss();
160
+ },
161
+ },
162
+ });
163
+
164
+ return {
165
+ id: id,
166
+ dismiss,
167
+ update,
168
+ };
169
+ }
170
+
171
+ function useToast() {
172
+ const [state, setState] = React.useState<State>(memoryState);
173
+
174
+ React.useEffect(() => {
175
+ listeners.push(setState);
176
+ return () => {
177
+ const index = listeners.indexOf(setState);
178
+ if (index > -1) {
179
+ listeners.splice(index, 1);
180
+ }
181
+ };
182
+ }, [state]);
183
+
184
+ return {
185
+ ...state,
186
+ toast,
187
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),
188
+ };
189
+ }
190
+
191
+ export { toast, useToast };
web/src/components/theme-provider.tsx ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { createContext, useContext, useEffect, useState } from 'react';
2
+
3
+ type Theme = 'dark' | 'light' | 'system';
4
+
5
+ type ThemeProviderProps = {
6
+ children: React.ReactNode;
7
+ defaultTheme?: Theme;
8
+ storageKey?: string;
9
+ };
10
+
11
+ type ThemeProviderState = {
12
+ theme: Theme;
13
+ setTheme: (theme: Theme) => void;
14
+ };
15
+
16
+ const initialState: ThemeProviderState = {
17
+ theme: 'system',
18
+ setTheme: () => null,
19
+ };
20
+
21
+ const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
22
+
23
+ export function ThemeProvider({
24
+ children,
25
+ defaultTheme = 'system',
26
+ storageKey = 'vite-ui-theme',
27
+ ...props
28
+ }: ThemeProviderProps) {
29
+ const [theme, setTheme] = useState<Theme>(
30
+ () => (localStorage.getItem(storageKey) as Theme) || defaultTheme,
31
+ );
32
+
33
+ useEffect(() => {
34
+ const root = window.document.documentElement;
35
+
36
+ root.classList.remove('light', 'dark');
37
+
38
+ if (theme === 'system') {
39
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)')
40
+ .matches
41
+ ? 'dark'
42
+ : 'light';
43
+
44
+ root.classList.add(systemTheme);
45
+ return;
46
+ }
47
+
48
+ root.classList.add(theme);
49
+ }, [theme]);
50
+
51
+ const value = {
52
+ theme,
53
+ setTheme: (theme: Theme) => {
54
+ localStorage.setItem(storageKey, theme);
55
+ setTheme(theme);
56
+ },
57
+ };
58
+
59
+ return (
60
+ <ThemeProviderContext.Provider {...props} value={value}>
61
+ {children}
62
+ </ThemeProviderContext.Provider>
63
+ );
64
+ }
65
+
66
+ export const useTheme = () => {
67
+ const context = useContext(ThemeProviderContext);
68
+
69
+ if (context === undefined)
70
+ throw new Error('useTheme must be used within a ThemeProvider');
71
+
72
+ return context;
73
+ };
web/src/components/ui/button.tsx ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Slot } from '@radix-ui/react-slot';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+
5
+ import { cn } from '@/lib/utils';
6
+
7
+ const buttonVariants = cva(
8
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
13
+ destructive:
14
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
15
+ outline:
16
+ 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
17
+ secondary:
18
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
19
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
20
+ link: 'text-primary underline-offset-4 hover:underline',
21
+ },
22
+ size: {
23
+ default: 'h-10 px-4 py-2',
24
+ sm: 'h-9 rounded-md px-3',
25
+ lg: 'h-11 rounded-md px-8',
26
+ icon: 'h-10 w-10',
27
+ },
28
+ },
29
+ defaultVariants: {
30
+ variant: 'default',
31
+ size: 'default',
32
+ },
33
+ },
34
+ );
35
+
36
+ export interface ButtonProps
37
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
38
+ VariantProps<typeof buttonVariants> {
39
+ asChild?: boolean;
40
+ }
41
+
42
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
43
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
44
+ const Comp = asChild ? Slot : 'button';
45
+ return (
46
+ <Comp
47
+ className={cn(buttonVariants({ variant, size, className }))}
48
+ ref={ref}
49
+ {...props}
50
+ />
51
+ );
52
+ },
53
+ );
54
+ Button.displayName = 'Button';
55
+
56
+ export { Button, buttonVariants };
web/src/components/ui/card.tsx ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from 'react';
2
+
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const Card = React.forwardRef<
6
+ HTMLDivElement,
7
+ React.HTMLAttributes<HTMLDivElement>
8
+ >(({ className, ...props }, ref) => (
9
+ <div
10
+ ref={ref}
11
+ className={cn(
12
+ 'rounded-lg border bg-card text-card-foreground shadow-sm',
13
+ className,
14
+ )}
15
+ {...props}
16
+ />
17
+ ));
18
+ Card.displayName = 'Card';
19
+
20
+ const CardHeader = React.forwardRef<
21
+ HTMLDivElement,
22
+ React.HTMLAttributes<HTMLDivElement>
23
+ >(({ className, ...props }, ref) => (
24
+ <div
25
+ ref={ref}
26
+ className={cn('flex flex-col space-y-1.5 p-6', className)}
27
+ {...props}
28
+ />
29
+ ));
30
+ CardHeader.displayName = 'CardHeader';
31
+
32
+ const CardTitle = React.forwardRef<
33
+ HTMLDivElement,
34
+ React.HTMLAttributes<HTMLDivElement>
35
+ >(({ className, ...props }, ref) => (
36
+ <div
37
+ ref={ref}
38
+ className={cn(
39
+ 'text-2xl font-semibold leading-none tracking-tight',
40
+ className,
41
+ )}
42
+ {...props}
43
+ />
44
+ ));
45
+ CardTitle.displayName = 'CardTitle';
46
+
47
+ const CardDescription = React.forwardRef<
48
+ HTMLDivElement,
49
+ React.HTMLAttributes<HTMLDivElement>
50
+ >(({ className, ...props }, ref) => (
51
+ <div
52
+ ref={ref}
53
+ className={cn('text-sm text-muted-foreground', className)}
54
+ {...props}
55
+ />
56
+ ));
57
+ CardDescription.displayName = 'CardDescription';
58
+
59
+ const CardContent = React.forwardRef<
60
+ HTMLDivElement,
61
+ React.HTMLAttributes<HTMLDivElement>
62
+ >(({ className, ...props }, ref) => (
63
+ <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />
64
+ ));
65
+ CardContent.displayName = 'CardContent';
66
+
67
+ const CardFooter = React.forwardRef<
68
+ HTMLDivElement,
69
+ React.HTMLAttributes<HTMLDivElement>
70
+ >(({ className, ...props }, ref) => (
71
+ <div
72
+ ref={ref}
73
+ className={cn('flex items-center p-6 pt-0', className)}
74
+ {...props}
75
+ />
76
+ ));
77
+ CardFooter.displayName = 'CardFooter';
78
+
79
+ export {
80
+ Card,
81
+ CardContent,
82
+ CardDescription,
83
+ CardFooter,
84
+ CardHeader,
85
+ CardTitle,
86
+ };
web/src/components/ui/checkbox.tsx ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
4
+ import { Check } from 'lucide-react';
5
+ import * as React from 'react';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const Checkbox = React.forwardRef<
10
+ React.ElementRef<typeof CheckboxPrimitive.Root>,
11
+ React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
12
+ >(({ className, ...props }, ref) => (
13
+ <CheckboxPrimitive.Root
14
+ ref={ref}
15
+ className={cn(
16
+ 'peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',
17
+ className,
18
+ )}
19
+ {...props}
20
+ >
21
+ <CheckboxPrimitive.Indicator
22
+ className={cn('flex items-center justify-center text-current')}
23
+ >
24
+ <Check className="h-4 w-4" />
25
+ </CheckboxPrimitive.Indicator>
26
+ </CheckboxPrimitive.Root>
27
+ ));
28
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
29
+
30
+ export { Checkbox };
web/src/components/ui/dropdown-menu.tsx ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
4
+ import { Check, ChevronRight, Circle } from 'lucide-react';
5
+ import * as React from 'react';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const DropdownMenu = DropdownMenuPrimitive.Root;
10
+
11
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
12
+
13
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group;
14
+
15
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
16
+
17
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
18
+
19
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
20
+
21
+ const DropdownMenuSubTrigger = React.forwardRef<
22
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
23
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
24
+ inset?: boolean;
25
+ }
26
+ >(({ className, inset, children, ...props }, ref) => (
27
+ <DropdownMenuPrimitive.SubTrigger
28
+ ref={ref}
29
+ className={cn(
30
+ 'flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
31
+ inset && 'pl-8',
32
+ className,
33
+ )}
34
+ {...props}
35
+ >
36
+ {children}
37
+ <ChevronRight className="ml-auto" />
38
+ </DropdownMenuPrimitive.SubTrigger>
39
+ ));
40
+ DropdownMenuSubTrigger.displayName =
41
+ DropdownMenuPrimitive.SubTrigger.displayName;
42
+
43
+ const DropdownMenuSubContent = React.forwardRef<
44
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
45
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
46
+ >(({ className, ...props }, ref) => (
47
+ <DropdownMenuPrimitive.SubContent
48
+ ref={ref}
49
+ className={cn(
50
+ 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
51
+ className,
52
+ )}
53
+ {...props}
54
+ />
55
+ ));
56
+ DropdownMenuSubContent.displayName =
57
+ DropdownMenuPrimitive.SubContent.displayName;
58
+
59
+ const DropdownMenuContent = React.forwardRef<
60
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
61
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
62
+ >(({ className, sideOffset = 4, ...props }, ref) => (
63
+ <DropdownMenuPrimitive.Portal>
64
+ <DropdownMenuPrimitive.Content
65
+ ref={ref}
66
+ sideOffset={sideOffset}
67
+ className={cn(
68
+ 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
69
+ className,
70
+ )}
71
+ {...props}
72
+ />
73
+ </DropdownMenuPrimitive.Portal>
74
+ ));
75
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
76
+
77
+ const DropdownMenuItem = React.forwardRef<
78
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
79
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
80
+ inset?: boolean;
81
+ }
82
+ >(({ className, inset, ...props }, ref) => (
83
+ <DropdownMenuPrimitive.Item
84
+ ref={ref}
85
+ className={cn(
86
+ 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
87
+ inset && 'pl-8',
88
+ className,
89
+ )}
90
+ {...props}
91
+ />
92
+ ));
93
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
94
+
95
+ const DropdownMenuCheckboxItem = React.forwardRef<
96
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
97
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
98
+ >(({ className, children, checked, ...props }, ref) => (
99
+ <DropdownMenuPrimitive.CheckboxItem
100
+ ref={ref}
101
+ className={cn(
102
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
103
+ className,
104
+ )}
105
+ checked={checked}
106
+ {...props}
107
+ >
108
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
109
+ <DropdownMenuPrimitive.ItemIndicator>
110
+ <Check className="h-4 w-4" />
111
+ </DropdownMenuPrimitive.ItemIndicator>
112
+ </span>
113
+ {children}
114
+ </DropdownMenuPrimitive.CheckboxItem>
115
+ ));
116
+ DropdownMenuCheckboxItem.displayName =
117
+ DropdownMenuPrimitive.CheckboxItem.displayName;
118
+
119
+ const DropdownMenuRadioItem = React.forwardRef<
120
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
121
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
122
+ >(({ className, children, ...props }, ref) => (
123
+ <DropdownMenuPrimitive.RadioItem
124
+ ref={ref}
125
+ className={cn(
126
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
127
+ className,
128
+ )}
129
+ {...props}
130
+ >
131
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
132
+ <DropdownMenuPrimitive.ItemIndicator>
133
+ <Circle className="h-2 w-2 fill-current" />
134
+ </DropdownMenuPrimitive.ItemIndicator>
135
+ </span>
136
+ {children}
137
+ </DropdownMenuPrimitive.RadioItem>
138
+ ));
139
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
140
+
141
+ const DropdownMenuLabel = React.forwardRef<
142
+ React.ElementRef<typeof DropdownMenuPrimitive.Label>,
143
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
144
+ inset?: boolean;
145
+ }
146
+ >(({ className, inset, ...props }, ref) => (
147
+ <DropdownMenuPrimitive.Label
148
+ ref={ref}
149
+ className={cn(
150
+ 'px-2 py-1.5 text-sm font-semibold',
151
+ inset && 'pl-8',
152
+ className,
153
+ )}
154
+ {...props}
155
+ />
156
+ ));
157
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
158
+
159
+ const DropdownMenuSeparator = React.forwardRef<
160
+ React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
161
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
162
+ >(({ className, ...props }, ref) => (
163
+ <DropdownMenuPrimitive.Separator
164
+ ref={ref}
165
+ className={cn('-mx-1 my-1 h-px bg-muted', className)}
166
+ {...props}
167
+ />
168
+ ));
169
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
170
+
171
+ const DropdownMenuShortcut = ({
172
+ className,
173
+ ...props
174
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
175
+ return (
176
+ <span
177
+ className={cn('ml-auto text-xs tracking-widest opacity-60', className)}
178
+ {...props}
179
+ />
180
+ );
181
+ };
182
+ DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
183
+
184
+ export {
185
+ DropdownMenu,
186
+ DropdownMenuCheckboxItem,
187
+ DropdownMenuContent,
188
+ DropdownMenuGroup,
189
+ DropdownMenuItem,
190
+ DropdownMenuLabel,
191
+ DropdownMenuPortal,
192
+ DropdownMenuRadioGroup,
193
+ DropdownMenuRadioItem,
194
+ DropdownMenuSeparator,
195
+ DropdownMenuShortcut,
196
+ DropdownMenuSub,
197
+ DropdownMenuSubContent,
198
+ DropdownMenuSubTrigger,
199
+ DropdownMenuTrigger,
200
+ };
web/src/components/ui/form.tsx ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as LabelPrimitive from '@radix-ui/react-label';
4
+ import { Slot } from '@radix-ui/react-slot';
5
+ import * as React from 'react';
6
+ import {
7
+ Controller,
8
+ ControllerProps,
9
+ FieldPath,
10
+ FieldValues,
11
+ FormProvider,
12
+ useFormContext,
13
+ } from 'react-hook-form';
14
+
15
+ import { Label } from '@/components/ui/label';
16
+ import { cn } from '@/lib/utils';
17
+
18
+ const Form = FormProvider;
19
+
20
+ type FormItemContextValue = {
21
+ id: string;
22
+ };
23
+
24
+ const FormItemContext = React.createContext<FormItemContextValue>(
25
+ {} as FormItemContextValue,
26
+ );
27
+
28
+ type FormFieldContextValue<
29
+ TFieldValues extends FieldValues = FieldValues,
30
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
31
+ > = {
32
+ name: TName;
33
+ };
34
+
35
+ const FormFieldContext = React.createContext<FormFieldContextValue>(
36
+ {} as FormFieldContextValue,
37
+ );
38
+
39
+ const FormField = <
40
+ TFieldValues extends FieldValues = FieldValues,
41
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
42
+ >({
43
+ ...props
44
+ }: ControllerProps<TFieldValues, TName>) => {
45
+ return (
46
+ <FormFieldContext.Provider value={{ name: props.name }}>
47
+ <Controller {...props} />
48
+ </FormFieldContext.Provider>
49
+ );
50
+ };
51
+
52
+ const useFormField = () => {
53
+ const fieldContext = React.useContext(FormFieldContext);
54
+ const itemContext = React.useContext(FormItemContext);
55
+ const { getFieldState, formState } = useFormContext();
56
+
57
+ const fieldState = getFieldState(fieldContext.name, formState);
58
+
59
+ if (!fieldContext) {
60
+ throw new Error('useFormField should be used within <FormField>');
61
+ }
62
+
63
+ const { id } = itemContext;
64
+
65
+ return {
66
+ id,
67
+ name: fieldContext.name,
68
+ formItemId: `${id}-form-item`,
69
+ formDescriptionId: `${id}-form-item-description`,
70
+ formMessageId: `${id}-form-item-message`,
71
+ ...fieldState,
72
+ };
73
+ };
74
+
75
+ const FormItem = React.forwardRef<
76
+ HTMLDivElement,
77
+ React.HTMLAttributes<HTMLDivElement>
78
+ >(({ className, ...props }, ref) => {
79
+ const id = React.useId();
80
+
81
+ return (
82
+ <FormItemContext.Provider value={{ id }}>
83
+ <div ref={ref} className={cn('space-y-2', className)} {...props} />
84
+ </FormItemContext.Provider>
85
+ );
86
+ });
87
+ FormItem.displayName = 'FormItem';
88
+
89
+ const FormLabel = React.forwardRef<
90
+ React.ElementRef<typeof LabelPrimitive.Root>,
91
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
92
+ >(({ className, ...props }, ref) => {
93
+ const { error, formItemId } = useFormField();
94
+
95
+ return (
96
+ <Label
97
+ ref={ref}
98
+ className={cn(error && 'text-destructive', className)}
99
+ htmlFor={formItemId}
100
+ {...props}
101
+ />
102
+ );
103
+ });
104
+ FormLabel.displayName = 'FormLabel';
105
+
106
+ const FormControl = React.forwardRef<
107
+ React.ElementRef<typeof Slot>,
108
+ React.ComponentPropsWithoutRef<typeof Slot>
109
+ >(({ ...props }, ref) => {
110
+ const { error, formItemId, formDescriptionId, formMessageId } =
111
+ useFormField();
112
+
113
+ return (
114
+ <Slot
115
+ ref={ref}
116
+ id={formItemId}
117
+ aria-describedby={
118
+ !error
119
+ ? `${formDescriptionId}`
120
+ : `${formDescriptionId} ${formMessageId}`
121
+ }
122
+ aria-invalid={!!error}
123
+ {...props}
124
+ />
125
+ );
126
+ });
127
+ FormControl.displayName = 'FormControl';
128
+
129
+ const FormDescription = React.forwardRef<
130
+ HTMLParagraphElement,
131
+ React.HTMLAttributes<HTMLParagraphElement>
132
+ >(({ className, ...props }, ref) => {
133
+ const { formDescriptionId } = useFormField();
134
+
135
+ return (
136
+ <p
137
+ ref={ref}
138
+ id={formDescriptionId}
139
+ className={cn('text-sm text-muted-foreground', className)}
140
+ {...props}
141
+ />
142
+ );
143
+ });
144
+ FormDescription.displayName = 'FormDescription';
145
+
146
+ const FormMessage = React.forwardRef<
147
+ HTMLParagraphElement,
148
+ React.HTMLAttributes<HTMLParagraphElement>
149
+ >(({ className, children, ...props }, ref) => {
150
+ const { error, formMessageId } = useFormField();
151
+ const body = error ? String(error?.message) : children;
152
+
153
+ if (!body) {
154
+ return null;
155
+ }
156
+
157
+ return (
158
+ <p
159
+ ref={ref}
160
+ id={formMessageId}
161
+ className={cn('text-sm font-medium text-destructive', className)}
162
+ {...props}
163
+ >
164
+ {body}
165
+ </p>
166
+ );
167
+ });
168
+ FormMessage.displayName = 'FormMessage';
169
+
170
+ export {
171
+ Form,
172
+ FormControl,
173
+ FormDescription,
174
+ FormField,
175
+ FormItem,
176
+ FormLabel,
177
+ FormMessage,
178
+ useFormField,
179
+ };
web/src/components/ui/input-otp.tsx ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import { OTPInput, OTPInputContext } from 'input-otp';
4
+ import { Dot } from 'lucide-react';
5
+ import * as React from 'react';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const InputOTP = React.forwardRef<
10
+ React.ElementRef<typeof OTPInput>,
11
+ React.ComponentPropsWithoutRef<typeof OTPInput>
12
+ >(({ className, containerClassName, ...props }, ref) => (
13
+ <OTPInput
14
+ ref={ref}
15
+ containerClassName={cn(
16
+ 'flex items-center gap-2 has-[:disabled]:opacity-50',
17
+ containerClassName,
18
+ )}
19
+ className={cn('disabled:cursor-not-allowed', className)}
20
+ {...props}
21
+ />
22
+ ));
23
+ InputOTP.displayName = 'InputOTP';
24
+
25
+ const InputOTPGroup = React.forwardRef<
26
+ React.ElementRef<'div'>,
27
+ React.ComponentPropsWithoutRef<'div'>
28
+ >(({ className, ...props }, ref) => (
29
+ <div ref={ref} className={cn('flex items-center', className)} {...props} />
30
+ ));
31
+ InputOTPGroup.displayName = 'InputOTPGroup';
32
+
33
+ const InputOTPSlot = React.forwardRef<
34
+ React.ElementRef<'div'>,
35
+ React.ComponentPropsWithoutRef<'div'> & { index: number }
36
+ >(({ index, className, ...props }, ref) => {
37
+ const inputOTPContext = React.useContext(OTPInputContext);
38
+ const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index];
39
+
40
+ return (
41
+ <div
42
+ ref={ref}
43
+ className={cn(
44
+ 'relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md',
45
+ isActive && 'z-10 ring-2 ring-ring ring-offset-background',
46
+ className,
47
+ )}
48
+ {...props}
49
+ >
50
+ {char}
51
+ {hasFakeCaret && (
52
+ <div className="pointer-events-none absolute inset-0 flex items-center justify-center">
53
+ <div className="h-4 w-px animate-caret-blink bg-foreground duration-1000" />
54
+ </div>
55
+ )}
56
+ </div>
57
+ );
58
+ });
59
+ InputOTPSlot.displayName = 'InputOTPSlot';
60
+
61
+ const InputOTPSeparator = React.forwardRef<
62
+ React.ElementRef<'div'>,
63
+ React.ComponentPropsWithoutRef<'div'>
64
+ >(({ ...props }, ref) => (
65
+ <div ref={ref} role="separator" {...props}>
66
+ <Dot />
67
+ </div>
68
+ ));
69
+ InputOTPSeparator.displayName = 'InputOTPSeparator';
70
+
71
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
web/src/components/ui/input.tsx ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from 'react';
2
+
3
+ import { cn } from '@/lib/utils';
4
+
5
+ export interface InputProps
6
+ extends React.InputHTMLAttributes<HTMLInputElement> {}
7
+
8
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(
9
+ ({ className, type, ...props }, ref) => {
10
+ return (
11
+ <input
12
+ type={type}
13
+ className={cn(
14
+ 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
15
+ className,
16
+ )}
17
+ ref={ref}
18
+ {...props}
19
+ />
20
+ );
21
+ },
22
+ );
23
+ Input.displayName = 'Input';
24
+
25
+ export { Input };
web/src/components/ui/label.tsx ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as LabelPrimitive from '@radix-ui/react-label';
4
+ import { cva, type VariantProps } from 'class-variance-authority';
5
+ import * as React from 'react';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const labelVariants = cva(
10
+ 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
11
+ );
12
+
13
+ const Label = React.forwardRef<
14
+ React.ElementRef<typeof LabelPrimitive.Root>,
15
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
16
+ VariantProps<typeof labelVariants>
17
+ >(({ className, ...props }, ref) => (
18
+ <LabelPrimitive.Root
19
+ ref={ref}
20
+ className={cn(labelVariants(), className)}
21
+ {...props}
22
+ />
23
+ ));
24
+ Label.displayName = LabelPrimitive.Root.displayName;
25
+
26
+ export { Label };
web/src/components/ui/select.tsx ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as SelectPrimitive from '@radix-ui/react-select';
4
+ import { Check, ChevronDown, ChevronUp } from 'lucide-react';
5
+ import * as React from 'react';
6
+
7
+ import { cn } from '@/lib/utils';
8
+
9
+ const Select = SelectPrimitive.Root;
10
+
11
+ const SelectGroup = SelectPrimitive.Group;
12
+
13
+ const SelectValue = SelectPrimitive.Value;
14
+
15
+ const SelectTrigger = React.forwardRef<
16
+ React.ElementRef<typeof SelectPrimitive.Trigger>,
17
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
18
+ >(({ className, children, ...props }, ref) => (
19
+ <SelectPrimitive.Trigger
20
+ ref={ref}
21
+ className={cn(
22
+ 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',
23
+ className,
24
+ )}
25
+ {...props}
26
+ >
27
+ {children}
28
+ <SelectPrimitive.Icon asChild>
29
+ <ChevronDown className="h-4 w-4 opacity-50" />
30
+ </SelectPrimitive.Icon>
31
+ </SelectPrimitive.Trigger>
32
+ ));
33
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
34
+
35
+ const SelectScrollUpButton = React.forwardRef<
36
+ React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
37
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
38
+ >(({ className, ...props }, ref) => (
39
+ <SelectPrimitive.ScrollUpButton
40
+ ref={ref}
41
+ className={cn(
42
+ 'flex cursor-default items-center justify-center py-1',
43
+ className,
44
+ )}
45
+ {...props}
46
+ >
47
+ <ChevronUp className="h-4 w-4" />
48
+ </SelectPrimitive.ScrollUpButton>
49
+ ));
50
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
51
+
52
+ const SelectScrollDownButton = React.forwardRef<
53
+ React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
54
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
55
+ >(({ className, ...props }, ref) => (
56
+ <SelectPrimitive.ScrollDownButton
57
+ ref={ref}
58
+ className={cn(
59
+ 'flex cursor-default items-center justify-center py-1',
60
+ className,
61
+ )}
62
+ {...props}
63
+ >
64
+ <ChevronDown className="h-4 w-4" />
65
+ </SelectPrimitive.ScrollDownButton>
66
+ ));
67
+ SelectScrollDownButton.displayName =
68
+ SelectPrimitive.ScrollDownButton.displayName;
69
+
70
+ const SelectContent = React.forwardRef<
71
+ React.ElementRef<typeof SelectPrimitive.Content>,
72
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
73
+ >(({ className, children, position = 'popper', ...props }, ref) => (
74
+ <SelectPrimitive.Portal>
75
+ <SelectPrimitive.Content
76
+ ref={ref}
77
+ className={cn(
78
+ 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
79
+ position === 'popper' &&
80
+ 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
81
+ className,
82
+ )}
83
+ position={position}
84
+ {...props}
85
+ >
86
+ <SelectScrollUpButton />
87
+ <SelectPrimitive.Viewport
88
+ className={cn(
89
+ 'p-1',
90
+ position === 'popper' &&
91
+ 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',
92
+ )}
93
+ >
94
+ {children}
95
+ </SelectPrimitive.Viewport>
96
+ <SelectScrollDownButton />
97
+ </SelectPrimitive.Content>
98
+ </SelectPrimitive.Portal>
99
+ ));
100
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
101
+
102
+ const SelectLabel = React.forwardRef<
103
+ React.ElementRef<typeof SelectPrimitive.Label>,
104
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
105
+ >(({ className, ...props }, ref) => (
106
+ <SelectPrimitive.Label
107
+ ref={ref}
108
+ className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}
109
+ {...props}
110
+ />
111
+ ));
112
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
113
+
114
+ const SelectItem = React.forwardRef<
115
+ React.ElementRef<typeof SelectPrimitive.Item>,
116
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
117
+ >(({ className, children, ...props }, ref) => (
118
+ <SelectPrimitive.Item
119
+ ref={ref}
120
+ className={cn(
121
+ 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
122
+ className,
123
+ )}
124
+ {...props}
125
+ >
126
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
127
+ <SelectPrimitive.ItemIndicator>
128
+ <Check className="h-4 w-4" />
129
+ </SelectPrimitive.ItemIndicator>
130
+ </span>
131
+
132
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
133
+ </SelectPrimitive.Item>
134
+ ));
135
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
136
+
137
+ const SelectSeparator = React.forwardRef<
138
+ React.ElementRef<typeof SelectPrimitive.Separator>,
139
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
140
+ >(({ className, ...props }, ref) => (
141
+ <SelectPrimitive.Separator
142
+ ref={ref}
143
+ className={cn('-mx-1 my-1 h-px bg-muted', className)}
144
+ {...props}
145
+ />
146
+ ));
147
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
148
+
149
+ export {
150
+ Select,
151
+ SelectContent,
152
+ SelectGroup,
153
+ SelectItem,
154
+ SelectLabel,
155
+ SelectScrollDownButton,
156
+ SelectScrollUpButton,
157
+ SelectSeparator,
158
+ SelectTrigger,
159
+ SelectValue,
160
+ };
web/src/components/ui/separator.tsx ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
4
+ import * as React from 'react';
5
+
6
+ import { cn } from '@/lib/utils';
7
+
8
+ const Separator = React.forwardRef<
9
+ React.ElementRef<typeof SeparatorPrimitive.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
11
+ >(
12
+ (
13
+ { className, orientation = 'horizontal', decorative = true, ...props },
14
+ ref,
15
+ ) => (
16
+ <SeparatorPrimitive.Root
17
+ ref={ref}
18
+ decorative={decorative}
19
+ orientation={orientation}
20
+ className={cn(
21
+ 'shrink-0 bg-border',
22
+ orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',
23
+ className,
24
+ )}
25
+ {...props}
26
+ />
27
+ ),
28
+ );
29
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
30
+
31
+ export { Separator };
web/src/components/ui/switch.tsx ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
4
+ import * as React from 'react';
5
+
6
+ import { cn } from '@/lib/utils';
7
+
8
+ const Switch = React.forwardRef<
9
+ React.ElementRef<typeof SwitchPrimitives.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
11
+ >(({ className, ...props }, ref) => (
12
+ <SwitchPrimitives.Root
13
+ className={cn(
14
+ 'peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',
15
+ className,
16
+ )}
17
+ {...props}
18
+ ref={ref}
19
+ >
20
+ <SwitchPrimitives.Thumb
21
+ className={cn(
22
+ 'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0',
23
+ )}
24
+ />
25
+ </SwitchPrimitives.Root>
26
+ ));
27
+ Switch.displayName = SwitchPrimitives.Root.displayName;
28
+
29
+ export { Switch };
web/src/components/ui/toast.tsx ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import * as ToastPrimitives from '@radix-ui/react-toast';
4
+ import { cva, type VariantProps } from 'class-variance-authority';
5
+ import { X } from 'lucide-react';
6
+ import * as React from 'react';
7
+
8
+ import { cn } from '@/lib/utils';
9
+
10
+ const ToastProvider = ToastPrimitives.Provider;
11
+
12
+ const ToastViewport = React.forwardRef<
13
+ React.ElementRef<typeof ToastPrimitives.Viewport>,
14
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
15
+ >(({ className, ...props }, ref) => (
16
+ <ToastPrimitives.Viewport
17
+ ref={ref}
18
+ className={cn(
19
+ 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',
20
+ className,
21
+ )}
22
+ {...props}
23
+ />
24
+ ));
25
+ ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
26
+
27
+ const toastVariants = cva(
28
+ 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
29
+ {
30
+ variants: {
31
+ variant: {
32
+ default: 'border bg-background text-foreground',
33
+ destructive:
34
+ 'destructive group border-destructive bg-destructive text-destructive-foreground',
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ variant: 'default',
39
+ },
40
+ },
41
+ );
42
+
43
+ const Toast = React.forwardRef<
44
+ React.ElementRef<typeof ToastPrimitives.Root>,
45
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &
46
+ VariantProps<typeof toastVariants>
47
+ >(({ className, variant, ...props }, ref) => {
48
+ return (
49
+ <ToastPrimitives.Root
50
+ ref={ref}
51
+ className={cn(toastVariants({ variant }), className)}
52
+ {...props}
53
+ />
54
+ );
55
+ });
56
+ Toast.displayName = ToastPrimitives.Root.displayName;
57
+
58
+ const ToastAction = React.forwardRef<
59
+ React.ElementRef<typeof ToastPrimitives.Action>,
60
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
61
+ >(({ className, ...props }, ref) => (
62
+ <ToastPrimitives.Action
63
+ ref={ref}
64
+ className={cn(
65
+ 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',
66
+ className,
67
+ )}
68
+ {...props}
69
+ />
70
+ ));
71
+ ToastAction.displayName = ToastPrimitives.Action.displayName;
72
+
73
+ const ToastClose = React.forwardRef<
74
+ React.ElementRef<typeof ToastPrimitives.Close>,
75
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
76
+ >(({ className, ...props }, ref) => (
77
+ <ToastPrimitives.Close
78
+ ref={ref}
79
+ className={cn(
80
+ 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',
81
+ className,
82
+ )}
83
+ toast-close=""
84
+ {...props}
85
+ >
86
+ <X className="h-4 w-4" />
87
+ </ToastPrimitives.Close>
88
+ ));
89
+ ToastClose.displayName = ToastPrimitives.Close.displayName;
90
+
91
+ const ToastTitle = React.forwardRef<
92
+ React.ElementRef<typeof ToastPrimitives.Title>,
93
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
94
+ >(({ className, ...props }, ref) => (
95
+ <ToastPrimitives.Title
96
+ ref={ref}
97
+ className={cn('text-sm font-semibold', className)}
98
+ {...props}
99
+ />
100
+ ));
101
+ ToastTitle.displayName = ToastPrimitives.Title.displayName;
102
+
103
+ const ToastDescription = React.forwardRef<
104
+ React.ElementRef<typeof ToastPrimitives.Description>,
105
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
106
+ >(({ className, ...props }, ref) => (
107
+ <ToastPrimitives.Description
108
+ ref={ref}
109
+ className={cn('text-sm opacity-90', className)}
110
+ {...props}
111
+ />
112
+ ));
113
+ ToastDescription.displayName = ToastPrimitives.Description.displayName;
114
+
115
+ type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;
116
+
117
+ type ToastActionElement = React.ReactElement<typeof ToastAction>;
118
+
119
+ export {
120
+ Toast,
121
+ ToastAction,
122
+ ToastClose,
123
+ ToastDescription,
124
+ ToastProvider,
125
+ ToastTitle,
126
+ ToastViewport,
127
+ type ToastActionElement,
128
+ type ToastProps,
129
+ };
web/src/components/ui/toaster.tsx ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import { useToast } from '@/components/hooks/use-toast';
4
+ import {
5
+ Toast,
6
+ ToastClose,
7
+ ToastDescription,
8
+ ToastProvider,
9
+ ToastTitle,
10
+ ToastViewport,
11
+ } from '@/components/ui/toast';
12
+
13
+ export function Toaster() {
14
+ const { toasts } = useToast();
15
+
16
+ return (
17
+ <ToastProvider>
18
+ {toasts.map(function ({ id, title, description, action, ...props }: any) {
19
+ return (
20
+ <Toast key={id} {...props}>
21
+ <div className="grid gap-1">
22
+ {title && <ToastTitle>{title}</ToastTitle>}
23
+ {description && (
24
+ <ToastDescription>{description}</ToastDescription>
25
+ )}
26
+ </div>
27
+ {action}
28
+ <ToastClose />
29
+ </Toast>
30
+ );
31
+ })}
32
+ <ToastViewport />
33
+ </ToastProvider>
34
+ );
35
+ }
web/src/lib/utils.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { clsx, type ClassValue } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
web/src/pages/demo.tsx ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useTheme } from '@/components/theme-provider';
2
+ import { Button } from '@/components/ui/button';
3
+ import {
4
+ DropdownMenu,
5
+ DropdownMenuContent,
6
+ DropdownMenuItem,
7
+ DropdownMenuTrigger,
8
+ } from '@/components/ui/dropdown-menu';
9
+ import { Moon, Sun } from 'lucide-react';
10
+
11
+ export function ModeToggle() {
12
+ const { setTheme } = useTheme();
13
+
14
+ return (
15
+ <DropdownMenu>
16
+ <DropdownMenuTrigger asChild>
17
+ <Button variant="outline" size="icon">
18
+ <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
19
+ <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
20
+ <span className="sr-only">Toggle theme</span>
21
+ </Button>
22
+ </DropdownMenuTrigger>
23
+ <DropdownMenuContent align="end">
24
+ <DropdownMenuItem onClick={() => setTheme('light')}>
25
+ Light
26
+ </DropdownMenuItem>
27
+ <DropdownMenuItem onClick={() => setTheme('dark')}>
28
+ Dark
29
+ </DropdownMenuItem>
30
+ <DropdownMenuItem onClick={() => setTheme('system')}>
31
+ System
32
+ </DropdownMenuItem>
33
+ </DropdownMenuContent>
34
+ </DropdownMenu>
35
+ );
36
+ }
37
+
38
+ const Demo = () => {
39
+ return (
40
+ <div>
41
+ <div>
42
+ <ModeToggle></ModeToggle>
43
+ </div>
44
+ <Button>Destructive</Button>
45
+ </div>
46
+ );
47
+ };
48
+
49
+ export default Demo;
web/src/pages/login-next/form.tsx ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use client';
2
+
3
+ import { toast } from '@/components/hooks/use-toast';
4
+ import { Button } from '@/components/ui/button';
5
+ import { Checkbox } from '@/components/ui/checkbox';
6
+ import {
7
+ Form,
8
+ FormControl,
9
+ FormField,
10
+ FormItem,
11
+ FormLabel,
12
+ FormMessage,
13
+ } from '@/components/ui/form';
14
+ import { Input } from '@/components/ui/input';
15
+ import {
16
+ InputOTP,
17
+ InputOTPGroup,
18
+ InputOTPSlot,
19
+ } from '@/components/ui/input-otp';
20
+ import { useTranslate } from '@/hooks/common-hooks';
21
+ import { zodResolver } from '@hookform/resolvers/zod';
22
+ import { useForm } from 'react-hook-form';
23
+ import { z } from 'zod';
24
+
25
+ export function SignUpForm() {
26
+ const { t } = useTranslate('login');
27
+
28
+ const FormSchema = z.object({
29
+ email: z.string().email({
30
+ message: t('emailPlaceholder'),
31
+ }),
32
+ nickname: z.string({ required_error: t('nicknamePlaceholder') }),
33
+ password: z.string({ required_error: t('passwordPlaceholder') }),
34
+ });
35
+
36
+ const form = useForm<z.infer<typeof FormSchema>>({
37
+ resolver: zodResolver(FormSchema),
38
+ defaultValues: {
39
+ email: '',
40
+ },
41
+ });
42
+
43
+ function onSubmit(data: z.infer<typeof FormSchema>) {
44
+ console.log('🚀 ~ onSubmit ~ data:', data);
45
+ toast({
46
+ title: 'You submitted the following values:',
47
+ description: (
48
+ <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4">
49
+ <code className="text-white">{JSON.stringify(data, null, 2)}</code>
50
+ </pre>
51
+ ),
52
+ });
53
+ }
54
+
55
+ return (
56
+ <Form {...form}>
57
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
58
+ <FormField
59
+ control={form.control}
60
+ name="email"
61
+ render={({ field }) => (
62
+ <FormItem>
63
+ <FormLabel>{t('emailLabel')}</FormLabel>
64
+ <FormControl>
65
+ <Input placeholder={t('emailPlaceholder')} {...field} />
66
+ </FormControl>
67
+ <FormMessage />
68
+ </FormItem>
69
+ )}
70
+ />
71
+ <FormField
72
+ control={form.control}
73
+ name="nickname"
74
+ render={({ field }) => (
75
+ <FormItem>
76
+ <FormLabel>{t('nicknameLabel')}</FormLabel>
77
+ <FormControl>
78
+ <Input placeholder={t('nicknamePlaceholder')} {...field} />
79
+ </FormControl>
80
+ <FormMessage />
81
+ </FormItem>
82
+ )}
83
+ />
84
+ <FormField
85
+ control={form.control}
86
+ name="password"
87
+ render={({ field }) => (
88
+ <FormItem>
89
+ <FormLabel>{t('passwordLabel')}</FormLabel>
90
+ <FormControl>
91
+ <Input
92
+ type={'password'}
93
+ placeholder={t('passwordPlaceholder')}
94
+ {...field}
95
+ />
96
+ </FormControl>
97
+ <FormMessage />
98
+ </FormItem>
99
+ )}
100
+ />
101
+ <Button type="submit" className="w-full">
102
+ {t('signUp')}
103
+ </Button>
104
+ </form>
105
+ </Form>
106
+ );
107
+ }
108
+
109
+ export function SignInForm() {
110
+ const { t } = useTranslate('login');
111
+
112
+ const FormSchema = z.object({
113
+ email: z.string().email({
114
+ message: t('emailPlaceholder'),
115
+ }),
116
+ password: z.string({ required_error: t('passwordPlaceholder') }),
117
+ });
118
+
119
+ const form = useForm<z.infer<typeof FormSchema>>({
120
+ resolver: zodResolver(FormSchema),
121
+ defaultValues: {
122
+ email: '',
123
+ },
124
+ });
125
+
126
+ function onSubmit(data: z.infer<typeof FormSchema>) {
127
+ console.log('🚀 ~ onSubmit ~ data:', data);
128
+ toast({
129
+ title: 'You submitted the following values:',
130
+ description: (
131
+ <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4">
132
+ <code className="text-white">{JSON.stringify(data, null, 2)}</code>
133
+ </pre>
134
+ ),
135
+ });
136
+ }
137
+
138
+ return (
139
+ <Form {...form}>
140
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
141
+ <FormField
142
+ control={form.control}
143
+ name="email"
144
+ render={({ field }) => (
145
+ <FormItem>
146
+ <FormLabel>{t('emailLabel')}</FormLabel>
147
+ <FormControl>
148
+ <Input placeholder={t('emailPlaceholder')} {...field} />
149
+ </FormControl>
150
+ <FormMessage />
151
+ </FormItem>
152
+ )}
153
+ />
154
+ <FormField
155
+ control={form.control}
156
+ name="password"
157
+ render={({ field }) => (
158
+ <FormItem>
159
+ <FormLabel>{t('passwordLabel')}</FormLabel>
160
+ <FormControl>
161
+ <Input
162
+ type={'password'}
163
+ placeholder={t('passwordPlaceholder')}
164
+ {...field}
165
+ />
166
+ </FormControl>
167
+ <FormMessage />
168
+ </FormItem>
169
+ )}
170
+ />
171
+ <div className="flex items-center space-x-2">
172
+ <Checkbox id="terms" />
173
+ <label
174
+ htmlFor="terms"
175
+ className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
176
+ >
177
+ {t('rememberMe')}
178
+ </label>
179
+ </div>
180
+ <Button type="submit" className="w-full">
181
+ {t('login')}
182
+ </Button>
183
+ </form>
184
+ </Form>
185
+ );
186
+ }
187
+
188
+ export function VerifyEmailForm() {
189
+ const FormSchema = z.object({
190
+ pin: z.string().min(6, {
191
+ message: 'Your one-time password must be 6 characters.',
192
+ }),
193
+ });
194
+
195
+ const form = useForm<z.infer<typeof FormSchema>>({
196
+ resolver: zodResolver(FormSchema),
197
+ defaultValues: {
198
+ pin: '',
199
+ },
200
+ });
201
+
202
+ function onSubmit(data: z.infer<typeof FormSchema>) {
203
+ console.log('🚀 ~ onSubmit ~ data:', data);
204
+ toast({
205
+ title: 'You submitted the following values:',
206
+ description: (
207
+ <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4">
208
+ <code className="text-white">{JSON.stringify(data, null, 2)}</code>
209
+ </pre>
210
+ ),
211
+ });
212
+ }
213
+
214
+ return (
215
+ <Form {...form}>
216
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
217
+ <FormField
218
+ control={form.control}
219
+ name="pin"
220
+ render={({ field }) => (
221
+ <FormItem>
222
+ <FormLabel>One-Time Password</FormLabel>
223
+ <FormControl>
224
+ <InputOTP maxLength={6} {...field}>
225
+ <InputOTPGroup>
226
+ <InputOTPSlot index={0} />
227
+ <InputOTPSlot index={1} />
228
+ <InputOTPSlot index={2} />
229
+ <InputOTPSlot index={3} />
230
+ <InputOTPSlot index={4} />
231
+ <InputOTPSlot index={5} />
232
+ </InputOTPGroup>
233
+ </InputOTP>
234
+ </FormControl>
235
+ <FormMessage />
236
+ </FormItem>
237
+ )}
238
+ />
239
+
240
+ <Button type="submit" className="w-full">
241
+ Verify
242
+ </Button>
243
+ </form>
244
+ </Form>
245
+ );
246
+ }
web/src/pages/login-next/index.tsx ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Button } from '@/components/ui/button';
2
+ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
3
+ import { Separator } from '@/components/ui/separator';
4
+ import { useTranslate } from '@/hooks/common-hooks';
5
+ import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons';
6
+ import { SignInForm, SignUpForm, VerifyEmailForm } from './form';
7
+
8
+ function LoginFooter() {
9
+ return (
10
+ <section className="pt-[30px]">
11
+ <Separator />
12
+ <p className="text-center pt-[20px]">or continue with</p>
13
+ <div className="flex gap-4 justify-center pt-[20px]">
14
+ <GitHubLogoIcon className="w-8 h-8"></GitHubLogoIcon>
15
+ <DiscordLogoIcon className="w-8 h-8"></DiscordLogoIcon>
16
+ </div>
17
+ </section>
18
+ );
19
+ }
20
+
21
+ export function SignUpCard() {
22
+ const { t } = useTranslate('login');
23
+
24
+ return (
25
+ <Card className="w-[400px]">
26
+ <CardHeader>
27
+ <CardTitle>{t('signUp')}</CardTitle>
28
+ </CardHeader>
29
+ <CardContent>
30
+ <SignUpForm></SignUpForm>
31
+ <LoginFooter></LoginFooter>
32
+ </CardContent>
33
+ </Card>
34
+ );
35
+ }
36
+
37
+ export function SignInCard() {
38
+ const { t } = useTranslate('login');
39
+
40
+ return (
41
+ <Card className="w-[400px]">
42
+ <CardHeader>
43
+ <CardTitle>{t('login')}</CardTitle>
44
+ </CardHeader>
45
+ <CardContent>
46
+ <SignInForm></SignInForm>
47
+ </CardContent>
48
+ </Card>
49
+ );
50
+ }
51
+
52
+ export function VerifyEmailCard() {
53
+ // const { t } = useTranslate('login');
54
+
55
+ return (
56
+ <Card className="w-[400px]">
57
+ <CardHeader>
58
+ <CardTitle>Verify email</CardTitle>
59
+ </CardHeader>
60
+ <CardContent>
61
+ <section className="flex gap-y-6 flex-col">
62
+ <div className="flex items-center space-x-4">
63
+ <div className="flex-1 space-y-1">
64
+ <p className="text-sm font-medium leading-none">
65
+ We’ve sent a 6-digit code to
66
+ </p>
67
+ <p className="text-sm text-blue-500">[email protected].</p>
68
+ </div>
69
+ <Button>Resend</Button>
70
+ </div>
71
+ <VerifyEmailForm></VerifyEmailForm>
72
+ </section>
73
+ </CardContent>
74
+ </Card>
75
+ );
76
+ }
77
+
78
+ const Login = () => {
79
+ return (
80
+ <>
81
+ <SignUpCard></SignUpCard>
82
+ <SignInCard></SignInCard>
83
+ <VerifyEmailCard></VerifyEmailCard>
84
+ </>
85
+ );
86
+ };
87
+
88
+ export default Login;
web/src/routes.ts CHANGED
@@ -4,6 +4,11 @@ const routes = [
4
  component: '@/pages/login',
5
  layout: false,
6
  },
 
 
 
 
 
7
  {
8
  path: '/chat/share',
9
  component: '@/pages/chat/share',
@@ -116,6 +121,11 @@ const routes = [
116
  component: '@/pages/404',
117
  layout: false,
118
  },
 
 
 
 
 
119
  ];
120
 
121
  export default routes;
 
4
  component: '@/pages/login',
5
  layout: false,
6
  },
7
+ {
8
+ path: '/login-next',
9
+ component: '@/pages/login-next',
10
+ layout: false,
11
+ },
12
  {
13
  path: '/chat/share',
14
  component: '@/pages/chat/share',
 
121
  component: '@/pages/404',
122
  layout: false,
123
  },
124
+ {
125
+ path: '/demo',
126
+ component: '@/pages/demo',
127
+ layout: false,
128
+ },
129
  ];
130
 
131
  export default routes;
web/tailwind.config.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { fontFamily } = require('tailwindcss/defaultTheme');
2
+
3
+ /** @type {import('tailwindcss').Config} */
4
+
5
+ module.exports = {
6
+ darkMode: ['class'],
7
+ content: [
8
+ './src/pages/**/*.tsx',
9
+ './src/components/**/*.tsx',
10
+ './src/layouts/**/*.tsx',
11
+ ],
12
+ theme: {
13
+ container: {
14
+ center: true,
15
+ padding: '2rem',
16
+ screens: {
17
+ '2xl': '1400px',
18
+ },
19
+ },
20
+ extend: {
21
+ colors: {
22
+ border: 'hsl(var(--border))',
23
+ input: 'hsl(var(--input))',
24
+ ring: 'hsl(var(--ring))',
25
+ background: 'hsl(var(--background))',
26
+ foreground: 'hsl(var(--foreground))',
27
+ primary: {
28
+ DEFAULT: 'hsl(var(--primary))',
29
+ foreground: 'hsl(var(--primary-foreground))',
30
+ },
31
+ secondary: {
32
+ DEFAULT: 'hsl(var(--secondary))',
33
+ foreground: 'hsl(var(--secondary-foreground))',
34
+ },
35
+ destructive: {
36
+ DEFAULT: 'hsl(var(--destructive))',
37
+ foreground: 'hsl(var(--destructive-foreground))',
38
+ },
39
+ muted: {
40
+ DEFAULT: 'hsl(var(--muted))',
41
+ foreground: 'hsl(var(--muted-foreground))',
42
+ },
43
+ accent: {
44
+ DEFAULT: 'hsl(var(--accent))',
45
+ foreground: 'hsl(var(--accent-foreground))',
46
+ },
47
+ popover: {
48
+ DEFAULT: 'hsl(var(--popover))',
49
+ foreground: 'hsl(var(--popover-foreground))',
50
+ },
51
+ card: {
52
+ DEFAULT: 'hsl(var(--card))',
53
+ foreground: 'hsl(var(--card-foreground))',
54
+ },
55
+ },
56
+ borderRadius: {
57
+ lg: `var(--radius)`,
58
+ md: `calc(var(--radius) - 2px)`,
59
+ sm: 'calc(var(--radius) - 4px)',
60
+ },
61
+ fontFamily: {
62
+ sans: ['var(--font-sans)', ...fontFamily.sans],
63
+ },
64
+ keyframes: {
65
+ 'accordion-down': {
66
+ from: { height: '0' },
67
+ to: { height: 'var(--radix-accordion-content-height)' },
68
+ },
69
+ 'accordion-up': {
70
+ from: { height: 'var(--radix-accordion-content-height)' },
71
+ to: { height: '0' },
72
+ },
73
+ 'caret-blink': {
74
+ '0%,70%,100%': { opacity: '1' },
75
+ '20%,50%': { opacity: '0' },
76
+ },
77
+ },
78
+ animation: {
79
+ 'accordion-down': 'accordion-down 0.2s ease-out',
80
+ 'accordion-up': 'accordion-up 0.2s ease-out',
81
+ 'caret-blink': 'caret-blink 1.25s ease-out infinite',
82
+ },
83
+ },
84
+ },
85
+ plugins: [require('tailwindcss-animate')],
86
+ };
web/tailwind.css ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 222.2 47.4% 11.2%;
9
+
10
+ --muted: 210 40% 96.1%;
11
+ --muted-foreground: 215.4 16.3% 46.9%;
12
+
13
+ --popover: 0 0% 100%;
14
+ --popover-foreground: 222.2 47.4% 11.2%;
15
+
16
+ --border: 214.3 31.8% 91.4%;
17
+ --input: 214.3 31.8% 91.4%;
18
+
19
+ --card: 0 0% 100%;
20
+ --card-foreground: 222.2 47.4% 11.2%;
21
+
22
+ --primary: 222.2 47.4% 11.2%;
23
+ --primary-foreground: 210 40% 98%;
24
+
25
+ --secondary: 210 40% 96.1%;
26
+ --secondary-foreground: 222.2 47.4% 11.2%;
27
+
28
+ --accent: 210 40% 96.1%;
29
+ --accent-foreground: 222.2 47.4% 11.2%;
30
+
31
+ --destructive: 0 100% 50%;
32
+ --destructive-foreground: 210 40% 98%;
33
+
34
+ --ring: 215 20.2% 65.1%;
35
+
36
+ --radius: 0.5rem;
37
+ }
38
+
39
+ .dark {
40
+ --background: 224 71% 4%;
41
+ --foreground: 213 31% 91%;
42
+
43
+ --muted: 223 47% 11%;
44
+ --muted-foreground: 215.4 16.3% 56.9%;
45
+
46
+ --accent: 216 34% 17%;
47
+ --accent-foreground: 210 40% 98%;
48
+
49
+ --popover: 224 71% 4%;
50
+ --popover-foreground: 215 20.2% 65.1%;
51
+
52
+ --border: 216 34% 17%;
53
+ --input: 216 34% 17%;
54
+
55
+ --card: 224 71% 4%;
56
+ --card-foreground: 213 31% 91%;
57
+
58
+ --primary: 210 40% 98%;
59
+ --primary-foreground: 222.2 47.4% 1.2%;
60
+
61
+ --secondary: 222.2 47.4% 11.2%;
62
+ --secondary-foreground: 210 40% 98%;
63
+
64
+ --destructive: 0 63% 31%;
65
+ --destructive-foreground: 210 40% 98%;
66
+
67
+ --ring: 216 34% 17%;
68
+
69
+ --radius: 0.5rem;
70
+ }
71
+ }
72
+
73
+ @layer base {
74
+ * {
75
+ @apply border-border;
76
+ }
77
+ body {
78
+ @apply bg-background text-foreground;
79
+ font-feature-settings:
80
+ 'rlig' 1,
81
+ 'calt' 1;
82
+ }
83
+ }