Hackathon Builder commited on
Commit
53ba2ed
Β·
1 Parent(s): f90cceb

Add missing frontend source code files

Browse files
frontend DELETED
@@ -1 +0,0 @@
1
- Subproject commit 70fcc96cc4551f6093f74a4a7f6c8ee9e75932bf
 
 
frontend/README.md ADDED
@@ -0,0 +1 @@
 
 
1
+ # code_blue_context
frontend/index.html ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="preconnect" href="https://fonts.googleapis.com">
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
9
+ <title>CodeBlue Context</title>
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ <script type="module" src="/src/main.jsx"></script>
14
+ </body>
15
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,2696 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "codeblue-context-ui",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "codeblue-context-ui",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "lucide-react": "^0.468.0",
12
+ "react": "^18.3.1",
13
+ "react-dom": "^18.3.1",
14
+ "react-dropzone": "^15.0.0"
15
+ },
16
+ "devDependencies": {
17
+ "@vitejs/plugin-react": "^4.3.4",
18
+ "autoprefixer": "^10.4.21",
19
+ "postcss": "^8.5.3",
20
+ "tailwindcss": "^3.4.17",
21
+ "vite": "^5.4.19"
22
+ }
23
+ },
24
+ "node_modules/@alloc/quick-lru": {
25
+ "version": "5.2.0",
26
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
27
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
28
+ "dev": true,
29
+ "license": "MIT",
30
+ "engines": {
31
+ "node": ">=10"
32
+ },
33
+ "funding": {
34
+ "url": "https://github.com/sponsors/sindresorhus"
35
+ }
36
+ },
37
+ "node_modules/@babel/code-frame": {
38
+ "version": "7.29.0",
39
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
40
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
41
+ "dev": true,
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "@babel/helper-validator-identifier": "^7.28.5",
45
+ "js-tokens": "^4.0.0",
46
+ "picocolors": "^1.1.1"
47
+ },
48
+ "engines": {
49
+ "node": ">=6.9.0"
50
+ }
51
+ },
52
+ "node_modules/@babel/compat-data": {
53
+ "version": "7.29.3",
54
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
55
+ "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "engines": {
59
+ "node": ">=6.9.0"
60
+ }
61
+ },
62
+ "node_modules/@babel/core": {
63
+ "version": "7.29.0",
64
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
65
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
66
+ "dev": true,
67
+ "license": "MIT",
68
+ "dependencies": {
69
+ "@babel/code-frame": "^7.29.0",
70
+ "@babel/generator": "^7.29.0",
71
+ "@babel/helper-compilation-targets": "^7.28.6",
72
+ "@babel/helper-module-transforms": "^7.28.6",
73
+ "@babel/helpers": "^7.28.6",
74
+ "@babel/parser": "^7.29.0",
75
+ "@babel/template": "^7.28.6",
76
+ "@babel/traverse": "^7.29.0",
77
+ "@babel/types": "^7.29.0",
78
+ "@jridgewell/remapping": "^2.3.5",
79
+ "convert-source-map": "^2.0.0",
80
+ "debug": "^4.1.0",
81
+ "gensync": "^1.0.0-beta.2",
82
+ "json5": "^2.2.3",
83
+ "semver": "^6.3.1"
84
+ },
85
+ "engines": {
86
+ "node": ">=6.9.0"
87
+ },
88
+ "funding": {
89
+ "type": "opencollective",
90
+ "url": "https://opencollective.com/babel"
91
+ }
92
+ },
93
+ "node_modules/@babel/generator": {
94
+ "version": "7.29.1",
95
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
96
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
97
+ "dev": true,
98
+ "license": "MIT",
99
+ "dependencies": {
100
+ "@babel/parser": "^7.29.0",
101
+ "@babel/types": "^7.29.0",
102
+ "@jridgewell/gen-mapping": "^0.3.12",
103
+ "@jridgewell/trace-mapping": "^0.3.28",
104
+ "jsesc": "^3.0.2"
105
+ },
106
+ "engines": {
107
+ "node": ">=6.9.0"
108
+ }
109
+ },
110
+ "node_modules/@babel/helper-compilation-targets": {
111
+ "version": "7.28.6",
112
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
113
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
114
+ "dev": true,
115
+ "license": "MIT",
116
+ "dependencies": {
117
+ "@babel/compat-data": "^7.28.6",
118
+ "@babel/helper-validator-option": "^7.27.1",
119
+ "browserslist": "^4.24.0",
120
+ "lru-cache": "^5.1.1",
121
+ "semver": "^6.3.1"
122
+ },
123
+ "engines": {
124
+ "node": ">=6.9.0"
125
+ }
126
+ },
127
+ "node_modules/@babel/helper-globals": {
128
+ "version": "7.28.0",
129
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
130
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
131
+ "dev": true,
132
+ "license": "MIT",
133
+ "engines": {
134
+ "node": ">=6.9.0"
135
+ }
136
+ },
137
+ "node_modules/@babel/helper-module-imports": {
138
+ "version": "7.28.6",
139
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
140
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
141
+ "dev": true,
142
+ "license": "MIT",
143
+ "dependencies": {
144
+ "@babel/traverse": "^7.28.6",
145
+ "@babel/types": "^7.28.6"
146
+ },
147
+ "engines": {
148
+ "node": ">=6.9.0"
149
+ }
150
+ },
151
+ "node_modules/@babel/helper-module-transforms": {
152
+ "version": "7.28.6",
153
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
154
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
155
+ "dev": true,
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "@babel/helper-module-imports": "^7.28.6",
159
+ "@babel/helper-validator-identifier": "^7.28.5",
160
+ "@babel/traverse": "^7.28.6"
161
+ },
162
+ "engines": {
163
+ "node": ">=6.9.0"
164
+ },
165
+ "peerDependencies": {
166
+ "@babel/core": "^7.0.0"
167
+ }
168
+ },
169
+ "node_modules/@babel/helper-plugin-utils": {
170
+ "version": "7.28.6",
171
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
172
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
173
+ "dev": true,
174
+ "license": "MIT",
175
+ "engines": {
176
+ "node": ">=6.9.0"
177
+ }
178
+ },
179
+ "node_modules/@babel/helper-string-parser": {
180
+ "version": "7.27.1",
181
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
182
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
183
+ "dev": true,
184
+ "license": "MIT",
185
+ "engines": {
186
+ "node": ">=6.9.0"
187
+ }
188
+ },
189
+ "node_modules/@babel/helper-validator-identifier": {
190
+ "version": "7.28.5",
191
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
192
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
193
+ "dev": true,
194
+ "license": "MIT",
195
+ "engines": {
196
+ "node": ">=6.9.0"
197
+ }
198
+ },
199
+ "node_modules/@babel/helper-validator-option": {
200
+ "version": "7.27.1",
201
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
202
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
203
+ "dev": true,
204
+ "license": "MIT",
205
+ "engines": {
206
+ "node": ">=6.9.0"
207
+ }
208
+ },
209
+ "node_modules/@babel/helpers": {
210
+ "version": "7.29.2",
211
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
212
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
213
+ "dev": true,
214
+ "license": "MIT",
215
+ "dependencies": {
216
+ "@babel/template": "^7.28.6",
217
+ "@babel/types": "^7.29.0"
218
+ },
219
+ "engines": {
220
+ "node": ">=6.9.0"
221
+ }
222
+ },
223
+ "node_modules/@babel/parser": {
224
+ "version": "7.29.3",
225
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz",
226
+ "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==",
227
+ "dev": true,
228
+ "license": "MIT",
229
+ "dependencies": {
230
+ "@babel/types": "^7.29.0"
231
+ },
232
+ "bin": {
233
+ "parser": "bin/babel-parser.js"
234
+ },
235
+ "engines": {
236
+ "node": ">=6.0.0"
237
+ }
238
+ },
239
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
240
+ "version": "7.27.1",
241
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
242
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
243
+ "dev": true,
244
+ "license": "MIT",
245
+ "dependencies": {
246
+ "@babel/helper-plugin-utils": "^7.27.1"
247
+ },
248
+ "engines": {
249
+ "node": ">=6.9.0"
250
+ },
251
+ "peerDependencies": {
252
+ "@babel/core": "^7.0.0-0"
253
+ }
254
+ },
255
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
256
+ "version": "7.27.1",
257
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
258
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
259
+ "dev": true,
260
+ "license": "MIT",
261
+ "dependencies": {
262
+ "@babel/helper-plugin-utils": "^7.27.1"
263
+ },
264
+ "engines": {
265
+ "node": ">=6.9.0"
266
+ },
267
+ "peerDependencies": {
268
+ "@babel/core": "^7.0.0-0"
269
+ }
270
+ },
271
+ "node_modules/@babel/template": {
272
+ "version": "7.28.6",
273
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
274
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
275
+ "dev": true,
276
+ "license": "MIT",
277
+ "dependencies": {
278
+ "@babel/code-frame": "^7.28.6",
279
+ "@babel/parser": "^7.28.6",
280
+ "@babel/types": "^7.28.6"
281
+ },
282
+ "engines": {
283
+ "node": ">=6.9.0"
284
+ }
285
+ },
286
+ "node_modules/@babel/traverse": {
287
+ "version": "7.29.0",
288
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
289
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
290
+ "dev": true,
291
+ "license": "MIT",
292
+ "dependencies": {
293
+ "@babel/code-frame": "^7.29.0",
294
+ "@babel/generator": "^7.29.0",
295
+ "@babel/helper-globals": "^7.28.0",
296
+ "@babel/parser": "^7.29.0",
297
+ "@babel/template": "^7.28.6",
298
+ "@babel/types": "^7.29.0",
299
+ "debug": "^4.3.1"
300
+ },
301
+ "engines": {
302
+ "node": ">=6.9.0"
303
+ }
304
+ },
305
+ "node_modules/@babel/types": {
306
+ "version": "7.29.0",
307
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
308
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
309
+ "dev": true,
310
+ "license": "MIT",
311
+ "dependencies": {
312
+ "@babel/helper-string-parser": "^7.27.1",
313
+ "@babel/helper-validator-identifier": "^7.28.5"
314
+ },
315
+ "engines": {
316
+ "node": ">=6.9.0"
317
+ }
318
+ },
319
+ "node_modules/@esbuild/aix-ppc64": {
320
+ "version": "0.21.5",
321
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
322
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
323
+ "cpu": [
324
+ "ppc64"
325
+ ],
326
+ "dev": true,
327
+ "license": "MIT",
328
+ "optional": true,
329
+ "os": [
330
+ "aix"
331
+ ],
332
+ "engines": {
333
+ "node": ">=12"
334
+ }
335
+ },
336
+ "node_modules/@esbuild/android-arm": {
337
+ "version": "0.21.5",
338
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
339
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
340
+ "cpu": [
341
+ "arm"
342
+ ],
343
+ "dev": true,
344
+ "license": "MIT",
345
+ "optional": true,
346
+ "os": [
347
+ "android"
348
+ ],
349
+ "engines": {
350
+ "node": ">=12"
351
+ }
352
+ },
353
+ "node_modules/@esbuild/android-arm64": {
354
+ "version": "0.21.5",
355
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
356
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
357
+ "cpu": [
358
+ "arm64"
359
+ ],
360
+ "dev": true,
361
+ "license": "MIT",
362
+ "optional": true,
363
+ "os": [
364
+ "android"
365
+ ],
366
+ "engines": {
367
+ "node": ">=12"
368
+ }
369
+ },
370
+ "node_modules/@esbuild/android-x64": {
371
+ "version": "0.21.5",
372
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
373
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
374
+ "cpu": [
375
+ "x64"
376
+ ],
377
+ "dev": true,
378
+ "license": "MIT",
379
+ "optional": true,
380
+ "os": [
381
+ "android"
382
+ ],
383
+ "engines": {
384
+ "node": ">=12"
385
+ }
386
+ },
387
+ "node_modules/@esbuild/darwin-arm64": {
388
+ "version": "0.21.5",
389
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
390
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
391
+ "cpu": [
392
+ "arm64"
393
+ ],
394
+ "dev": true,
395
+ "license": "MIT",
396
+ "optional": true,
397
+ "os": [
398
+ "darwin"
399
+ ],
400
+ "engines": {
401
+ "node": ">=12"
402
+ }
403
+ },
404
+ "node_modules/@esbuild/darwin-x64": {
405
+ "version": "0.21.5",
406
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
407
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
408
+ "cpu": [
409
+ "x64"
410
+ ],
411
+ "dev": true,
412
+ "license": "MIT",
413
+ "optional": true,
414
+ "os": [
415
+ "darwin"
416
+ ],
417
+ "engines": {
418
+ "node": ">=12"
419
+ }
420
+ },
421
+ "node_modules/@esbuild/freebsd-arm64": {
422
+ "version": "0.21.5",
423
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
424
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
425
+ "cpu": [
426
+ "arm64"
427
+ ],
428
+ "dev": true,
429
+ "license": "MIT",
430
+ "optional": true,
431
+ "os": [
432
+ "freebsd"
433
+ ],
434
+ "engines": {
435
+ "node": ">=12"
436
+ }
437
+ },
438
+ "node_modules/@esbuild/freebsd-x64": {
439
+ "version": "0.21.5",
440
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
441
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
442
+ "cpu": [
443
+ "x64"
444
+ ],
445
+ "dev": true,
446
+ "license": "MIT",
447
+ "optional": true,
448
+ "os": [
449
+ "freebsd"
450
+ ],
451
+ "engines": {
452
+ "node": ">=12"
453
+ }
454
+ },
455
+ "node_modules/@esbuild/linux-arm": {
456
+ "version": "0.21.5",
457
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
458
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
459
+ "cpu": [
460
+ "arm"
461
+ ],
462
+ "dev": true,
463
+ "license": "MIT",
464
+ "optional": true,
465
+ "os": [
466
+ "linux"
467
+ ],
468
+ "engines": {
469
+ "node": ">=12"
470
+ }
471
+ },
472
+ "node_modules/@esbuild/linux-arm64": {
473
+ "version": "0.21.5",
474
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
475
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
476
+ "cpu": [
477
+ "arm64"
478
+ ],
479
+ "dev": true,
480
+ "license": "MIT",
481
+ "optional": true,
482
+ "os": [
483
+ "linux"
484
+ ],
485
+ "engines": {
486
+ "node": ">=12"
487
+ }
488
+ },
489
+ "node_modules/@esbuild/linux-ia32": {
490
+ "version": "0.21.5",
491
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
492
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
493
+ "cpu": [
494
+ "ia32"
495
+ ],
496
+ "dev": true,
497
+ "license": "MIT",
498
+ "optional": true,
499
+ "os": [
500
+ "linux"
501
+ ],
502
+ "engines": {
503
+ "node": ">=12"
504
+ }
505
+ },
506
+ "node_modules/@esbuild/linux-loong64": {
507
+ "version": "0.21.5",
508
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
509
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
510
+ "cpu": [
511
+ "loong64"
512
+ ],
513
+ "dev": true,
514
+ "license": "MIT",
515
+ "optional": true,
516
+ "os": [
517
+ "linux"
518
+ ],
519
+ "engines": {
520
+ "node": ">=12"
521
+ }
522
+ },
523
+ "node_modules/@esbuild/linux-mips64el": {
524
+ "version": "0.21.5",
525
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
526
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
527
+ "cpu": [
528
+ "mips64el"
529
+ ],
530
+ "dev": true,
531
+ "license": "MIT",
532
+ "optional": true,
533
+ "os": [
534
+ "linux"
535
+ ],
536
+ "engines": {
537
+ "node": ">=12"
538
+ }
539
+ },
540
+ "node_modules/@esbuild/linux-ppc64": {
541
+ "version": "0.21.5",
542
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
543
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
544
+ "cpu": [
545
+ "ppc64"
546
+ ],
547
+ "dev": true,
548
+ "license": "MIT",
549
+ "optional": true,
550
+ "os": [
551
+ "linux"
552
+ ],
553
+ "engines": {
554
+ "node": ">=12"
555
+ }
556
+ },
557
+ "node_modules/@esbuild/linux-riscv64": {
558
+ "version": "0.21.5",
559
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
560
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
561
+ "cpu": [
562
+ "riscv64"
563
+ ],
564
+ "dev": true,
565
+ "license": "MIT",
566
+ "optional": true,
567
+ "os": [
568
+ "linux"
569
+ ],
570
+ "engines": {
571
+ "node": ">=12"
572
+ }
573
+ },
574
+ "node_modules/@esbuild/linux-s390x": {
575
+ "version": "0.21.5",
576
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
577
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
578
+ "cpu": [
579
+ "s390x"
580
+ ],
581
+ "dev": true,
582
+ "license": "MIT",
583
+ "optional": true,
584
+ "os": [
585
+ "linux"
586
+ ],
587
+ "engines": {
588
+ "node": ">=12"
589
+ }
590
+ },
591
+ "node_modules/@esbuild/linux-x64": {
592
+ "version": "0.21.5",
593
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
594
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
595
+ "cpu": [
596
+ "x64"
597
+ ],
598
+ "dev": true,
599
+ "license": "MIT",
600
+ "optional": true,
601
+ "os": [
602
+ "linux"
603
+ ],
604
+ "engines": {
605
+ "node": ">=12"
606
+ }
607
+ },
608
+ "node_modules/@esbuild/netbsd-x64": {
609
+ "version": "0.21.5",
610
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
611
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
612
+ "cpu": [
613
+ "x64"
614
+ ],
615
+ "dev": true,
616
+ "license": "MIT",
617
+ "optional": true,
618
+ "os": [
619
+ "netbsd"
620
+ ],
621
+ "engines": {
622
+ "node": ">=12"
623
+ }
624
+ },
625
+ "node_modules/@esbuild/openbsd-x64": {
626
+ "version": "0.21.5",
627
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
628
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
629
+ "cpu": [
630
+ "x64"
631
+ ],
632
+ "dev": true,
633
+ "license": "MIT",
634
+ "optional": true,
635
+ "os": [
636
+ "openbsd"
637
+ ],
638
+ "engines": {
639
+ "node": ">=12"
640
+ }
641
+ },
642
+ "node_modules/@esbuild/sunos-x64": {
643
+ "version": "0.21.5",
644
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
645
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
646
+ "cpu": [
647
+ "x64"
648
+ ],
649
+ "dev": true,
650
+ "license": "MIT",
651
+ "optional": true,
652
+ "os": [
653
+ "sunos"
654
+ ],
655
+ "engines": {
656
+ "node": ">=12"
657
+ }
658
+ },
659
+ "node_modules/@esbuild/win32-arm64": {
660
+ "version": "0.21.5",
661
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
662
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
663
+ "cpu": [
664
+ "arm64"
665
+ ],
666
+ "dev": true,
667
+ "license": "MIT",
668
+ "optional": true,
669
+ "os": [
670
+ "win32"
671
+ ],
672
+ "engines": {
673
+ "node": ">=12"
674
+ }
675
+ },
676
+ "node_modules/@esbuild/win32-ia32": {
677
+ "version": "0.21.5",
678
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
679
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
680
+ "cpu": [
681
+ "ia32"
682
+ ],
683
+ "dev": true,
684
+ "license": "MIT",
685
+ "optional": true,
686
+ "os": [
687
+ "win32"
688
+ ],
689
+ "engines": {
690
+ "node": ">=12"
691
+ }
692
+ },
693
+ "node_modules/@esbuild/win32-x64": {
694
+ "version": "0.21.5",
695
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
696
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
697
+ "cpu": [
698
+ "x64"
699
+ ],
700
+ "dev": true,
701
+ "license": "MIT",
702
+ "optional": true,
703
+ "os": [
704
+ "win32"
705
+ ],
706
+ "engines": {
707
+ "node": ">=12"
708
+ }
709
+ },
710
+ "node_modules/@jridgewell/gen-mapping": {
711
+ "version": "0.3.13",
712
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
713
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
714
+ "dev": true,
715
+ "license": "MIT",
716
+ "dependencies": {
717
+ "@jridgewell/sourcemap-codec": "^1.5.0",
718
+ "@jridgewell/trace-mapping": "^0.3.24"
719
+ }
720
+ },
721
+ "node_modules/@jridgewell/remapping": {
722
+ "version": "2.3.5",
723
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
724
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
725
+ "dev": true,
726
+ "license": "MIT",
727
+ "dependencies": {
728
+ "@jridgewell/gen-mapping": "^0.3.5",
729
+ "@jridgewell/trace-mapping": "^0.3.24"
730
+ }
731
+ },
732
+ "node_modules/@jridgewell/resolve-uri": {
733
+ "version": "3.1.2",
734
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
735
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
736
+ "dev": true,
737
+ "license": "MIT",
738
+ "engines": {
739
+ "node": ">=6.0.0"
740
+ }
741
+ },
742
+ "node_modules/@jridgewell/sourcemap-codec": {
743
+ "version": "1.5.5",
744
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
745
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
746
+ "dev": true,
747
+ "license": "MIT"
748
+ },
749
+ "node_modules/@jridgewell/trace-mapping": {
750
+ "version": "0.3.31",
751
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
752
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
753
+ "dev": true,
754
+ "license": "MIT",
755
+ "dependencies": {
756
+ "@jridgewell/resolve-uri": "^3.1.0",
757
+ "@jridgewell/sourcemap-codec": "^1.4.14"
758
+ }
759
+ },
760
+ "node_modules/@nodelib/fs.scandir": {
761
+ "version": "2.1.5",
762
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
763
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
764
+ "dev": true,
765
+ "license": "MIT",
766
+ "dependencies": {
767
+ "@nodelib/fs.stat": "2.0.5",
768
+ "run-parallel": "^1.1.9"
769
+ },
770
+ "engines": {
771
+ "node": ">= 8"
772
+ }
773
+ },
774
+ "node_modules/@nodelib/fs.stat": {
775
+ "version": "2.0.5",
776
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
777
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
778
+ "dev": true,
779
+ "license": "MIT",
780
+ "engines": {
781
+ "node": ">= 8"
782
+ }
783
+ },
784
+ "node_modules/@nodelib/fs.walk": {
785
+ "version": "1.2.8",
786
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
787
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
788
+ "dev": true,
789
+ "license": "MIT",
790
+ "dependencies": {
791
+ "@nodelib/fs.scandir": "2.1.5",
792
+ "fastq": "^1.6.0"
793
+ },
794
+ "engines": {
795
+ "node": ">= 8"
796
+ }
797
+ },
798
+ "node_modules/@rolldown/pluginutils": {
799
+ "version": "1.0.0-beta.27",
800
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
801
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
802
+ "dev": true,
803
+ "license": "MIT"
804
+ },
805
+ "node_modules/@rollup/rollup-android-arm-eabi": {
806
+ "version": "4.60.3",
807
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz",
808
+ "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==",
809
+ "cpu": [
810
+ "arm"
811
+ ],
812
+ "dev": true,
813
+ "license": "MIT",
814
+ "optional": true,
815
+ "os": [
816
+ "android"
817
+ ]
818
+ },
819
+ "node_modules/@rollup/rollup-android-arm64": {
820
+ "version": "4.60.3",
821
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz",
822
+ "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==",
823
+ "cpu": [
824
+ "arm64"
825
+ ],
826
+ "dev": true,
827
+ "license": "MIT",
828
+ "optional": true,
829
+ "os": [
830
+ "android"
831
+ ]
832
+ },
833
+ "node_modules/@rollup/rollup-darwin-arm64": {
834
+ "version": "4.60.3",
835
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz",
836
+ "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==",
837
+ "cpu": [
838
+ "arm64"
839
+ ],
840
+ "dev": true,
841
+ "license": "MIT",
842
+ "optional": true,
843
+ "os": [
844
+ "darwin"
845
+ ]
846
+ },
847
+ "node_modules/@rollup/rollup-darwin-x64": {
848
+ "version": "4.60.3",
849
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz",
850
+ "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==",
851
+ "cpu": [
852
+ "x64"
853
+ ],
854
+ "dev": true,
855
+ "license": "MIT",
856
+ "optional": true,
857
+ "os": [
858
+ "darwin"
859
+ ]
860
+ },
861
+ "node_modules/@rollup/rollup-freebsd-arm64": {
862
+ "version": "4.60.3",
863
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz",
864
+ "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==",
865
+ "cpu": [
866
+ "arm64"
867
+ ],
868
+ "dev": true,
869
+ "license": "MIT",
870
+ "optional": true,
871
+ "os": [
872
+ "freebsd"
873
+ ]
874
+ },
875
+ "node_modules/@rollup/rollup-freebsd-x64": {
876
+ "version": "4.60.3",
877
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz",
878
+ "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==",
879
+ "cpu": [
880
+ "x64"
881
+ ],
882
+ "dev": true,
883
+ "license": "MIT",
884
+ "optional": true,
885
+ "os": [
886
+ "freebsd"
887
+ ]
888
+ },
889
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
890
+ "version": "4.60.3",
891
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz",
892
+ "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==",
893
+ "cpu": [
894
+ "arm"
895
+ ],
896
+ "dev": true,
897
+ "license": "MIT",
898
+ "optional": true,
899
+ "os": [
900
+ "linux"
901
+ ]
902
+ },
903
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
904
+ "version": "4.60.3",
905
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz",
906
+ "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==",
907
+ "cpu": [
908
+ "arm"
909
+ ],
910
+ "dev": true,
911
+ "license": "MIT",
912
+ "optional": true,
913
+ "os": [
914
+ "linux"
915
+ ]
916
+ },
917
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
918
+ "version": "4.60.3",
919
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz",
920
+ "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==",
921
+ "cpu": [
922
+ "arm64"
923
+ ],
924
+ "dev": true,
925
+ "license": "MIT",
926
+ "optional": true,
927
+ "os": [
928
+ "linux"
929
+ ]
930
+ },
931
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
932
+ "version": "4.60.3",
933
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz",
934
+ "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==",
935
+ "cpu": [
936
+ "arm64"
937
+ ],
938
+ "dev": true,
939
+ "license": "MIT",
940
+ "optional": true,
941
+ "os": [
942
+ "linux"
943
+ ]
944
+ },
945
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
946
+ "version": "4.60.3",
947
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz",
948
+ "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==",
949
+ "cpu": [
950
+ "loong64"
951
+ ],
952
+ "dev": true,
953
+ "license": "MIT",
954
+ "optional": true,
955
+ "os": [
956
+ "linux"
957
+ ]
958
+ },
959
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
960
+ "version": "4.60.3",
961
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz",
962
+ "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==",
963
+ "cpu": [
964
+ "loong64"
965
+ ],
966
+ "dev": true,
967
+ "license": "MIT",
968
+ "optional": true,
969
+ "os": [
970
+ "linux"
971
+ ]
972
+ },
973
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
974
+ "version": "4.60.3",
975
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz",
976
+ "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==",
977
+ "cpu": [
978
+ "ppc64"
979
+ ],
980
+ "dev": true,
981
+ "license": "MIT",
982
+ "optional": true,
983
+ "os": [
984
+ "linux"
985
+ ]
986
+ },
987
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
988
+ "version": "4.60.3",
989
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz",
990
+ "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==",
991
+ "cpu": [
992
+ "ppc64"
993
+ ],
994
+ "dev": true,
995
+ "license": "MIT",
996
+ "optional": true,
997
+ "os": [
998
+ "linux"
999
+ ]
1000
+ },
1001
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1002
+ "version": "4.60.3",
1003
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz",
1004
+ "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==",
1005
+ "cpu": [
1006
+ "riscv64"
1007
+ ],
1008
+ "dev": true,
1009
+ "license": "MIT",
1010
+ "optional": true,
1011
+ "os": [
1012
+ "linux"
1013
+ ]
1014
+ },
1015
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1016
+ "version": "4.60.3",
1017
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz",
1018
+ "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==",
1019
+ "cpu": [
1020
+ "riscv64"
1021
+ ],
1022
+ "dev": true,
1023
+ "license": "MIT",
1024
+ "optional": true,
1025
+ "os": [
1026
+ "linux"
1027
+ ]
1028
+ },
1029
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1030
+ "version": "4.60.3",
1031
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz",
1032
+ "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==",
1033
+ "cpu": [
1034
+ "s390x"
1035
+ ],
1036
+ "dev": true,
1037
+ "license": "MIT",
1038
+ "optional": true,
1039
+ "os": [
1040
+ "linux"
1041
+ ]
1042
+ },
1043
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1044
+ "version": "4.60.3",
1045
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz",
1046
+ "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==",
1047
+ "cpu": [
1048
+ "x64"
1049
+ ],
1050
+ "dev": true,
1051
+ "license": "MIT",
1052
+ "optional": true,
1053
+ "os": [
1054
+ "linux"
1055
+ ]
1056
+ },
1057
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1058
+ "version": "4.60.3",
1059
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz",
1060
+ "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==",
1061
+ "cpu": [
1062
+ "x64"
1063
+ ],
1064
+ "dev": true,
1065
+ "license": "MIT",
1066
+ "optional": true,
1067
+ "os": [
1068
+ "linux"
1069
+ ]
1070
+ },
1071
+ "node_modules/@rollup/rollup-openbsd-x64": {
1072
+ "version": "4.60.3",
1073
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz",
1074
+ "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==",
1075
+ "cpu": [
1076
+ "x64"
1077
+ ],
1078
+ "dev": true,
1079
+ "license": "MIT",
1080
+ "optional": true,
1081
+ "os": [
1082
+ "openbsd"
1083
+ ]
1084
+ },
1085
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1086
+ "version": "4.60.3",
1087
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz",
1088
+ "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==",
1089
+ "cpu": [
1090
+ "arm64"
1091
+ ],
1092
+ "dev": true,
1093
+ "license": "MIT",
1094
+ "optional": true,
1095
+ "os": [
1096
+ "openharmony"
1097
+ ]
1098
+ },
1099
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1100
+ "version": "4.60.3",
1101
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz",
1102
+ "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==",
1103
+ "cpu": [
1104
+ "arm64"
1105
+ ],
1106
+ "dev": true,
1107
+ "license": "MIT",
1108
+ "optional": true,
1109
+ "os": [
1110
+ "win32"
1111
+ ]
1112
+ },
1113
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1114
+ "version": "4.60.3",
1115
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz",
1116
+ "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==",
1117
+ "cpu": [
1118
+ "ia32"
1119
+ ],
1120
+ "dev": true,
1121
+ "license": "MIT",
1122
+ "optional": true,
1123
+ "os": [
1124
+ "win32"
1125
+ ]
1126
+ },
1127
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1128
+ "version": "4.60.3",
1129
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz",
1130
+ "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==",
1131
+ "cpu": [
1132
+ "x64"
1133
+ ],
1134
+ "dev": true,
1135
+ "license": "MIT",
1136
+ "optional": true,
1137
+ "os": [
1138
+ "win32"
1139
+ ]
1140
+ },
1141
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1142
+ "version": "4.60.3",
1143
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz",
1144
+ "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==",
1145
+ "cpu": [
1146
+ "x64"
1147
+ ],
1148
+ "dev": true,
1149
+ "license": "MIT",
1150
+ "optional": true,
1151
+ "os": [
1152
+ "win32"
1153
+ ]
1154
+ },
1155
+ "node_modules/@types/babel__core": {
1156
+ "version": "7.20.5",
1157
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1158
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1159
+ "dev": true,
1160
+ "license": "MIT",
1161
+ "dependencies": {
1162
+ "@babel/parser": "^7.20.7",
1163
+ "@babel/types": "^7.20.7",
1164
+ "@types/babel__generator": "*",
1165
+ "@types/babel__template": "*",
1166
+ "@types/babel__traverse": "*"
1167
+ }
1168
+ },
1169
+ "node_modules/@types/babel__generator": {
1170
+ "version": "7.27.0",
1171
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1172
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1173
+ "dev": true,
1174
+ "license": "MIT",
1175
+ "dependencies": {
1176
+ "@babel/types": "^7.0.0"
1177
+ }
1178
+ },
1179
+ "node_modules/@types/babel__template": {
1180
+ "version": "7.4.4",
1181
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1182
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1183
+ "dev": true,
1184
+ "license": "MIT",
1185
+ "dependencies": {
1186
+ "@babel/parser": "^7.1.0",
1187
+ "@babel/types": "^7.0.0"
1188
+ }
1189
+ },
1190
+ "node_modules/@types/babel__traverse": {
1191
+ "version": "7.28.0",
1192
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1193
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1194
+ "dev": true,
1195
+ "license": "MIT",
1196
+ "dependencies": {
1197
+ "@babel/types": "^7.28.2"
1198
+ }
1199
+ },
1200
+ "node_modules/@types/estree": {
1201
+ "version": "1.0.8",
1202
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1203
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1204
+ "dev": true,
1205
+ "license": "MIT"
1206
+ },
1207
+ "node_modules/@vitejs/plugin-react": {
1208
+ "version": "4.7.0",
1209
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1210
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1211
+ "dev": true,
1212
+ "license": "MIT",
1213
+ "dependencies": {
1214
+ "@babel/core": "^7.28.0",
1215
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1216
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1217
+ "@rolldown/pluginutils": "1.0.0-beta.27",
1218
+ "@types/babel__core": "^7.20.5",
1219
+ "react-refresh": "^0.17.0"
1220
+ },
1221
+ "engines": {
1222
+ "node": "^14.18.0 || >=16.0.0"
1223
+ },
1224
+ "peerDependencies": {
1225
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1226
+ }
1227
+ },
1228
+ "node_modules/any-promise": {
1229
+ "version": "1.3.0",
1230
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1231
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1232
+ "dev": true,
1233
+ "license": "MIT"
1234
+ },
1235
+ "node_modules/anymatch": {
1236
+ "version": "3.1.3",
1237
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1238
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1239
+ "dev": true,
1240
+ "license": "ISC",
1241
+ "dependencies": {
1242
+ "normalize-path": "^3.0.0",
1243
+ "picomatch": "^2.0.4"
1244
+ },
1245
+ "engines": {
1246
+ "node": ">= 8"
1247
+ }
1248
+ },
1249
+ "node_modules/arg": {
1250
+ "version": "5.0.2",
1251
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1252
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1253
+ "dev": true,
1254
+ "license": "MIT"
1255
+ },
1256
+ "node_modules/attr-accept": {
1257
+ "version": "2.2.5",
1258
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz",
1259
+ "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==",
1260
+ "license": "MIT",
1261
+ "engines": {
1262
+ "node": ">=4"
1263
+ }
1264
+ },
1265
+ "node_modules/autoprefixer": {
1266
+ "version": "10.5.0",
1267
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
1268
+ "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
1269
+ "dev": true,
1270
+ "funding": [
1271
+ {
1272
+ "type": "opencollective",
1273
+ "url": "https://opencollective.com/postcss/"
1274
+ },
1275
+ {
1276
+ "type": "tidelift",
1277
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1278
+ },
1279
+ {
1280
+ "type": "github",
1281
+ "url": "https://github.com/sponsors/ai"
1282
+ }
1283
+ ],
1284
+ "license": "MIT",
1285
+ "dependencies": {
1286
+ "browserslist": "^4.28.2",
1287
+ "caniuse-lite": "^1.0.30001787",
1288
+ "fraction.js": "^5.3.4",
1289
+ "picocolors": "^1.1.1",
1290
+ "postcss-value-parser": "^4.2.0"
1291
+ },
1292
+ "bin": {
1293
+ "autoprefixer": "bin/autoprefixer"
1294
+ },
1295
+ "engines": {
1296
+ "node": "^10 || ^12 || >=14"
1297
+ },
1298
+ "peerDependencies": {
1299
+ "postcss": "^8.1.0"
1300
+ }
1301
+ },
1302
+ "node_modules/baseline-browser-mapping": {
1303
+ "version": "2.10.28",
1304
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.28.tgz",
1305
+ "integrity": "sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==",
1306
+ "dev": true,
1307
+ "license": "Apache-2.0",
1308
+ "bin": {
1309
+ "baseline-browser-mapping": "dist/cli.cjs"
1310
+ },
1311
+ "engines": {
1312
+ "node": ">=6.0.0"
1313
+ }
1314
+ },
1315
+ "node_modules/binary-extensions": {
1316
+ "version": "2.3.0",
1317
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1318
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1319
+ "dev": true,
1320
+ "license": "MIT",
1321
+ "engines": {
1322
+ "node": ">=8"
1323
+ },
1324
+ "funding": {
1325
+ "url": "https://github.com/sponsors/sindresorhus"
1326
+ }
1327
+ },
1328
+ "node_modules/braces": {
1329
+ "version": "3.0.3",
1330
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1331
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1332
+ "dev": true,
1333
+ "license": "MIT",
1334
+ "dependencies": {
1335
+ "fill-range": "^7.1.1"
1336
+ },
1337
+ "engines": {
1338
+ "node": ">=8"
1339
+ }
1340
+ },
1341
+ "node_modules/browserslist": {
1342
+ "version": "4.28.2",
1343
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
1344
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
1345
+ "dev": true,
1346
+ "funding": [
1347
+ {
1348
+ "type": "opencollective",
1349
+ "url": "https://opencollective.com/browserslist"
1350
+ },
1351
+ {
1352
+ "type": "tidelift",
1353
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1354
+ },
1355
+ {
1356
+ "type": "github",
1357
+ "url": "https://github.com/sponsors/ai"
1358
+ }
1359
+ ],
1360
+ "license": "MIT",
1361
+ "dependencies": {
1362
+ "baseline-browser-mapping": "^2.10.12",
1363
+ "caniuse-lite": "^1.0.30001782",
1364
+ "electron-to-chromium": "^1.5.328",
1365
+ "node-releases": "^2.0.36",
1366
+ "update-browserslist-db": "^1.2.3"
1367
+ },
1368
+ "bin": {
1369
+ "browserslist": "cli.js"
1370
+ },
1371
+ "engines": {
1372
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1373
+ }
1374
+ },
1375
+ "node_modules/camelcase-css": {
1376
+ "version": "2.0.1",
1377
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1378
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1379
+ "dev": true,
1380
+ "license": "MIT",
1381
+ "engines": {
1382
+ "node": ">= 6"
1383
+ }
1384
+ },
1385
+ "node_modules/caniuse-lite": {
1386
+ "version": "1.0.30001792",
1387
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
1388
+ "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
1389
+ "dev": true,
1390
+ "funding": [
1391
+ {
1392
+ "type": "opencollective",
1393
+ "url": "https://opencollective.com/browserslist"
1394
+ },
1395
+ {
1396
+ "type": "tidelift",
1397
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1398
+ },
1399
+ {
1400
+ "type": "github",
1401
+ "url": "https://github.com/sponsors/ai"
1402
+ }
1403
+ ],
1404
+ "license": "CC-BY-4.0"
1405
+ },
1406
+ "node_modules/chokidar": {
1407
+ "version": "3.6.0",
1408
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1409
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1410
+ "dev": true,
1411
+ "license": "MIT",
1412
+ "dependencies": {
1413
+ "anymatch": "~3.1.2",
1414
+ "braces": "~3.0.2",
1415
+ "glob-parent": "~5.1.2",
1416
+ "is-binary-path": "~2.1.0",
1417
+ "is-glob": "~4.0.1",
1418
+ "normalize-path": "~3.0.0",
1419
+ "readdirp": "~3.6.0"
1420
+ },
1421
+ "engines": {
1422
+ "node": ">= 8.10.0"
1423
+ },
1424
+ "funding": {
1425
+ "url": "https://paulmillr.com/funding/"
1426
+ },
1427
+ "optionalDependencies": {
1428
+ "fsevents": "~2.3.2"
1429
+ }
1430
+ },
1431
+ "node_modules/chokidar/node_modules/glob-parent": {
1432
+ "version": "5.1.2",
1433
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1434
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1435
+ "dev": true,
1436
+ "license": "ISC",
1437
+ "dependencies": {
1438
+ "is-glob": "^4.0.1"
1439
+ },
1440
+ "engines": {
1441
+ "node": ">= 6"
1442
+ }
1443
+ },
1444
+ "node_modules/commander": {
1445
+ "version": "4.1.1",
1446
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1447
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1448
+ "dev": true,
1449
+ "license": "MIT",
1450
+ "engines": {
1451
+ "node": ">= 6"
1452
+ }
1453
+ },
1454
+ "node_modules/convert-source-map": {
1455
+ "version": "2.0.0",
1456
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1457
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1458
+ "dev": true,
1459
+ "license": "MIT"
1460
+ },
1461
+ "node_modules/cssesc": {
1462
+ "version": "3.0.0",
1463
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1464
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1465
+ "dev": true,
1466
+ "license": "MIT",
1467
+ "bin": {
1468
+ "cssesc": "bin/cssesc"
1469
+ },
1470
+ "engines": {
1471
+ "node": ">=4"
1472
+ }
1473
+ },
1474
+ "node_modules/debug": {
1475
+ "version": "4.4.3",
1476
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1477
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1478
+ "dev": true,
1479
+ "license": "MIT",
1480
+ "dependencies": {
1481
+ "ms": "^2.1.3"
1482
+ },
1483
+ "engines": {
1484
+ "node": ">=6.0"
1485
+ },
1486
+ "peerDependenciesMeta": {
1487
+ "supports-color": {
1488
+ "optional": true
1489
+ }
1490
+ }
1491
+ },
1492
+ "node_modules/didyoumean": {
1493
+ "version": "1.2.2",
1494
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1495
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1496
+ "dev": true,
1497
+ "license": "Apache-2.0"
1498
+ },
1499
+ "node_modules/dlv": {
1500
+ "version": "1.1.3",
1501
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1502
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1503
+ "dev": true,
1504
+ "license": "MIT"
1505
+ },
1506
+ "node_modules/electron-to-chromium": {
1507
+ "version": "1.5.353",
1508
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz",
1509
+ "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==",
1510
+ "dev": true,
1511
+ "license": "ISC"
1512
+ },
1513
+ "node_modules/es-errors": {
1514
+ "version": "1.3.0",
1515
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
1516
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
1517
+ "dev": true,
1518
+ "license": "MIT",
1519
+ "engines": {
1520
+ "node": ">= 0.4"
1521
+ }
1522
+ },
1523
+ "node_modules/esbuild": {
1524
+ "version": "0.21.5",
1525
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1526
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1527
+ "dev": true,
1528
+ "hasInstallScript": true,
1529
+ "license": "MIT",
1530
+ "bin": {
1531
+ "esbuild": "bin/esbuild"
1532
+ },
1533
+ "engines": {
1534
+ "node": ">=12"
1535
+ },
1536
+ "optionalDependencies": {
1537
+ "@esbuild/aix-ppc64": "0.21.5",
1538
+ "@esbuild/android-arm": "0.21.5",
1539
+ "@esbuild/android-arm64": "0.21.5",
1540
+ "@esbuild/android-x64": "0.21.5",
1541
+ "@esbuild/darwin-arm64": "0.21.5",
1542
+ "@esbuild/darwin-x64": "0.21.5",
1543
+ "@esbuild/freebsd-arm64": "0.21.5",
1544
+ "@esbuild/freebsd-x64": "0.21.5",
1545
+ "@esbuild/linux-arm": "0.21.5",
1546
+ "@esbuild/linux-arm64": "0.21.5",
1547
+ "@esbuild/linux-ia32": "0.21.5",
1548
+ "@esbuild/linux-loong64": "0.21.5",
1549
+ "@esbuild/linux-mips64el": "0.21.5",
1550
+ "@esbuild/linux-ppc64": "0.21.5",
1551
+ "@esbuild/linux-riscv64": "0.21.5",
1552
+ "@esbuild/linux-s390x": "0.21.5",
1553
+ "@esbuild/linux-x64": "0.21.5",
1554
+ "@esbuild/netbsd-x64": "0.21.5",
1555
+ "@esbuild/openbsd-x64": "0.21.5",
1556
+ "@esbuild/sunos-x64": "0.21.5",
1557
+ "@esbuild/win32-arm64": "0.21.5",
1558
+ "@esbuild/win32-ia32": "0.21.5",
1559
+ "@esbuild/win32-x64": "0.21.5"
1560
+ }
1561
+ },
1562
+ "node_modules/escalade": {
1563
+ "version": "3.2.0",
1564
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1565
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1566
+ "dev": true,
1567
+ "license": "MIT",
1568
+ "engines": {
1569
+ "node": ">=6"
1570
+ }
1571
+ },
1572
+ "node_modules/fast-glob": {
1573
+ "version": "3.3.3",
1574
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1575
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1576
+ "dev": true,
1577
+ "license": "MIT",
1578
+ "dependencies": {
1579
+ "@nodelib/fs.stat": "^2.0.2",
1580
+ "@nodelib/fs.walk": "^1.2.3",
1581
+ "glob-parent": "^5.1.2",
1582
+ "merge2": "^1.3.0",
1583
+ "micromatch": "^4.0.8"
1584
+ },
1585
+ "engines": {
1586
+ "node": ">=8.6.0"
1587
+ }
1588
+ },
1589
+ "node_modules/fast-glob/node_modules/glob-parent": {
1590
+ "version": "5.1.2",
1591
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1592
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1593
+ "dev": true,
1594
+ "license": "ISC",
1595
+ "dependencies": {
1596
+ "is-glob": "^4.0.1"
1597
+ },
1598
+ "engines": {
1599
+ "node": ">= 6"
1600
+ }
1601
+ },
1602
+ "node_modules/fastq": {
1603
+ "version": "1.20.1",
1604
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
1605
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
1606
+ "dev": true,
1607
+ "license": "ISC",
1608
+ "dependencies": {
1609
+ "reusify": "^1.0.4"
1610
+ }
1611
+ },
1612
+ "node_modules/file-selector": {
1613
+ "version": "2.1.2",
1614
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz",
1615
+ "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==",
1616
+ "license": "MIT",
1617
+ "dependencies": {
1618
+ "tslib": "^2.7.0"
1619
+ },
1620
+ "engines": {
1621
+ "node": ">= 12"
1622
+ }
1623
+ },
1624
+ "node_modules/fill-range": {
1625
+ "version": "7.1.1",
1626
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1627
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1628
+ "dev": true,
1629
+ "license": "MIT",
1630
+ "dependencies": {
1631
+ "to-regex-range": "^5.0.1"
1632
+ },
1633
+ "engines": {
1634
+ "node": ">=8"
1635
+ }
1636
+ },
1637
+ "node_modules/fraction.js": {
1638
+ "version": "5.3.4",
1639
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
1640
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
1641
+ "dev": true,
1642
+ "license": "MIT",
1643
+ "engines": {
1644
+ "node": "*"
1645
+ },
1646
+ "funding": {
1647
+ "type": "github",
1648
+ "url": "https://github.com/sponsors/rawify"
1649
+ }
1650
+ },
1651
+ "node_modules/fsevents": {
1652
+ "version": "2.3.3",
1653
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1654
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1655
+ "dev": true,
1656
+ "hasInstallScript": true,
1657
+ "license": "MIT",
1658
+ "optional": true,
1659
+ "os": [
1660
+ "darwin"
1661
+ ],
1662
+ "engines": {
1663
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1664
+ }
1665
+ },
1666
+ "node_modules/function-bind": {
1667
+ "version": "1.1.2",
1668
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1669
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1670
+ "dev": true,
1671
+ "license": "MIT",
1672
+ "funding": {
1673
+ "url": "https://github.com/sponsors/ljharb"
1674
+ }
1675
+ },
1676
+ "node_modules/gensync": {
1677
+ "version": "1.0.0-beta.2",
1678
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1679
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1680
+ "dev": true,
1681
+ "license": "MIT",
1682
+ "engines": {
1683
+ "node": ">=6.9.0"
1684
+ }
1685
+ },
1686
+ "node_modules/glob-parent": {
1687
+ "version": "6.0.2",
1688
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1689
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1690
+ "dev": true,
1691
+ "license": "ISC",
1692
+ "dependencies": {
1693
+ "is-glob": "^4.0.3"
1694
+ },
1695
+ "engines": {
1696
+ "node": ">=10.13.0"
1697
+ }
1698
+ },
1699
+ "node_modules/hasown": {
1700
+ "version": "2.0.3",
1701
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
1702
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
1703
+ "dev": true,
1704
+ "license": "MIT",
1705
+ "dependencies": {
1706
+ "function-bind": "^1.1.2"
1707
+ },
1708
+ "engines": {
1709
+ "node": ">= 0.4"
1710
+ }
1711
+ },
1712
+ "node_modules/is-binary-path": {
1713
+ "version": "2.1.0",
1714
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1715
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1716
+ "dev": true,
1717
+ "license": "MIT",
1718
+ "dependencies": {
1719
+ "binary-extensions": "^2.0.0"
1720
+ },
1721
+ "engines": {
1722
+ "node": ">=8"
1723
+ }
1724
+ },
1725
+ "node_modules/is-core-module": {
1726
+ "version": "2.16.2",
1727
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
1728
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
1729
+ "dev": true,
1730
+ "license": "MIT",
1731
+ "dependencies": {
1732
+ "hasown": "^2.0.3"
1733
+ },
1734
+ "engines": {
1735
+ "node": ">= 0.4"
1736
+ },
1737
+ "funding": {
1738
+ "url": "https://github.com/sponsors/ljharb"
1739
+ }
1740
+ },
1741
+ "node_modules/is-extglob": {
1742
+ "version": "2.1.1",
1743
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1744
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1745
+ "dev": true,
1746
+ "license": "MIT",
1747
+ "engines": {
1748
+ "node": ">=0.10.0"
1749
+ }
1750
+ },
1751
+ "node_modules/is-glob": {
1752
+ "version": "4.0.3",
1753
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1754
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1755
+ "dev": true,
1756
+ "license": "MIT",
1757
+ "dependencies": {
1758
+ "is-extglob": "^2.1.1"
1759
+ },
1760
+ "engines": {
1761
+ "node": ">=0.10.0"
1762
+ }
1763
+ },
1764
+ "node_modules/is-number": {
1765
+ "version": "7.0.0",
1766
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1767
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1768
+ "dev": true,
1769
+ "license": "MIT",
1770
+ "engines": {
1771
+ "node": ">=0.12.0"
1772
+ }
1773
+ },
1774
+ "node_modules/jiti": {
1775
+ "version": "1.21.7",
1776
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
1777
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
1778
+ "dev": true,
1779
+ "license": "MIT",
1780
+ "bin": {
1781
+ "jiti": "bin/jiti.js"
1782
+ }
1783
+ },
1784
+ "node_modules/js-tokens": {
1785
+ "version": "4.0.0",
1786
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1787
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1788
+ "license": "MIT"
1789
+ },
1790
+ "node_modules/jsesc": {
1791
+ "version": "3.1.0",
1792
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1793
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1794
+ "dev": true,
1795
+ "license": "MIT",
1796
+ "bin": {
1797
+ "jsesc": "bin/jsesc"
1798
+ },
1799
+ "engines": {
1800
+ "node": ">=6"
1801
+ }
1802
+ },
1803
+ "node_modules/json5": {
1804
+ "version": "2.2.3",
1805
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1806
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1807
+ "dev": true,
1808
+ "license": "MIT",
1809
+ "bin": {
1810
+ "json5": "lib/cli.js"
1811
+ },
1812
+ "engines": {
1813
+ "node": ">=6"
1814
+ }
1815
+ },
1816
+ "node_modules/lilconfig": {
1817
+ "version": "3.1.3",
1818
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1819
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1820
+ "dev": true,
1821
+ "license": "MIT",
1822
+ "engines": {
1823
+ "node": ">=14"
1824
+ },
1825
+ "funding": {
1826
+ "url": "https://github.com/sponsors/antonk52"
1827
+ }
1828
+ },
1829
+ "node_modules/lines-and-columns": {
1830
+ "version": "1.2.4",
1831
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1832
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1833
+ "dev": true,
1834
+ "license": "MIT"
1835
+ },
1836
+ "node_modules/loose-envify": {
1837
+ "version": "1.4.0",
1838
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1839
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1840
+ "license": "MIT",
1841
+ "dependencies": {
1842
+ "js-tokens": "^3.0.0 || ^4.0.0"
1843
+ },
1844
+ "bin": {
1845
+ "loose-envify": "cli.js"
1846
+ }
1847
+ },
1848
+ "node_modules/lru-cache": {
1849
+ "version": "5.1.1",
1850
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1851
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1852
+ "dev": true,
1853
+ "license": "ISC",
1854
+ "dependencies": {
1855
+ "yallist": "^3.0.2"
1856
+ }
1857
+ },
1858
+ "node_modules/lucide-react": {
1859
+ "version": "0.468.0",
1860
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.468.0.tgz",
1861
+ "integrity": "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==",
1862
+ "license": "ISC",
1863
+ "peerDependencies": {
1864
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
1865
+ }
1866
+ },
1867
+ "node_modules/merge2": {
1868
+ "version": "1.4.1",
1869
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1870
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1871
+ "dev": true,
1872
+ "license": "MIT",
1873
+ "engines": {
1874
+ "node": ">= 8"
1875
+ }
1876
+ },
1877
+ "node_modules/micromatch": {
1878
+ "version": "4.0.8",
1879
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1880
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1881
+ "dev": true,
1882
+ "license": "MIT",
1883
+ "dependencies": {
1884
+ "braces": "^3.0.3",
1885
+ "picomatch": "^2.3.1"
1886
+ },
1887
+ "engines": {
1888
+ "node": ">=8.6"
1889
+ }
1890
+ },
1891
+ "node_modules/ms": {
1892
+ "version": "2.1.3",
1893
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1894
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1895
+ "dev": true,
1896
+ "license": "MIT"
1897
+ },
1898
+ "node_modules/mz": {
1899
+ "version": "2.7.0",
1900
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1901
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1902
+ "dev": true,
1903
+ "license": "MIT",
1904
+ "dependencies": {
1905
+ "any-promise": "^1.0.0",
1906
+ "object-assign": "^4.0.1",
1907
+ "thenify-all": "^1.0.0"
1908
+ }
1909
+ },
1910
+ "node_modules/nanoid": {
1911
+ "version": "3.3.12",
1912
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
1913
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
1914
+ "dev": true,
1915
+ "funding": [
1916
+ {
1917
+ "type": "github",
1918
+ "url": "https://github.com/sponsors/ai"
1919
+ }
1920
+ ],
1921
+ "license": "MIT",
1922
+ "bin": {
1923
+ "nanoid": "bin/nanoid.cjs"
1924
+ },
1925
+ "engines": {
1926
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1927
+ }
1928
+ },
1929
+ "node_modules/node-releases": {
1930
+ "version": "2.0.38",
1931
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
1932
+ "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
1933
+ "dev": true,
1934
+ "license": "MIT"
1935
+ },
1936
+ "node_modules/normalize-path": {
1937
+ "version": "3.0.0",
1938
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1939
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1940
+ "dev": true,
1941
+ "license": "MIT",
1942
+ "engines": {
1943
+ "node": ">=0.10.0"
1944
+ }
1945
+ },
1946
+ "node_modules/object-assign": {
1947
+ "version": "4.1.1",
1948
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1949
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1950
+ "license": "MIT",
1951
+ "engines": {
1952
+ "node": ">=0.10.0"
1953
+ }
1954
+ },
1955
+ "node_modules/object-hash": {
1956
+ "version": "3.0.0",
1957
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1958
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1959
+ "dev": true,
1960
+ "license": "MIT",
1961
+ "engines": {
1962
+ "node": ">= 6"
1963
+ }
1964
+ },
1965
+ "node_modules/path-parse": {
1966
+ "version": "1.0.7",
1967
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1968
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1969
+ "dev": true,
1970
+ "license": "MIT"
1971
+ },
1972
+ "node_modules/picocolors": {
1973
+ "version": "1.1.1",
1974
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1975
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1976
+ "dev": true,
1977
+ "license": "ISC"
1978
+ },
1979
+ "node_modules/picomatch": {
1980
+ "version": "2.3.2",
1981
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
1982
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
1983
+ "dev": true,
1984
+ "license": "MIT",
1985
+ "engines": {
1986
+ "node": ">=8.6"
1987
+ },
1988
+ "funding": {
1989
+ "url": "https://github.com/sponsors/jonschlinkert"
1990
+ }
1991
+ },
1992
+ "node_modules/pify": {
1993
+ "version": "2.3.0",
1994
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1995
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1996
+ "dev": true,
1997
+ "license": "MIT",
1998
+ "engines": {
1999
+ "node": ">=0.10.0"
2000
+ }
2001
+ },
2002
+ "node_modules/pirates": {
2003
+ "version": "4.0.7",
2004
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
2005
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
2006
+ "dev": true,
2007
+ "license": "MIT",
2008
+ "engines": {
2009
+ "node": ">= 6"
2010
+ }
2011
+ },
2012
+ "node_modules/postcss": {
2013
+ "version": "8.5.14",
2014
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
2015
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
2016
+ "dev": true,
2017
+ "funding": [
2018
+ {
2019
+ "type": "opencollective",
2020
+ "url": "https://opencollective.com/postcss/"
2021
+ },
2022
+ {
2023
+ "type": "tidelift",
2024
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2025
+ },
2026
+ {
2027
+ "type": "github",
2028
+ "url": "https://github.com/sponsors/ai"
2029
+ }
2030
+ ],
2031
+ "license": "MIT",
2032
+ "dependencies": {
2033
+ "nanoid": "^3.3.11",
2034
+ "picocolors": "^1.1.1",
2035
+ "source-map-js": "^1.2.1"
2036
+ },
2037
+ "engines": {
2038
+ "node": "^10 || ^12 || >=14"
2039
+ }
2040
+ },
2041
+ "node_modules/postcss-import": {
2042
+ "version": "15.1.0",
2043
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2044
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2045
+ "dev": true,
2046
+ "license": "MIT",
2047
+ "dependencies": {
2048
+ "postcss-value-parser": "^4.0.0",
2049
+ "read-cache": "^1.0.0",
2050
+ "resolve": "^1.1.7"
2051
+ },
2052
+ "engines": {
2053
+ "node": ">=14.0.0"
2054
+ },
2055
+ "peerDependencies": {
2056
+ "postcss": "^8.0.0"
2057
+ }
2058
+ },
2059
+ "node_modules/postcss-js": {
2060
+ "version": "4.1.0",
2061
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
2062
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
2063
+ "dev": true,
2064
+ "funding": [
2065
+ {
2066
+ "type": "opencollective",
2067
+ "url": "https://opencollective.com/postcss/"
2068
+ },
2069
+ {
2070
+ "type": "github",
2071
+ "url": "https://github.com/sponsors/ai"
2072
+ }
2073
+ ],
2074
+ "license": "MIT",
2075
+ "dependencies": {
2076
+ "camelcase-css": "^2.0.1"
2077
+ },
2078
+ "engines": {
2079
+ "node": "^12 || ^14 || >= 16"
2080
+ },
2081
+ "peerDependencies": {
2082
+ "postcss": "^8.4.21"
2083
+ }
2084
+ },
2085
+ "node_modules/postcss-load-config": {
2086
+ "version": "6.0.1",
2087
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
2088
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
2089
+ "dev": true,
2090
+ "funding": [
2091
+ {
2092
+ "type": "opencollective",
2093
+ "url": "https://opencollective.com/postcss/"
2094
+ },
2095
+ {
2096
+ "type": "github",
2097
+ "url": "https://github.com/sponsors/ai"
2098
+ }
2099
+ ],
2100
+ "license": "MIT",
2101
+ "dependencies": {
2102
+ "lilconfig": "^3.1.1"
2103
+ },
2104
+ "engines": {
2105
+ "node": ">= 18"
2106
+ },
2107
+ "peerDependencies": {
2108
+ "jiti": ">=1.21.0",
2109
+ "postcss": ">=8.0.9",
2110
+ "tsx": "^4.8.1",
2111
+ "yaml": "^2.4.2"
2112
+ },
2113
+ "peerDependenciesMeta": {
2114
+ "jiti": {
2115
+ "optional": true
2116
+ },
2117
+ "postcss": {
2118
+ "optional": true
2119
+ },
2120
+ "tsx": {
2121
+ "optional": true
2122
+ },
2123
+ "yaml": {
2124
+ "optional": true
2125
+ }
2126
+ }
2127
+ },
2128
+ "node_modules/postcss-nested": {
2129
+ "version": "6.2.0",
2130
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
2131
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
2132
+ "dev": true,
2133
+ "funding": [
2134
+ {
2135
+ "type": "opencollective",
2136
+ "url": "https://opencollective.com/postcss/"
2137
+ },
2138
+ {
2139
+ "type": "github",
2140
+ "url": "https://github.com/sponsors/ai"
2141
+ }
2142
+ ],
2143
+ "license": "MIT",
2144
+ "dependencies": {
2145
+ "postcss-selector-parser": "^6.1.1"
2146
+ },
2147
+ "engines": {
2148
+ "node": ">=12.0"
2149
+ },
2150
+ "peerDependencies": {
2151
+ "postcss": "^8.2.14"
2152
+ }
2153
+ },
2154
+ "node_modules/postcss-selector-parser": {
2155
+ "version": "6.1.2",
2156
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
2157
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
2158
+ "dev": true,
2159
+ "license": "MIT",
2160
+ "dependencies": {
2161
+ "cssesc": "^3.0.0",
2162
+ "util-deprecate": "^1.0.2"
2163
+ },
2164
+ "engines": {
2165
+ "node": ">=4"
2166
+ }
2167
+ },
2168
+ "node_modules/postcss-value-parser": {
2169
+ "version": "4.2.0",
2170
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2171
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
2172
+ "dev": true,
2173
+ "license": "MIT"
2174
+ },
2175
+ "node_modules/prop-types": {
2176
+ "version": "15.8.1",
2177
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2178
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2179
+ "license": "MIT",
2180
+ "dependencies": {
2181
+ "loose-envify": "^1.4.0",
2182
+ "object-assign": "^4.1.1",
2183
+ "react-is": "^16.13.1"
2184
+ }
2185
+ },
2186
+ "node_modules/queue-microtask": {
2187
+ "version": "1.2.3",
2188
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2189
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2190
+ "dev": true,
2191
+ "funding": [
2192
+ {
2193
+ "type": "github",
2194
+ "url": "https://github.com/sponsors/feross"
2195
+ },
2196
+ {
2197
+ "type": "patreon",
2198
+ "url": "https://www.patreon.com/feross"
2199
+ },
2200
+ {
2201
+ "type": "consulting",
2202
+ "url": "https://feross.org/support"
2203
+ }
2204
+ ],
2205
+ "license": "MIT"
2206
+ },
2207
+ "node_modules/react": {
2208
+ "version": "18.3.1",
2209
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2210
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2211
+ "license": "MIT",
2212
+ "dependencies": {
2213
+ "loose-envify": "^1.1.0"
2214
+ },
2215
+ "engines": {
2216
+ "node": ">=0.10.0"
2217
+ }
2218
+ },
2219
+ "node_modules/react-dom": {
2220
+ "version": "18.3.1",
2221
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2222
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2223
+ "license": "MIT",
2224
+ "dependencies": {
2225
+ "loose-envify": "^1.1.0",
2226
+ "scheduler": "^0.23.2"
2227
+ },
2228
+ "peerDependencies": {
2229
+ "react": "^18.3.1"
2230
+ }
2231
+ },
2232
+ "node_modules/react-dropzone": {
2233
+ "version": "15.0.0",
2234
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-15.0.0.tgz",
2235
+ "integrity": "sha512-lGjYV/EoqEjEWPnmiSvH4v5IoIAwQM2W4Z1C0Q/Pw2xD0eVzKPS359BQTUMum+1fa0kH2nrKjuavmTPOGhpLPg==",
2236
+ "license": "MIT",
2237
+ "dependencies": {
2238
+ "attr-accept": "^2.2.4",
2239
+ "file-selector": "^2.1.0",
2240
+ "prop-types": "^15.8.1"
2241
+ },
2242
+ "engines": {
2243
+ "node": ">= 10.13"
2244
+ },
2245
+ "peerDependencies": {
2246
+ "react": ">= 16.8 || 18.0.0"
2247
+ }
2248
+ },
2249
+ "node_modules/react-is": {
2250
+ "version": "16.13.1",
2251
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2252
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2253
+ "license": "MIT"
2254
+ },
2255
+ "node_modules/react-refresh": {
2256
+ "version": "0.17.0",
2257
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2258
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2259
+ "dev": true,
2260
+ "license": "MIT",
2261
+ "engines": {
2262
+ "node": ">=0.10.0"
2263
+ }
2264
+ },
2265
+ "node_modules/read-cache": {
2266
+ "version": "1.0.0",
2267
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2268
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2269
+ "dev": true,
2270
+ "license": "MIT",
2271
+ "dependencies": {
2272
+ "pify": "^2.3.0"
2273
+ }
2274
+ },
2275
+ "node_modules/readdirp": {
2276
+ "version": "3.6.0",
2277
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2278
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2279
+ "dev": true,
2280
+ "license": "MIT",
2281
+ "dependencies": {
2282
+ "picomatch": "^2.2.1"
2283
+ },
2284
+ "engines": {
2285
+ "node": ">=8.10.0"
2286
+ }
2287
+ },
2288
+ "node_modules/resolve": {
2289
+ "version": "1.22.12",
2290
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
2291
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
2292
+ "dev": true,
2293
+ "license": "MIT",
2294
+ "dependencies": {
2295
+ "es-errors": "^1.3.0",
2296
+ "is-core-module": "^2.16.1",
2297
+ "path-parse": "^1.0.7",
2298
+ "supports-preserve-symlinks-flag": "^1.0.0"
2299
+ },
2300
+ "bin": {
2301
+ "resolve": "bin/resolve"
2302
+ },
2303
+ "engines": {
2304
+ "node": ">= 0.4"
2305
+ },
2306
+ "funding": {
2307
+ "url": "https://github.com/sponsors/ljharb"
2308
+ }
2309
+ },
2310
+ "node_modules/reusify": {
2311
+ "version": "1.1.0",
2312
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2313
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2314
+ "dev": true,
2315
+ "license": "MIT",
2316
+ "engines": {
2317
+ "iojs": ">=1.0.0",
2318
+ "node": ">=0.10.0"
2319
+ }
2320
+ },
2321
+ "node_modules/rollup": {
2322
+ "version": "4.60.3",
2323
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz",
2324
+ "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==",
2325
+ "dev": true,
2326
+ "license": "MIT",
2327
+ "dependencies": {
2328
+ "@types/estree": "1.0.8"
2329
+ },
2330
+ "bin": {
2331
+ "rollup": "dist/bin/rollup"
2332
+ },
2333
+ "engines": {
2334
+ "node": ">=18.0.0",
2335
+ "npm": ">=8.0.0"
2336
+ },
2337
+ "optionalDependencies": {
2338
+ "@rollup/rollup-android-arm-eabi": "4.60.3",
2339
+ "@rollup/rollup-android-arm64": "4.60.3",
2340
+ "@rollup/rollup-darwin-arm64": "4.60.3",
2341
+ "@rollup/rollup-darwin-x64": "4.60.3",
2342
+ "@rollup/rollup-freebsd-arm64": "4.60.3",
2343
+ "@rollup/rollup-freebsd-x64": "4.60.3",
2344
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.3",
2345
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.3",
2346
+ "@rollup/rollup-linux-arm64-gnu": "4.60.3",
2347
+ "@rollup/rollup-linux-arm64-musl": "4.60.3",
2348
+ "@rollup/rollup-linux-loong64-gnu": "4.60.3",
2349
+ "@rollup/rollup-linux-loong64-musl": "4.60.3",
2350
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.3",
2351
+ "@rollup/rollup-linux-ppc64-musl": "4.60.3",
2352
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.3",
2353
+ "@rollup/rollup-linux-riscv64-musl": "4.60.3",
2354
+ "@rollup/rollup-linux-s390x-gnu": "4.60.3",
2355
+ "@rollup/rollup-linux-x64-gnu": "4.60.3",
2356
+ "@rollup/rollup-linux-x64-musl": "4.60.3",
2357
+ "@rollup/rollup-openbsd-x64": "4.60.3",
2358
+ "@rollup/rollup-openharmony-arm64": "4.60.3",
2359
+ "@rollup/rollup-win32-arm64-msvc": "4.60.3",
2360
+ "@rollup/rollup-win32-ia32-msvc": "4.60.3",
2361
+ "@rollup/rollup-win32-x64-gnu": "4.60.3",
2362
+ "@rollup/rollup-win32-x64-msvc": "4.60.3",
2363
+ "fsevents": "~2.3.2"
2364
+ }
2365
+ },
2366
+ "node_modules/run-parallel": {
2367
+ "version": "1.2.0",
2368
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2369
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2370
+ "dev": true,
2371
+ "funding": [
2372
+ {
2373
+ "type": "github",
2374
+ "url": "https://github.com/sponsors/feross"
2375
+ },
2376
+ {
2377
+ "type": "patreon",
2378
+ "url": "https://www.patreon.com/feross"
2379
+ },
2380
+ {
2381
+ "type": "consulting",
2382
+ "url": "https://feross.org/support"
2383
+ }
2384
+ ],
2385
+ "license": "MIT",
2386
+ "dependencies": {
2387
+ "queue-microtask": "^1.2.2"
2388
+ }
2389
+ },
2390
+ "node_modules/scheduler": {
2391
+ "version": "0.23.2",
2392
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2393
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2394
+ "license": "MIT",
2395
+ "dependencies": {
2396
+ "loose-envify": "^1.1.0"
2397
+ }
2398
+ },
2399
+ "node_modules/semver": {
2400
+ "version": "6.3.1",
2401
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2402
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2403
+ "dev": true,
2404
+ "license": "ISC",
2405
+ "bin": {
2406
+ "semver": "bin/semver.js"
2407
+ }
2408
+ },
2409
+ "node_modules/source-map-js": {
2410
+ "version": "1.2.1",
2411
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2412
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2413
+ "dev": true,
2414
+ "license": "BSD-3-Clause",
2415
+ "engines": {
2416
+ "node": ">=0.10.0"
2417
+ }
2418
+ },
2419
+ "node_modules/sucrase": {
2420
+ "version": "3.35.1",
2421
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
2422
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
2423
+ "dev": true,
2424
+ "license": "MIT",
2425
+ "dependencies": {
2426
+ "@jridgewell/gen-mapping": "^0.3.2",
2427
+ "commander": "^4.0.0",
2428
+ "lines-and-columns": "^1.1.6",
2429
+ "mz": "^2.7.0",
2430
+ "pirates": "^4.0.1",
2431
+ "tinyglobby": "^0.2.11",
2432
+ "ts-interface-checker": "^0.1.9"
2433
+ },
2434
+ "bin": {
2435
+ "sucrase": "bin/sucrase",
2436
+ "sucrase-node": "bin/sucrase-node"
2437
+ },
2438
+ "engines": {
2439
+ "node": ">=16 || 14 >=14.17"
2440
+ }
2441
+ },
2442
+ "node_modules/supports-preserve-symlinks-flag": {
2443
+ "version": "1.0.0",
2444
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2445
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2446
+ "dev": true,
2447
+ "license": "MIT",
2448
+ "engines": {
2449
+ "node": ">= 0.4"
2450
+ },
2451
+ "funding": {
2452
+ "url": "https://github.com/sponsors/ljharb"
2453
+ }
2454
+ },
2455
+ "node_modules/tailwindcss": {
2456
+ "version": "3.4.19",
2457
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
2458
+ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
2459
+ "dev": true,
2460
+ "license": "MIT",
2461
+ "dependencies": {
2462
+ "@alloc/quick-lru": "^5.2.0",
2463
+ "arg": "^5.0.2",
2464
+ "chokidar": "^3.6.0",
2465
+ "didyoumean": "^1.2.2",
2466
+ "dlv": "^1.1.3",
2467
+ "fast-glob": "^3.3.2",
2468
+ "glob-parent": "^6.0.2",
2469
+ "is-glob": "^4.0.3",
2470
+ "jiti": "^1.21.7",
2471
+ "lilconfig": "^3.1.3",
2472
+ "micromatch": "^4.0.8",
2473
+ "normalize-path": "^3.0.0",
2474
+ "object-hash": "^3.0.0",
2475
+ "picocolors": "^1.1.1",
2476
+ "postcss": "^8.4.47",
2477
+ "postcss-import": "^15.1.0",
2478
+ "postcss-js": "^4.0.1",
2479
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
2480
+ "postcss-nested": "^6.2.0",
2481
+ "postcss-selector-parser": "^6.1.2",
2482
+ "resolve": "^1.22.8",
2483
+ "sucrase": "^3.35.0"
2484
+ },
2485
+ "bin": {
2486
+ "tailwind": "lib/cli.js",
2487
+ "tailwindcss": "lib/cli.js"
2488
+ },
2489
+ "engines": {
2490
+ "node": ">=14.0.0"
2491
+ }
2492
+ },
2493
+ "node_modules/thenify": {
2494
+ "version": "3.3.1",
2495
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2496
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2497
+ "dev": true,
2498
+ "license": "MIT",
2499
+ "dependencies": {
2500
+ "any-promise": "^1.0.0"
2501
+ }
2502
+ },
2503
+ "node_modules/thenify-all": {
2504
+ "version": "1.6.0",
2505
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2506
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2507
+ "dev": true,
2508
+ "license": "MIT",
2509
+ "dependencies": {
2510
+ "thenify": ">= 3.1.0 < 4"
2511
+ },
2512
+ "engines": {
2513
+ "node": ">=0.8"
2514
+ }
2515
+ },
2516
+ "node_modules/tinyglobby": {
2517
+ "version": "0.2.16",
2518
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
2519
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
2520
+ "dev": true,
2521
+ "license": "MIT",
2522
+ "dependencies": {
2523
+ "fdir": "^6.5.0",
2524
+ "picomatch": "^4.0.4"
2525
+ },
2526
+ "engines": {
2527
+ "node": ">=12.0.0"
2528
+ },
2529
+ "funding": {
2530
+ "url": "https://github.com/sponsors/SuperchupuDev"
2531
+ }
2532
+ },
2533
+ "node_modules/tinyglobby/node_modules/fdir": {
2534
+ "version": "6.5.0",
2535
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2536
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2537
+ "dev": true,
2538
+ "license": "MIT",
2539
+ "engines": {
2540
+ "node": ">=12.0.0"
2541
+ },
2542
+ "peerDependencies": {
2543
+ "picomatch": "^3 || ^4"
2544
+ },
2545
+ "peerDependenciesMeta": {
2546
+ "picomatch": {
2547
+ "optional": true
2548
+ }
2549
+ }
2550
+ },
2551
+ "node_modules/tinyglobby/node_modules/picomatch": {
2552
+ "version": "4.0.4",
2553
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
2554
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
2555
+ "dev": true,
2556
+ "license": "MIT",
2557
+ "engines": {
2558
+ "node": ">=12"
2559
+ },
2560
+ "funding": {
2561
+ "url": "https://github.com/sponsors/jonschlinkert"
2562
+ }
2563
+ },
2564
+ "node_modules/to-regex-range": {
2565
+ "version": "5.0.1",
2566
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2567
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2568
+ "dev": true,
2569
+ "license": "MIT",
2570
+ "dependencies": {
2571
+ "is-number": "^7.0.0"
2572
+ },
2573
+ "engines": {
2574
+ "node": ">=8.0"
2575
+ }
2576
+ },
2577
+ "node_modules/ts-interface-checker": {
2578
+ "version": "0.1.13",
2579
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2580
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2581
+ "dev": true,
2582
+ "license": "Apache-2.0"
2583
+ },
2584
+ "node_modules/tslib": {
2585
+ "version": "2.8.1",
2586
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2587
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2588
+ "license": "0BSD"
2589
+ },
2590
+ "node_modules/update-browserslist-db": {
2591
+ "version": "1.2.3",
2592
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
2593
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
2594
+ "dev": true,
2595
+ "funding": [
2596
+ {
2597
+ "type": "opencollective",
2598
+ "url": "https://opencollective.com/browserslist"
2599
+ },
2600
+ {
2601
+ "type": "tidelift",
2602
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2603
+ },
2604
+ {
2605
+ "type": "github",
2606
+ "url": "https://github.com/sponsors/ai"
2607
+ }
2608
+ ],
2609
+ "license": "MIT",
2610
+ "dependencies": {
2611
+ "escalade": "^3.2.0",
2612
+ "picocolors": "^1.1.1"
2613
+ },
2614
+ "bin": {
2615
+ "update-browserslist-db": "cli.js"
2616
+ },
2617
+ "peerDependencies": {
2618
+ "browserslist": ">= 4.21.0"
2619
+ }
2620
+ },
2621
+ "node_modules/util-deprecate": {
2622
+ "version": "1.0.2",
2623
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2624
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2625
+ "dev": true,
2626
+ "license": "MIT"
2627
+ },
2628
+ "node_modules/vite": {
2629
+ "version": "5.4.21",
2630
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
2631
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
2632
+ "dev": true,
2633
+ "license": "MIT",
2634
+ "dependencies": {
2635
+ "esbuild": "^0.21.3",
2636
+ "postcss": "^8.4.43",
2637
+ "rollup": "^4.20.0"
2638
+ },
2639
+ "bin": {
2640
+ "vite": "bin/vite.js"
2641
+ },
2642
+ "engines": {
2643
+ "node": "^18.0.0 || >=20.0.0"
2644
+ },
2645
+ "funding": {
2646
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2647
+ },
2648
+ "optionalDependencies": {
2649
+ "fsevents": "~2.3.3"
2650
+ },
2651
+ "peerDependencies": {
2652
+ "@types/node": "^18.0.0 || >=20.0.0",
2653
+ "less": "*",
2654
+ "lightningcss": "^1.21.0",
2655
+ "sass": "*",
2656
+ "sass-embedded": "*",
2657
+ "stylus": "*",
2658
+ "sugarss": "*",
2659
+ "terser": "^5.4.0"
2660
+ },
2661
+ "peerDependenciesMeta": {
2662
+ "@types/node": {
2663
+ "optional": true
2664
+ },
2665
+ "less": {
2666
+ "optional": true
2667
+ },
2668
+ "lightningcss": {
2669
+ "optional": true
2670
+ },
2671
+ "sass": {
2672
+ "optional": true
2673
+ },
2674
+ "sass-embedded": {
2675
+ "optional": true
2676
+ },
2677
+ "stylus": {
2678
+ "optional": true
2679
+ },
2680
+ "sugarss": {
2681
+ "optional": true
2682
+ },
2683
+ "terser": {
2684
+ "optional": true
2685
+ }
2686
+ }
2687
+ },
2688
+ "node_modules/yallist": {
2689
+ "version": "3.1.1",
2690
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2691
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2692
+ "dev": true,
2693
+ "license": "ISC"
2694
+ }
2695
+ }
2696
+ }
frontend/package.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "codeblue-context-ui",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "react": "^18.3.1",
13
+ "react-dom": "^18.3.1",
14
+ "react-dropzone": "^15.0.0",
15
+ "lucide-react": "^0.468.0"
16
+ },
17
+ "devDependencies": {
18
+ "@vitejs/plugin-react": "^4.3.4",
19
+ "autoprefixer": "^10.4.21",
20
+ "postcss": "^8.5.3",
21
+ "tailwindcss": "^3.4.17",
22
+ "vite": "^5.4.19"
23
+ }
24
+ }
frontend/postcss.config.cjs ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
frontend/src/AgentPanel.jsx ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // AgentPanel.jsx β€” Center orchestration column
2
+ import { useState } from 'react';
3
+ import { ShieldAlert, FlaskConical, Stethoscope, ListChecks, Zap, CheckCircle, Loader, Circle, ChevronDown, ChevronUp } from 'lucide-react';
4
+
5
+ const AGENTS = [
6
+ { key: 'triage', label: 'Triage Agent', icon: <Zap size={14}/>, desc: 'Severity classification & chief complaint' },
7
+ { key: 'contraindication', label: 'Contraindication Guardian', icon: <ShieldAlert size={14}/>, desc: 'Drug interactions & allergy risks' },
8
+ { key: 'labs', label: 'Lab Interpreter', icon: <FlaskConical size={14}/>, desc: 'Critical lab findings & patterns' },
9
+ { key: 'differentials', label: 'Differential Diagnosis', icon: <Stethoscope size={14}/>, desc: 'Top 3 differentials from evidence' },
10
+ { key: 'action_protocol', label: 'Action Protocol', icon: <ListChecks size={14}/>, desc: 'Immediate ordered steps & disposition' },
11
+ ];
12
+
13
+ function StatusIcon({ status }) {
14
+ if (status === 'working') return <div className="spinner" />;
15
+ if (status === 'complete') return <CheckCircle size={15} color="var(--green-safe)" />;
16
+ if (status === 'error') return <Circle size={15} color="var(--red-critical)" />;
17
+ return <Circle size={15} color="var(--text-tertiary)" />;
18
+ }
19
+
20
+ function AgentRow({ agent, status, result, expanded, onToggle }) {
21
+ const cls = status === 'idle' ? 'agent-idle'
22
+ : status === 'working' ? 'agent-working'
23
+ : status === 'complete' ? 'agent-complete'
24
+ : 'agent-error';
25
+
26
+ const hasResult = result && status === 'complete';
27
+
28
+ return (
29
+ <div className={`card ${cls}`} style={{ marginBottom: 8, transition: 'all 0.3s' }}>
30
+ <div
31
+ onClick={hasResult ? onToggle : undefined}
32
+ style={{
33
+ display: 'flex', alignItems: 'center', gap: 10, padding: '10px 14px',
34
+ cursor: hasResult ? 'pointer' : 'default',
35
+ }}
36
+ >
37
+ <div style={{
38
+ width: 28, height: 28, borderRadius: 7,
39
+ background: 'rgba(255,255,255,0.04)',
40
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
41
+ color: status === 'complete' ? 'var(--green-safe)' : status === 'working' ? 'var(--blue-accent)' : 'var(--text-tertiary)',
42
+ }}>
43
+ {agent.icon}
44
+ </div>
45
+ <div style={{ flex: 1, minWidth: 0 }}>
46
+ <div style={{ fontSize: 12, fontWeight: 600, color: status === 'idle' ? 'var(--text-secondary)' : 'var(--text-primary)' }}>
47
+ {agent.label}
48
+ </div>
49
+ <div style={{ fontSize: 10, color: 'var(--text-tertiary)' }}>{agent.desc}</div>
50
+ </div>
51
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
52
+ <StatusIcon status={status} />
53
+ {hasResult && (expanded ? <ChevronUp size={12} color="var(--text-tertiary)"/> : <ChevronDown size={12} color="var(--text-tertiary)"/>)}
54
+ </div>
55
+ </div>
56
+
57
+ {hasResult && expanded && (
58
+ <div style={{ padding: '0 14px 12px', borderTop: '1px solid var(--border-subtle)', paddingTop: 10 }} className="fade-in">
59
+ <AgentResultPreview agentKey={agent.key} result={result} />
60
+ </div>
61
+ )}
62
+ </div>
63
+ );
64
+ }
65
+
66
+ function AgentResultPreview({ agentKey, result }) {
67
+ const style = { fontSize: 11, color: 'var(--text-secondary)', lineHeight: 1.6 };
68
+ const tag = (text, color) => (
69
+ <span style={{ background: color + '20', color, border: `1px solid ${color}40`, borderRadius: 4, padding: '1px 6px', fontSize: 10, fontWeight: 700, marginRight: 4 }}>
70
+ {text}
71
+ </span>
72
+ );
73
+
74
+ if (agentKey === 'triage') return (
75
+ <div style={style}>
76
+ {tag(`ESI ${result.severity}: ${result.severity_label}`,
77
+ result.severity <= 2 ? 'var(--red-critical)' : result.severity === 3 ? 'var(--amber-warning)' : 'var(--green-safe)')}
78
+ <p style={{ marginTop: 6 }}>{result.chief_complaint}</p>
79
+ {(result.time_critical_flags || []).map((f, i) => <p key={i}>⚑ {f}</p>)}
80
+ </div>
81
+ );
82
+
83
+ if (agentKey === 'contraindication') return (
84
+ <div style={style}>
85
+ {tag(result.treatment_verdict,
86
+ result.treatment_verdict === 'SAFE' ? 'var(--green-safe)'
87
+ : result.treatment_verdict === 'CONTRAINDICATED' ? 'var(--red-critical)'
88
+ : 'var(--amber-warning)')}
89
+ <p style={{ marginTop: 6 }}>{result.verdict_reason}</p>
90
+ {(result.allergy_risks || []).slice(0, 2).map((r, i) => (
91
+ <p key={i} style={{ color: 'var(--red-critical)' }}>⚠ Allergy: {r.substance} β†’ {r.risk}</p>
92
+ ))}
93
+ {(result.drug_interactions || []).slice(0, 2).map((d, i) => (
94
+ <p key={i} style={{ color: 'var(--amber-warning)' }}>πŸ’Š {d.drug_a} + {d.drug_b}: {d.interaction}</p>
95
+ ))}
96
+ </div>
97
+ );
98
+
99
+ if (agentKey === 'labs') return (
100
+ <div style={style}>
101
+ {(result.critical_labs || []).map((l, i) => (
102
+ <p key={i} style={{ color: 'var(--red-critical)' }}>πŸ”΄ {l.name}: {l.value} β€” {l.significance}</p>
103
+ ))}
104
+ {(result.abnormal_labs || []).map((l, i) => (
105
+ <p key={i} style={{ color: 'var(--amber-warning)' }}>🟑 {l.name}: {l.value} β€” {l.significance}</p>
106
+ ))}
107
+ {(result.immediate_concerns || []).slice(0, 2).map((c, i) => <p key={i}>β†’ {c}</p>)}
108
+ </div>
109
+ );
110
+
111
+ if (agentKey === 'differentials') return (
112
+ <div style={style}>
113
+ {(result.differentials || []).map((d, i) => (
114
+ <div key={i} style={{ marginBottom: 6 }}>
115
+ {tag(d.likelihood, d.likelihood === 'HIGH' ? 'var(--red-critical)' : d.likelihood === 'MODERATE' ? 'var(--amber-warning)' : 'var(--text-secondary)')}
116
+ <span style={{ fontWeight: 600, color: 'var(--text-primary)' }}>{d.diagnosis}</span>
117
+ {d.must_rule_out && <span style={{ color: 'var(--red-critical)', fontSize: 10, marginLeft: 6 }}>MUST RULE OUT</span>}
118
+ </div>
119
+ ))}
120
+ </div>
121
+ );
122
+
123
+ if (agentKey === 'action_protocol') return (
124
+ <div style={style}>
125
+ {(result.immediate_actions || []).map((a, i) => <p key={i}>{i + 1}. {a}</p>)}
126
+ {result.disposition && (
127
+ <p style={{ marginTop: 6, fontWeight: 700, color: 'var(--blue-accent)' }}>
128
+ Disposition β†’ {result.disposition}
129
+ </p>
130
+ )}
131
+ </div>
132
+ );
133
+
134
+ return null;
135
+ }
136
+
137
+ export function AgentPanel({ agentStatuses, agentResults, onRun, patient, running }) {
138
+ const [expanded, setExpanded] = useState({});
139
+ const toggle = key => setExpanded(e => ({ ...e, [key]: !e[key] }));
140
+
141
+ const doneCount = AGENTS.filter(a => agentStatuses[a.key] === 'complete').length;
142
+
143
+ return (
144
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
145
+ <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--border-subtle)' }}>
146
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
147
+ <span style={{ fontWeight: 700, fontSize: 13, color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>
148
+ Agent Orchestration
149
+ </span>
150
+ {running && (
151
+ <span style={{ fontSize: 11, color: 'var(--blue-accent)', display: 'flex', alignItems: 'center', gap: 5 }}>
152
+ <div className="spinner" style={{ width: 12, height: 12 }} /> {doneCount}/5 complete
153
+ </span>
154
+ )}
155
+ </div>
156
+ </div>
157
+
158
+ <div style={{ padding: '12px 14px', flex: 1, overflowY: 'auto' }}>
159
+ {!patient && (
160
+ <div style={{ textAlign: 'center', padding: '40px 20px', color: 'var(--text-tertiary)', fontSize: 13 }}>
161
+ Select a patient to run emergency analysis
162
+ </div>
163
+ )}
164
+
165
+ {patient && (
166
+ <>
167
+ {/* Patient summary strip */}
168
+ <div style={{
169
+ padding: '8px 12px', borderRadius: 8, marginBottom: 14,
170
+ background: 'var(--bg-surface)', border: '1px solid var(--border-subtle)',
171
+ fontSize: 12, color: 'var(--text-secondary)', display: 'flex', gap: 12,
172
+ }}>
173
+ <span style={{ fontWeight: 700, color: 'var(--text-primary)' }}>{patient.display_name}</span>
174
+ <span>{patient.age}y {patient.gender}</span>
175
+ <span style={{ marginLeft: 'auto' }}>
176
+ <span className={`badge badge-${patient.risk_level || 'stable'}`}>{patient.risk_level}</span>
177
+ </span>
178
+ </div>
179
+
180
+ {/* Agent rows */}
181
+ {AGENTS.map(a => (
182
+ <AgentRow
183
+ key={a.key} agent={a}
184
+ status={agentStatuses[a.key] || 'idle'}
185
+ result={agentResults[a.key]}
186
+ expanded={expanded[a.key]}
187
+ onToggle={() => toggle(a.key)}
188
+ />
189
+ ))}
190
+
191
+ {/* Run button */}
192
+ <button className="btn-danger" style={{ marginTop: 10 }} onClick={onRun} disabled={running}>
193
+ {running
194
+ ? <><div className="spinner" /> Analyzing...</>
195
+ : <><Zap size={15} /> Generate Emergency Snapshot</>}
196
+ </button>
197
+ </>
198
+ )}
199
+ </div>
200
+ </div>
201
+ );
202
+ }
frontend/src/App.jsx ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { Activity } from 'lucide-react';
3
+ import Welcome from './Welcome';
4
+ import { PatientPanel } from './PatientPanel';
5
+ import { AgentPanel } from './AgentPanel';
6
+ import { BriefPanel } from './BriefPanel';
7
+
8
+ const API = import.meta.env.VITE_API_BASE || 'http://localhost:8000';
9
+
10
+ const INITIAL_STATUSES = {
11
+ triage: 'idle', contraindication: 'idle',
12
+ labs: 'idle', differentials: 'idle', action_protocol: 'idle',
13
+ };
14
+
15
+ // Staggered agent activation for visual drama
16
+ const AGENT_ORDER = ['triage', 'contraindication', 'labs', 'differentials', 'action_protocol'];
17
+
18
+ export default function App() {
19
+ const [showWelcome, setShowWelcome] = useState(true);
20
+ const [patients, setPatients] = useState([]);
21
+ const [patientsLoading, setPatientsLoading] = useState(false);
22
+ const [selected, setSelected] = useState(null);
23
+ const [running, setRunning] = useState(false);
24
+ const [agentStatuses, setAgentStatuses] = useState(INITIAL_STATUSES);
25
+ const [agentResults, setAgentResults] = useState({});
26
+ const [briefData, setBriefData] = useState(null);
27
+
28
+ // Load patients
29
+ const fetchPatients = useCallback(async () => {
30
+ setPatientsLoading(true);
31
+ try {
32
+ const res = await fetch(`${API}/patients`);
33
+ const data = await res.json();
34
+ setPatients(data.patients || []);
35
+ } catch {
36
+ setPatients([]);
37
+ } finally {
38
+ setPatientsLoading(false);
39
+ }
40
+ }, []);
41
+
42
+ useEffect(() => { fetchPatients(); }, [fetchPatients]);
43
+
44
+ const handleSelectPatient = (patient) => {
45
+ setSelected(patient);
46
+ setBriefData(null);
47
+ setAgentStatuses(INITIAL_STATUSES);
48
+ setAgentResults({});
49
+ };
50
+
51
+ // Upload patient JSON
52
+ const handleUpload = async (e) => {
53
+ const file = e.target.files[0];
54
+ if (!file) return;
55
+ const form = new FormData();
56
+ form.append('file', file);
57
+ try {
58
+ await fetch(`${API}/patients/upload`, { method: 'POST', body: form });
59
+ fetchPatients();
60
+ } catch { /* ignore */ }
61
+ e.target.value = '';
62
+ };
63
+
64
+ // Run 5-agent orchestration with staggered UI animation
65
+ const runOrchestration = async () => {
66
+ if (!selected || running) return;
67
+ setRunning(true);
68
+ setBriefData(null);
69
+ setAgentResults({});
70
+
71
+ // Light up agents one by one with a delay for UX drama
72
+ const activateAgents = async () => {
73
+ for (let i = 0; i < AGENT_ORDER.length; i++) {
74
+ const key = AGENT_ORDER[i];
75
+ setAgentStatuses(prev => ({ ...prev, [key]: 'working' }));
76
+ await new Promise(r => setTimeout(r, 180));
77
+ }
78
+ };
79
+ activateAgents(); // fire and don't await β€” let it animate while API call runs
80
+
81
+ try {
82
+ const res = await fetch(`${API}/orchestrate/${selected.id}`);
83
+ if (!res.ok) throw new Error('API error');
84
+ const data = await res.json();
85
+
86
+ // Mark all complete with slight stagger
87
+ for (let i = 0; i < AGENT_ORDER.length; i++) {
88
+ const key = AGENT_ORDER[i];
89
+ await new Promise(r => setTimeout(r, 120));
90
+ setAgentStatuses(prev => ({ ...prev, [key]: 'complete' }));
91
+ setAgentResults(prev => ({ ...prev, [key]: data.agents?.[key] }));
92
+ }
93
+
94
+ setBriefData(data);
95
+ // Update the patient risk in sidebar from triage
96
+ if (data.agents?.triage?.severity) {
97
+ const sev = data.agents.triage.severity;
98
+ const risk = sev <= 2 ? 'critical' : sev === 3 ? 'moderate' : 'stable';
99
+ setSelected(prev => prev ? { ...prev, risk_level: risk } : prev);
100
+ }
101
+ } catch {
102
+ AGENT_ORDER.forEach(key => {
103
+ setAgentStatuses(prev => ({ ...prev, [key]: 'error' }));
104
+ });
105
+ } finally {
106
+ setRunning(false);
107
+ }
108
+ };
109
+
110
+ if (showWelcome) return <Welcome onStart={() => setShowWelcome(false)} />;
111
+
112
+ return (
113
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100vh', overflow: 'hidden' }}>
114
+ {/* Header */}
115
+ <header style={{
116
+ display: 'flex', alignItems: 'center', justifyContent: 'space-between',
117
+ padding: '0 20px', height: 48, flexShrink: 0,
118
+ background: 'var(--bg-surface)', borderBottom: '1px solid var(--border-subtle)',
119
+ zIndex: 10,
120
+ }}>
121
+ <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
122
+ <div style={{ animation: 'heartbeat 1.4s infinite', color: 'var(--red-critical)' }}>
123
+ <Activity size={20} />
124
+ </div>
125
+ <span style={{ fontWeight: 800, fontSize: 15, letterSpacing: '-0.02em' }}>CodeBlue Context</span>
126
+ <span style={{
127
+ fontSize: 10, fontWeight: 600, padding: '2px 8px', borderRadius: 99,
128
+ background: 'rgba(255,45,85,0.15)', color: 'var(--red-critical)',
129
+ border: '1px solid rgba(255,45,85,0.3)', letterSpacing: '0.05em',
130
+ }}>
131
+ EMERGENCY INTELLIGENCE
132
+ </span>
133
+ </div>
134
+
135
+ <div style={{ display: 'flex', alignItems: 'center', gap: 16, fontSize: 11, color: 'var(--text-tertiary)' }}>
136
+ <span>
137
+ <span style={{ color: 'var(--green-safe)', fontWeight: 700 }}>●</span> System Online
138
+ </span>
139
+ <span>{patients.length} patients</span>
140
+ <div style={{
141
+ padding: '4px 12px', borderRadius: 99,
142
+ background: 'rgba(48,209,88,0.08)',
143
+ border: '1px solid rgba(48,209,88,0.2)',
144
+ color: 'var(--green-safe)', fontWeight: 700,
145
+ }}>
146
+ 15 min β†’ &lt;10 sec
147
+ </div>
148
+ </div>
149
+ </header>
150
+
151
+ {/* 3-column layout */}
152
+ <div style={{ flex: 1, display: 'grid', gridTemplateColumns: '240px 1fr 1fr', overflow: 'hidden' }}>
153
+
154
+ {/* Left: Patient List */}
155
+ <div style={{ borderRight: '1px solid var(--border-subtle)', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>
156
+ <PatientPanel
157
+ patients={patients}
158
+ selected={selected}
159
+ onSelect={handleSelectPatient}
160
+ onUpload={handleUpload}
161
+ loading={patientsLoading}
162
+ />
163
+ </div>
164
+
165
+ {/* Center: Agent Orchestration */}
166
+ <div style={{ borderRight: '1px solid var(--border-subtle)', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>
167
+ <AgentPanel
168
+ patient={selected}
169
+ agentStatuses={agentStatuses}
170
+ agentResults={agentResults}
171
+ onRun={runOrchestration}
172
+ running={running}
173
+ />
174
+ </div>
175
+
176
+ {/* Right: Emergency Brief */}
177
+ <div style={{ overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>
178
+ <BriefPanel data={briefData} patient={selected} />
179
+ </div>
180
+ </div>
181
+ </div>
182
+ );
183
+ }
frontend/src/BriefPanel.jsx ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // BriefPanel.jsx β€” Right column: Emergency Brief + Treatment Checker
2
+ import { useState } from 'react';
3
+ import { ShieldAlert, FlaskConical, Stethoscope, ListChecks, AlertTriangle, Clock, Send, CheckCircle, XCircle, AlertCircle } from 'lucide-react';
4
+
5
+ const API_BASE = import.meta.env.VITE_API_BASE || 'http://localhost:8000';
6
+
7
+ function Section({ title, icon, children, accent }) {
8
+ return (
9
+ <div className="fade-up" style={{
10
+ marginBottom: 14, borderRadius: 10,
11
+ background: 'var(--bg-surface)',
12
+ border: `1px solid ${accent ? accent + '30' : 'var(--border-subtle)'}`,
13
+ overflow: 'hidden',
14
+ }}>
15
+ <div style={{
16
+ padding: '8px 14px', display: 'flex', alignItems: 'center', gap: 8,
17
+ borderBottom: '1px solid var(--border-subtle)',
18
+ background: accent ? accent + '08' : 'transparent',
19
+ }}>
20
+ <span style={{ color: accent || 'var(--text-secondary)' }}>{icon}</span>
21
+ <span style={{ fontSize: 11, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.06em', color: accent || 'var(--text-secondary)' }}>
22
+ {title}
23
+ </span>
24
+ </div>
25
+ <div style={{ padding: '10px 14px' }}>{children}</div>
26
+ </div>
27
+ );
28
+ }
29
+
30
+ function AlertBox({ text, severity }) {
31
+ const c = severity === 'critical' ? 'var(--red-critical)' : severity === 'warning' ? 'var(--amber-warning)' : 'var(--blue-accent)';
32
+ return (
33
+ <div style={{
34
+ display: 'flex', gap: 8, padding: '7px 10px', borderRadius: 7, marginBottom: 6,
35
+ background: c + '12', border: `1px solid ${c}30`,
36
+ }}>
37
+ <AlertTriangle size={13} style={{ color: c, flexShrink: 0, marginTop: 2 }} />
38
+ <span style={{ fontSize: 12, color: 'var(--text-primary)', lineHeight: 1.5 }}>{text}</span>
39
+ </div>
40
+ );
41
+ }
42
+
43
+ function VerdictBadge({ verdict }) {
44
+ const cls = `badge verdict-${(verdict || 'not_evaluated').toLowerCase()}`;
45
+ const labels = { SAFE: 'βœ“ SAFE', CAUTION: '⚠ CAUTION', CONTRAINDICATED: 'βœ• CONTRAINDICATED', NOT_EVALUATED: '? NOT EVALUATED' };
46
+ return <span className={cls}>{labels[verdict] || verdict}</span>;
47
+ }
48
+
49
+ function TreatmentChecker({ patientId }) {
50
+ const [input, setInput] = useState('');
51
+ const [loading, setLoading] = useState(false);
52
+ const [result, setResult] = useState(null);
53
+
54
+ const check = async () => {
55
+ if (!input.trim() || !patientId) return;
56
+ setLoading(true); setResult(null);
57
+ try {
58
+ const res = await fetch(`${API_BASE}/check-treatment/${patientId}`, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify({ treatment: input.trim() }),
62
+ });
63
+ const data = await res.json();
64
+ setResult(data.result);
65
+ } catch {
66
+ setResult({ treatment_verdict: 'NOT_EVALUATED', verdict_reason: 'Service unavailable.' });
67
+ } finally {
68
+ setLoading(false);
69
+ }
70
+ };
71
+
72
+ const accent = result?.treatment_verdict === 'SAFE' ? 'var(--green-safe)'
73
+ : result?.treatment_verdict === 'CONTRAINDICATED' ? 'var(--red-critical)'
74
+ : result?.treatment_verdict === 'CAUTION' ? 'var(--amber-warning)'
75
+ : 'var(--border-default)';
76
+
77
+ return (
78
+ <div style={{
79
+ padding: 14, borderRadius: 10, background: 'var(--bg-surface)',
80
+ border: '1px solid var(--border-default)',
81
+ }}>
82
+ <div style={{ fontSize: 11, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--purple-ai)', marginBottom: 10, display: 'flex', alignItems: 'center', gap: 6 }}>
83
+ <ShieldAlert size={12} /> Treatment Safety Check
84
+ </div>
85
+ <div style={{ display: 'flex', gap: 8 }}>
86
+ <input
87
+ className="input-dark"
88
+ placeholder='e.g. "morphine 4mg IV" or "ibuprofen"'
89
+ value={input}
90
+ onChange={e => setInput(e.target.value)}
91
+ onKeyDown={e => e.key === 'Enter' && check()}
92
+ />
93
+ <button className="btn-primary" onClick={check} disabled={loading || !input.trim() || !patientId} style={{ flexShrink: 0, padding: '9px 14px' }}>
94
+ {loading ? <div className="spinner"/> : <Send size={13}/>}
95
+ </button>
96
+ </div>
97
+
98
+ {result && (
99
+ <div className="fade-up" style={{ marginTop: 12, padding: 12, borderRadius: 8, border: `1px solid ${accent}40`, background: accent + '08' }}>
100
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>
101
+ <VerdictBadge verdict={result.treatment_verdict} />
102
+ </div>
103
+ <p style={{ fontSize: 12, color: 'var(--text-primary)', lineHeight: 1.6, marginBottom: 8 }}>{result.verdict_reason}</p>
104
+ {(result.allergy_risks || []).map((r, i) => (
105
+ <p key={i} style={{ fontSize: 11, color: 'var(--red-critical)', marginBottom: 3 }}>⚠ Allergy cross-reactivity: {r.substance} β€” {r.risk}</p>
106
+ ))}
107
+ {(result.drug_interactions || []).map((d, i) => (
108
+ <p key={i} style={{ fontSize: 11, color: 'var(--amber-warning)', marginBottom: 3 }}>πŸ’Š Interaction: {d.drug_a} + {d.drug_b} β†’ {d.interaction}</p>
109
+ ))}
110
+ {(result.safe_alternatives || []).length > 0 && (
111
+ <p style={{ fontSize: 11, color: 'var(--green-safe)', marginTop: 6 }}>
112
+ βœ“ Consider: {result.safe_alternatives.join(', ')}
113
+ </p>
114
+ )}
115
+ </div>
116
+ )}
117
+ </div>
118
+ );
119
+ }
120
+
121
+ export function BriefPanel({ data, patient }) {
122
+ if (!data) {
123
+ return (
124
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
125
+ <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--border-subtle)' }}>
126
+ <span style={{ fontWeight: 700, fontSize: 13, color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>
127
+ Emergency Brief
128
+ </span>
129
+ </div>
130
+ <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 30, gap: 12, color: 'var(--text-tertiary)', textAlign: 'center' }}>
131
+ <AlertCircle size={36} style={{ opacity: 0.4 }} />
132
+ <p style={{ fontSize: 13 }}>Run emergency snapshot to generate brief</p>
133
+ {patient && <TreatmentChecker patientId={patient.id} />}
134
+ </div>
135
+ </div>
136
+ );
137
+ }
138
+
139
+ const { agents, deterministic, meta } = data;
140
+ const triage = agents?.triage || {};
141
+ const contra = agents?.contraindication || {};
142
+ const labs = agents?.labs || {};
143
+ const diff = agents?.differentials || {};
144
+ const action = agents?.action_protocol || {};
145
+ const snap = deterministic?.snapshot || '';
146
+ const risks = deterministic?.risks || [];
147
+ const vitals = deterministic?.vitals || {};
148
+
149
+ const severityColor = triage.severity <= 2 ? 'var(--red-critical)' : triage.severity === 3 ? 'var(--amber-warning)' : 'var(--green-safe)';
150
+
151
+ return (
152
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
153
+ {/* Header */}
154
+ <div style={{ padding: '10px 16px', borderBottom: '1px solid var(--border-subtle)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
155
+ <span style={{ fontWeight: 700, fontSize: 13, color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>
156
+ Emergency Brief
157
+ </span>
158
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 10, color: 'var(--text-tertiary)' }}>
159
+ <Clock size={10} /> {meta?.processing_ms}ms
160
+ {meta?.gemini_enabled && <span style={{ color: 'var(--purple-ai)', fontWeight: 700 }}>Β· AI</span>}
161
+ </div>
162
+ </div>
163
+
164
+ <div style={{ flex: 1, overflowY: 'auto', padding: '12px 14px' }}>
165
+ {/* Triage Banner */}
166
+ {triage.severity_label && (
167
+ <div className="fade-up" style={{
168
+ padding: '10px 14px', borderRadius: 10, marginBottom: 14,
169
+ background: severityColor + '12', border: `2px solid ${severityColor}40`,
170
+ display: 'flex', alignItems: 'center', gap: 10,
171
+ }}>
172
+ <div style={{ fontSize: 22, fontWeight: 900, color: severityColor, fontFamily: 'var(--font-mono)' }}>
173
+ ESI {triage.severity}
174
+ </div>
175
+ <div>
176
+ <div style={{ fontSize: 12, fontWeight: 700, color: severityColor }}>{triage.severity_label}</div>
177
+ <div style={{ fontSize: 11, color: 'var(--text-secondary)' }}>{triage.chief_complaint}</div>
178
+ </div>
179
+ </div>
180
+ )}
181
+
182
+ {/* Critical Alerts */}
183
+ {(triage.time_critical_flags?.length > 0 || triage.do_not_delay?.length > 0) && (
184
+ <Section title="Time-Critical Findings" icon={<AlertTriangle size={12}/>} accent="var(--red-critical)">
185
+ {(triage.time_critical_flags || []).map((f, i) => <AlertBox key={i} text={f} severity="critical" />)}
186
+ {(triage.do_not_delay || []).map((f, i) => <AlertBox key={i} text={`⚑ NOW: ${f}`} severity="warning" />)}
187
+ </Section>
188
+ )}
189
+
190
+ {/* Contraindications */}
191
+ {(contra.allergy_risks?.length > 0 || contra.drug_interactions?.length > 0 || contra.condition_contraindications?.length > 0) && (
192
+ <Section title="Contraindications & Safety" icon={<ShieldAlert size={12}/>} accent="var(--red-critical)">
193
+ {(contra.allergy_risks || []).map((r, i) => (
194
+ <AlertBox key={i} text={`Allergy Risk [${r.severity}]: ${r.substance} β€” ${r.risk}`} severity="critical" />
195
+ ))}
196
+ {(contra.drug_interactions || []).map((d, i) => (
197
+ <AlertBox key={i} text={`Drug Interaction [${d.severity}]: ${d.drug_a} + ${d.drug_b} β†’ ${d.interaction}`} severity="warning" />
198
+ ))}
199
+ {(contra.condition_contraindications || []).map((c, i) => (
200
+ <AlertBox key={i} text={c} severity="warning" />
201
+ ))}
202
+ </Section>
203
+ )}
204
+
205
+ {/* Labs */}
206
+ {(labs.critical_labs?.length > 0 || labs.abnormal_labs?.length > 0) && (
207
+ <Section title="Lab Findings" icon={<FlaskConical size={12}/>} accent="var(--amber-warning)">
208
+ {(labs.critical_labs || []).map((l, i) => (
209
+ <div key={i} style={{ marginBottom: 8, padding: '6px 10px', borderRadius: 7, background: 'rgba(255,45,85,0.08)', border: '1px solid rgba(255,45,85,0.2)' }}>
210
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--red-critical)', fontFamily: 'var(--font-mono)' }}>{l.name}: {l.value}</div>
211
+ <div style={{ fontSize: 11, color: 'var(--text-secondary)', marginTop: 2 }}>{l.significance}</div>
212
+ {l.immediate_action && <div style={{ fontSize: 11, color: 'var(--amber-warning)', marginTop: 2 }}>β†’ {l.immediate_action}</div>}
213
+ </div>
214
+ ))}
215
+ {(labs.abnormal_labs || []).map((l, i) => (
216
+ <div key={i} style={{ marginBottom: 6, padding: '5px 10px', borderRadius: 7, background: 'rgba(255,159,10,0.07)', border: '1px solid rgba(255,159,10,0.2)' }}>
217
+ <span style={{ fontFamily: 'var(--font-mono)', fontSize: 12, fontWeight: 600, color: 'var(--amber-warning)' }}>{l.name}: {l.value}</span>
218
+ <span style={{ fontSize: 11, color: 'var(--text-secondary)', marginLeft: 8 }}>{l.significance}</span>
219
+ </div>
220
+ ))}
221
+ </Section>
222
+ )}
223
+
224
+ {/* Vitals (deterministic) */}
225
+ {Object.keys(vitals).length > 0 && (
226
+ <Section title="Extracted Vitals" icon={<AlertCircle size={12}/>} accent="var(--blue-accent)">
227
+ <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 6 }}>
228
+ {Object.entries(vitals).map(([k, v]) => (
229
+ <div key={k} style={{ padding: '5px 8px', borderRadius: 6, background: 'var(--bg-card)', border: '1px solid var(--border-subtle)' }}>
230
+ <div style={{ fontSize: 10, color: 'var(--text-tertiary)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>{k}</div>
231
+ <div style={{ fontSize: 14, fontWeight: 700, fontFamily: 'var(--font-mono)', color: 'var(--text-primary)' }}>{String(v)}</div>
232
+ </div>
233
+ ))}
234
+ </div>
235
+ </Section>
236
+ )}
237
+
238
+ {/* Differentials */}
239
+ {diff.differentials?.length > 0 && (
240
+ <Section title="Differential Diagnosis" icon={<Stethoscope size={12}/>} accent="var(--blue-accent)">
241
+ {(diff.differentials || []).map((d, i) => (
242
+ <div key={i} style={{ marginBottom: 8, display: 'flex', gap: 8, alignItems: 'flex-start' }}>
243
+ <span style={{ fontSize: 16, fontWeight: 900, color: 'var(--text-tertiary)', minWidth: 20 }}>{i + 1}</span>
244
+ <div>
245
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 2 }}>
246
+ <span style={{ fontSize: 12, fontWeight: 700, color: 'var(--text-primary)' }}>{d.diagnosis}</span>
247
+ <span className={`badge ${d.likelihood === 'HIGH' ? 'badge-critical' : d.likelihood === 'MODERATE' ? 'badge-moderate' : 'badge-stable'}`} style={{ fontSize: 9 }}>
248
+ {d.likelihood}
249
+ </span>
250
+ {d.must_rule_out && <span style={{ fontSize: 9, color: 'var(--red-critical)', fontWeight: 700 }}>MUST RULE OUT</span>}
251
+ </div>
252
+ {(d.supporting_evidence || []).map((e, j) => (
253
+ <p key={j} style={{ fontSize: 10, color: 'var(--text-secondary)', marginBottom: 1 }}>Β· {e}</p>
254
+ ))}
255
+ </div>
256
+ </div>
257
+ ))}
258
+ {diff.key_diagnostic_question && (
259
+ <div style={{ marginTop: 8, padding: '6px 10px', borderRadius: 7, background: 'rgba(10,132,255,0.08)', border: '1px solid rgba(10,132,255,0.2)', fontSize: 11, color: 'var(--blue-accent)' }}>
260
+ Key question: {diff.key_diagnostic_question}
261
+ </div>
262
+ )}
263
+ </Section>
264
+ )}
265
+
266
+ {/* Action Protocol */}
267
+ {action.immediate_actions?.length > 0 && (
268
+ <Section title="Action Protocol" icon={<ListChecks size={12}/>} accent="var(--green-safe)">
269
+ {(action.immediate_actions || []).map((a, i) => (
270
+ <div key={i} style={{ display: 'flex', gap: 8, marginBottom: 6, alignItems: 'flex-start' }}>
271
+ <span style={{ width: 20, height: 20, borderRadius: 5, background: 'var(--green-safe)', color: '#000', fontSize: 11, fontWeight: 800, display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>{i + 1}</span>
272
+ <span style={{ fontSize: 12, color: 'var(--text-primary)', lineHeight: 1.5 }}>{a}</span>
273
+ </div>
274
+ ))}
275
+ {(action.drugs_to_avoid || []).length > 0 && (
276
+ <div style={{ marginTop: 8 }}>
277
+ {action.drugs_to_avoid.map((d, i) => (
278
+ <p key={i} style={{ fontSize: 11, color: 'var(--red-critical)', marginBottom: 3 }}>βœ• AVOID: {d.drug} β€” {d.reason}</p>
279
+ ))}
280
+ </div>
281
+ )}
282
+ {action.disposition && (
283
+ <div style={{ marginTop: 10, padding: '6px 12px', borderRadius: 7, background: 'rgba(10,132,255,0.1)', border: '1px solid rgba(10,132,255,0.3)', fontSize: 12, fontWeight: 700, color: 'var(--blue-accent)' }}>
284
+ Disposition: {action.disposition.replace('_', ' ')}
285
+ </div>
286
+ )}
287
+ </Section>
288
+ )}
289
+
290
+ {/* Snapshot text */}
291
+ {snap && (
292
+ <div className="fade-up" style={{ padding: 14, borderRadius: 10, background: 'var(--bg-surface)', border: '1px solid var(--border-default)', marginBottom: 14 }}>
293
+ <div style={{ fontSize: 10, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--text-tertiary)', marginBottom: 6 }}>
294
+ Clinical Summary
295
+ </div>
296
+ <p style={{ fontSize: 12, color: 'var(--text-primary)', lineHeight: 1.7, whiteSpace: 'pre-wrap' }}>{snap}</p>
297
+ </div>
298
+ )}
299
+
300
+ {/* Treatment Checker */}
301
+ <TreatmentChecker patientId={patient?.id} />
302
+ </div>
303
+ </div>
304
+ );
305
+ }
frontend/src/PatientPanel.jsx ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // PatientPanel.jsx β€” Left sidebar
2
+ import { Upload, User, AlertCircle } from 'lucide-react';
3
+
4
+ const RISK_COLOR = { critical: 'var(--red-critical)', moderate: 'var(--amber-warning)', stable: 'var(--green-safe)' };
5
+ const RISK_DOT = { critical: 'badge-critical', moderate: 'badge-moderate', stable: 'badge-stable' };
6
+
7
+ export function PatientCard({ patient, selected, onClick }) {
8
+ const risk = patient.risk_level || 'stable';
9
+ return (
10
+ <div
11
+ onClick={() => onClick(patient)}
12
+ style={{
13
+ padding: '12px 14px', borderRadius: 10, cursor: 'pointer', marginBottom: 6,
14
+ background: selected ? 'rgba(10,132,255,0.12)' : 'var(--bg-surface)',
15
+ border: `1px solid ${selected ? 'rgba(10,132,255,0.4)' : 'var(--border-subtle)'}`,
16
+ transition: 'all 0.15s',
17
+ }}
18
+ >
19
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 4 }}>
20
+ <span style={{ fontWeight: 700, fontSize: 13, color: 'var(--text-primary)' }}>
21
+ {patient.display_name}
22
+ </span>
23
+ <span className={`badge ${RISK_DOT[risk] || 'badge-unknown'}`} style={{ fontSize: 10 }}>
24
+ {risk}
25
+ </span>
26
+ </div>
27
+ <div style={{ fontSize: 11, color: 'var(--text-secondary)', display: 'flex', gap: 10 }}>
28
+ <span>{patient.age}y {patient.gender}</span>
29
+ <span>Β·</span>
30
+ <span style={{ color: RISK_COLOR[risk] }}>{(patient.conditions || []).join(', ') || 'No conditions'}</span>
31
+ </div>
32
+ <div style={{ fontSize: 10, color: 'var(--text-tertiary)', marginTop: 3 }}>
33
+ {patient.allergy_count} allergies Β· {patient.med_count} meds
34
+ </div>
35
+ </div>
36
+ );
37
+ }
38
+
39
+ export function PatientPanel({ patients, selected, onSelect, onUpload, loading }) {
40
+ return (
41
+ <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
42
+ <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--border-subtle)' }}>
43
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
44
+ <span style={{ fontWeight: 700, fontSize: 13, letterSpacing: '0.05em', color: 'var(--text-secondary)', textTransform: 'uppercase' }}>
45
+ Patients
46
+ </span>
47
+ <span style={{ fontSize: 11, color: 'var(--text-tertiary)' }}>{patients.length} loaded</span>
48
+ </div>
49
+ <label style={{ cursor: 'pointer', display: 'block' }}>
50
+ <input type="file" accept=".json" style={{ display: 'none' }} onChange={onUpload} />
51
+ <div className="btn-ghost" style={{ width: '100%', justifyContent: 'center', fontSize: 11 }}>
52
+ <Upload size={12} /> Upload Patient JSON
53
+ </div>
54
+ </label>
55
+ </div>
56
+ <div style={{ flex: 1, overflowY: 'auto', padding: '10px 12px' }}>
57
+ {loading && <div style={{ textAlign: 'center', padding: 20, color: 'var(--text-tertiary)', fontSize: 12 }}>Loading...</div>}
58
+ {!loading && patients.length === 0 && (
59
+ <div style={{ textAlign: 'center', padding: 20, color: 'var(--text-tertiary)', fontSize: 12 }}>
60
+ <AlertCircle size={24} style={{ margin: '0 auto 8px', display: 'block' }} />
61
+ No patients loaded
62
+ </div>
63
+ )}
64
+ {patients.map(p => (
65
+ <PatientCard key={p.id} patient={p} selected={selected?.id === p.id} onClick={onSelect} />
66
+ ))}
67
+ </div>
68
+ </div>
69
+ );
70
+ }
frontend/src/Welcome.jsx ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Activity, ShieldCheck, Brain } from 'lucide-react';
2
+
3
+ export default function Welcome({ onStart }) {
4
+ return (
5
+ <div className="welcome-screen">
6
+ {/* Animated logo */}
7
+ <div style={{ marginBottom: 32, position: 'relative' }}>
8
+ <div style={{
9
+ width: 80, height: 80, borderRadius: '50%',
10
+ background: 'rgba(255,45,85,0.12)',
11
+ border: '2px solid rgba(255,45,85,0.4)',
12
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
13
+ animation: 'heartbeat 1.4s ease-in-out infinite',
14
+ margin: '0 auto 20px',
15
+ }}>
16
+ <Activity size={36} color="var(--red-critical)" />
17
+ </div>
18
+
19
+ {/* EKG line SVG */}
20
+ <svg width="240" height="40" viewBox="0 0 240 40" style={{ margin: '0 auto', display: 'block' }}>
21
+ <polyline
22
+ points="0,20 30,20 45,5 52,35 60,5 70,20 100,20 115,20 120,2 126,38 132,2 138,20 180,20 240,20"
23
+ fill="none" stroke="var(--red-critical)" strokeWidth="1.5"
24
+ strokeDasharray="400" strokeDashoffset="400"
25
+ style={{ animation: 'ekg 2s ease forwards 0.3s' }}
26
+ />
27
+ </svg>
28
+ </div>
29
+
30
+ {/* Title */}
31
+ <h1 style={{
32
+ fontSize: 42, fontWeight: 900, letterSpacing: '-0.03em',
33
+ background: 'linear-gradient(135deg, #f5f5f7 30%, #8e8e93)',
34
+ WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent',
35
+ marginBottom: 8,
36
+ }}>
37
+ CodeBlue Context
38
+ </h1>
39
+ <p style={{ fontSize: 16, color: 'var(--text-secondary)', marginBottom: 32, maxWidth: 420, lineHeight: 1.6 }}>
40
+ Emergency clinical intelligence. Five AI agents. One life-saving brief.
41
+ </p>
42
+
43
+ {/* Feature pills */}
44
+ <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap', justifyContent: 'center', marginBottom: 40 }}>
45
+ {[
46
+ { icon: <Activity size={13}/>, label: '5-Agent Orchestration' },
47
+ { icon: <ShieldCheck size={13}/>, label: 'Contraindication Guardian' },
48
+ { icon: <Brain size={13}/>, label: 'Explainable AI Reasoning' },
49
+ ].map(f => (
50
+ <div key={f.label} style={{
51
+ display: 'flex', alignItems: 'center', gap: 6,
52
+ padding: '6px 14px', borderRadius: 99,
53
+ background: 'rgba(10,132,255,0.08)',
54
+ border: '1px solid rgba(10,132,255,0.2)',
55
+ color: 'var(--blue-accent)', fontSize: 12, fontWeight: 600,
56
+ }}>
57
+ {f.icon}{f.label}
58
+ </div>
59
+ ))}
60
+ </div>
61
+
62
+ <button className="btn-danger" style={{ maxWidth: 260 }} onClick={onStart}>
63
+ <Activity size={16} /> Enter Emergency System
64
+ </button>
65
+
66
+ <p style={{ marginTop: 20, fontSize: 11, color: 'var(--text-tertiary)' }}>
67
+ For clinical decision support only β€” not a substitute for physician judgment
68
+ </p>
69
+ </div>
70
+ );
71
+ }
frontend/src/index.css ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap');
2
+
3
+ :root {
4
+ --bg-base: #060d1a;
5
+ --bg-surface: #0d1b2e;
6
+ --bg-elevated: #112236;
7
+ --bg-card: #0f1e33;
8
+
9
+ --border-subtle: rgba(255,255,255,0.06);
10
+ --border-default: rgba(255,255,255,0.10);
11
+ --border-accent: rgba(10,132,255,0.4);
12
+
13
+ --red-critical: #ff2d55;
14
+ --red-glow: rgba(255,45,85,0.25);
15
+ --amber-warning: #ff9f0a;
16
+ --amber-glow: rgba(255,159,10,0.2);
17
+ --green-safe: #30d158;
18
+ --green-glow: rgba(48,209,88,0.2);
19
+ --blue-accent: #0a84ff;
20
+ --blue-glow: rgba(10,132,255,0.2);
21
+ --purple-ai: #bf5af2;
22
+
23
+ --text-primary: #f5f5f7;
24
+ --text-secondary: #8e8e93;
25
+ --text-tertiary: #48484a;
26
+
27
+ --font-sans: 'Inter', system-ui, sans-serif;
28
+ --font-mono: 'JetBrains Mono', monospace;
29
+ }
30
+
31
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
32
+
33
+ html, body, #root {
34
+ height: 100%;
35
+ background: var(--bg-base);
36
+ color: var(--text-primary);
37
+ font-family: var(--font-sans);
38
+ font-size: 14px;
39
+ -webkit-font-smoothing: antialiased;
40
+ }
41
+
42
+ /* ── Scrollbar ── */
43
+ ::-webkit-scrollbar { width: 4px; height: 4px; }
44
+ ::-webkit-scrollbar-track { background: transparent; }
45
+ ::-webkit-scrollbar-thumb { background: var(--border-default); border-radius: 99px; }
46
+
47
+ /* ── EKG header line ── */
48
+ @keyframes ekg {
49
+ 0% { stroke-dashoffset: 1000; }
50
+ 100% { stroke-dashoffset: 0; }
51
+ }
52
+ @keyframes pulse-red {
53
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 var(--red-glow); }
54
+ 50% { opacity: 0.8; box-shadow: 0 0 0 8px transparent; }
55
+ }
56
+ @keyframes pulse-amber {
57
+ 0%, 100% { box-shadow: 0 0 0 0 var(--amber-glow); }
58
+ 50% { box-shadow: 0 0 0 6px transparent; }
59
+ }
60
+ @keyframes fade-up {
61
+ from { opacity: 0; transform: translateY(12px); }
62
+ to { opacity: 1; transform: translateY(0); }
63
+ }
64
+ @keyframes fade-in {
65
+ from { opacity: 0; }
66
+ to { opacity: 1; }
67
+ }
68
+ @keyframes spin {
69
+ to { transform: rotate(360deg); }
70
+ }
71
+ @keyframes glow-blue {
72
+ 0%, 100% { box-shadow: 0 0 12px var(--blue-glow); }
73
+ 50% { box-shadow: 0 0 24px var(--blue-glow), 0 0 4px var(--blue-accent); }
74
+ }
75
+ @keyframes slide-in-right {
76
+ from { opacity: 0; transform: translateX(20px); }
77
+ to { opacity: 1; transform: translateX(0); }
78
+ }
79
+ @keyframes heartbeat {
80
+ 0%, 100% { transform: scale(1); }
81
+ 14% { transform: scale(1.15); }
82
+ 28% { transform: scale(1); }
83
+ 42% { transform: scale(1.1); }
84
+ 70% { transform: scale(1); }
85
+ }
86
+
87
+ /* ── Cards ── */
88
+ .card {
89
+ background: var(--bg-card);
90
+ border: 1px solid var(--border-subtle);
91
+ border-radius: 12px;
92
+ }
93
+ .card-elevated {
94
+ background: var(--bg-elevated);
95
+ border: 1px solid var(--border-default);
96
+ border-radius: 12px;
97
+ }
98
+ .glass {
99
+ background: rgba(13,27,46,0.7);
100
+ backdrop-filter: blur(12px);
101
+ -webkit-backdrop-filter: blur(12px);
102
+ border: 1px solid var(--border-default);
103
+ border-radius: 12px;
104
+ }
105
+
106
+ /* ── Risk badges ── */
107
+ .badge { display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; border-radius: 99px; font-size: 11px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
108
+ .badge-critical { background: rgba(255,45,85,0.15); color: var(--red-critical); border: 1px solid rgba(255,45,85,0.3); animation: pulse-red 2s infinite; }
109
+ .badge-moderate { background: rgba(255,159,10,0.12); color: var(--amber-warning); border: 1px solid rgba(255,159,10,0.3); }
110
+ .badge-stable { background: rgba(48,209,88,0.1); color: var(--green-safe); border: 1px solid rgba(48,209,88,0.25); }
111
+ .badge-unknown { background: rgba(142,142,147,0.1); color: var(--text-secondary); border: 1px solid rgba(142,142,147,0.2); }
112
+
113
+ /* ── Verdict badges ── */
114
+ .verdict-safe { background: rgba(48,209,88,0.15); color: var(--green-safe); border: 1px solid rgba(48,209,88,0.3); }
115
+ .verdict-caution { background: rgba(255,159,10,0.15); color: var(--amber-warning); border: 1px solid rgba(255,159,10,0.3); animation: pulse-amber 2s infinite; }
116
+ .verdict-contraindicated{ background: rgba(255,45,85,0.15); color: var(--red-critical); border: 1px solid rgba(255,45,85,0.4); animation: pulse-red 1.5s infinite; }
117
+ .verdict-not_evaluated { background: rgba(142,142,147,0.1); color: var(--text-secondary); border: 1px solid rgba(142,142,147,0.2); }
118
+
119
+ /* ── Agent status ── */
120
+ .agent-idle { border-color: var(--border-subtle); }
121
+ .agent-working { border-color: var(--blue-accent); animation: glow-blue 1.2s infinite; }
122
+ .agent-complete { border-color: var(--green-safe); box-shadow: 0 0 10px var(--green-glow); }
123
+ .agent-error { border-color: var(--red-critical); }
124
+
125
+ /* ── Buttons ── */
126
+ .btn-primary {
127
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px;
128
+ padding: 10px 20px; border-radius: 8px; border: none; cursor: pointer;
129
+ font-family: var(--font-sans); font-weight: 600; font-size: 13px;
130
+ background: var(--blue-accent); color: #fff;
131
+ transition: opacity 0.15s, transform 0.1s;
132
+ }
133
+ .btn-primary:hover:not(:disabled) { opacity: 0.85; transform: translateY(-1px); }
134
+ .btn-primary:active { transform: translateY(0); }
135
+ .btn-primary:disabled { opacity: 0.35; cursor: not-allowed; }
136
+
137
+ .btn-danger {
138
+ background: linear-gradient(135deg, #c0392b, var(--red-critical));
139
+ color: #fff;
140
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px;
141
+ padding: 12px 24px; border-radius: 8px; border: none; cursor: pointer;
142
+ font-family: var(--font-sans); font-weight: 700; font-size: 14px; letter-spacing: 0.02em;
143
+ box-shadow: 0 4px 20px rgba(255,45,85,0.3);
144
+ transition: box-shadow 0.2s, transform 0.1s;
145
+ width: 100%;
146
+ }
147
+ .btn-danger:hover:not(:disabled) { box-shadow: 0 6px 30px rgba(255,45,85,0.5); transform: translateY(-1px); }
148
+ .btn-danger:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }
149
+
150
+ .btn-ghost {
151
+ display: inline-flex; align-items: center; gap: 6px;
152
+ padding: 8px 14px; border-radius: 7px; border: 1px solid var(--border-default);
153
+ background: transparent; color: var(--text-secondary); cursor: pointer;
154
+ font-family: var(--font-sans); font-size: 12px; font-weight: 500;
155
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
156
+ }
157
+ .btn-ghost:hover { border-color: var(--blue-accent); color: var(--blue-accent); background: var(--blue-glow); }
158
+
159
+ /* ── Spinner ── */
160
+ .spinner { width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.2); border-top-color: #fff; border-radius: 50%; animation: spin 0.7s linear infinite; }
161
+
162
+ /* ── Animations ── */
163
+ .fade-up { animation: fade-up 0.35s ease both; }
164
+ .fade-in { animation: fade-in 0.3s ease both; }
165
+ .slide-in { animation: slide-in-right 0.35s ease both; }
166
+
167
+ /* ── Mono data ── */
168
+ .mono { font-family: var(--font-mono); }
169
+
170
+ /* ── Input ── */
171
+ .input-dark {
172
+ background: var(--bg-surface); border: 1px solid var(--border-default);
173
+ border-radius: 8px; color: var(--text-primary); padding: 9px 12px;
174
+ font-family: var(--font-sans); font-size: 13px; width: 100%; outline: none;
175
+ transition: border-color 0.15s;
176
+ }
177
+ .input-dark:focus { border-color: var(--blue-accent); box-shadow: 0 0 0 3px rgba(10,132,255,0.15); }
178
+ .input-dark::placeholder { color: var(--text-tertiary); }
179
+
180
+ /* ── Divider ── */
181
+ .divider { height: 1px; background: var(--border-subtle); }
182
+
183
+ /* ── Welcome screen ── */
184
+ .welcome-screen {
185
+ min-height: 100vh; display: flex; flex-direction: column;
186
+ align-items: center; justify-content: center;
187
+ background: radial-gradient(ellipse at 50% 0%, rgba(10,132,255,0.08) 0%, transparent 70%),
188
+ var(--bg-base);
189
+ text-align: center; padding: 40px 20px;
190
+ }
frontend/src/main.jsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import App from "./App";
4
+ import "./index.css";
5
+
6
+ ReactDOM.createRoot(document.getElementById("root")).render(
7
+ <React.StrictMode>
8
+ <App />
9
+ </React.StrictMode>
10
+ );
frontend/tailwind.config.cjs ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const defaultTheme = require('tailwindcss/defaultTheme');
2
+
3
+ /** @type {import('tailwindcss').Config} */
4
+ module.exports = {
5
+ content: ["./index.html", "./src/**/*.{js,jsx,ts,tsx}"],
6
+ theme: {
7
+ extend: {
8
+ fontFamily: {
9
+ sans: ['Inter', ...defaultTheme.fontFamily.sans],
10
+ },
11
+ colors: {
12
+ danger: {
13
+ 500: "#ef4444",
14
+ 700: "#b91c1c"
15
+ },
16
+ clinical: {
17
+ 900: "#0b1220",
18
+ 800: "#111827",
19
+ 700: "#1f2937"
20
+ }
21
+ }
22
+ }
23
+ },
24
+ plugins: [],
25
+ };
frontend/vite.config.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ port: 5173,
8
+ proxy: {
9
+ "/api": {
10
+ target: "http://127.0.0.1:8000",
11
+ changeOrigin: true,
12
+ rewrite: (path) => path.replace(/^\/api/, ""),
13
+ },
14
+ },
15
+ },
16
+ });