devranx commited on
Commit
abc2a72
·
1 Parent(s): 68b0694

Final Single Page

Browse files
backend/model_handler.py CHANGED
@@ -33,7 +33,7 @@ class ModelHandler:
33
 
34
  self.model_int = AutoModel.from_pretrained(
35
  internvl_model_path,
36
- dtype=torch.bfloat16,
37
  low_cpu_mem_usage=True,
38
  trust_remote_code=True
39
  ).eval()
 
33
 
34
  self.model_int = AutoModel.from_pretrained(
35
  internvl_model_path,
36
+ torch_dtype=torch.bfloat16,
37
  low_cpu_mem_usage=True,
38
  trust_remote_code=True
39
  ).eval()
frontend/App.tsx CHANGED
@@ -78,7 +78,7 @@ const App: React.FC = () => {
78
  <div className="relative p-[2px] rounded-full bg-gradient-to-r from-cyan-400 via-purple-500 to-pink-500 animate-pulse shadow-[0_0_15px_rgba(34,211,238,0.5)]">
79
  {/* Inner Glass Content */}
80
  <div className="bg-slate-950/90 backdrop-blur-sm rounded-full px-5 py-2.5 flex items-center gap-2">
81
- <span className="text-xs font-bold text-transparent bg-clip-text bg-gradient-to-r from-cyan-200 to-white whitespace-nowrap">
82
  ✨ Don't miss the magic! 🎧
83
  </span>
84
  </div>
 
78
  <div className="relative p-[2px] rounded-full bg-gradient-to-r from-cyan-400 via-purple-500 to-pink-500 animate-pulse shadow-[0_0_15px_rgba(34,211,238,0.5)]">
79
  {/* Inner Glass Content */}
80
  <div className="bg-slate-950/90 backdrop-blur-sm rounded-full px-5 py-2.5 flex items-center gap-2">
81
+ <span className="text-xs font-bold !text-white whitespace-nowrap" style={{ color: '#ffffff', mixBlendMode: 'normal' }}>
82
  ✨ Don't miss the magic! 🎧
83
  </span>
84
  </div>
frontend/components/Hero.tsx CHANGED
@@ -19,7 +19,7 @@ const Hero: React.FC = () => {
19
  v2.0 Prototype
20
  </div>
21
 
22
- <h1 className="text-8xl font-black tracking-tighter text-transparent bg-clip-text bg-gradient-to-r from-white via-cyan-200 to-blue-400 mb-2 drop-shadow-2xl">
23
  PRISM
24
  </h1>
25
  <h2 className="text-3xl font-light text-slate-300 tracking-wide">
 
19
  v2.0 Prototype
20
  </div>
21
 
22
+ <h1 className="text-8xl font-black tracking-tighter !text-white mb-2 drop-shadow-2xl" style={{ color: '#ffffff', mixBlendMode: 'normal' }}>
23
  PRISM
24
  </h1>
25
  <h2 className="text-3xl font-light text-slate-300 tracking-wide">
frontend/components/SingleAnalysis.tsx CHANGED
@@ -11,6 +11,7 @@ interface SingleAnalysisProps {
11
  const SingleAnalysis: React.FC = () => {
12
  const navigate = useNavigate();
13
  const [image, setImage] = useState<File | null>(null);
 
14
  const [preview, setPreview] = useState<string | null>(null);
15
  const [loading, setLoading] = useState(false);
16
  const [report, setReport] = useState<SingleAnalysisReport | null>(null);
@@ -35,6 +36,7 @@ const SingleAnalysis: React.FC = () => {
35
  if (e.target.files && e.target.files[0]) {
36
  const file = e.target.files[0];
37
  setImage(file);
 
38
  setPreview(URL.createObjectURL(file));
39
  setReport(null);
40
  }
@@ -53,16 +55,19 @@ const SingleAnalysis: React.FC = () => {
53
  }
54
  };
55
 
56
- const handleUploadAndAnalyze = async () => {
57
- if (!image) return;
58
- setLoading(true);
59
- try {
60
- const filename = await uploadSingle(image);
61
- await runClassification(filename);
62
- } catch (err) {
63
- console.error(err);
64
- alert("Upload failed.");
65
- setLoading(false);
 
 
 
66
  }
67
  };
68
 
@@ -75,18 +80,19 @@ const SingleAnalysis: React.FC = () => {
75
  // Set preview
76
  setPreview(`/static/samples/${filename}`);
77
  setImage(null); // Clear file input
78
-
79
- // Run classification on the sample (now in uploads folder)
80
- await runClassification(filename);
81
  } catch (err) {
82
  console.error("Failed to use sample", err);
83
  alert("Failed to load sample.");
 
84
  setLoading(false);
85
  }
86
  };
87
 
88
  const reset = () => {
89
  setImage(null);
 
90
  setPreview(null);
91
  setReport(null);
92
  };
@@ -120,6 +126,7 @@ const SingleAnalysis: React.FC = () => {
120
  onClick={() => {
121
  setPreview(null);
122
  setImage(null);
 
123
  setReport(null);
124
  }}
125
  className="absolute top-4 right-4 p-2 bg-black/50 hover:bg-black/70 rounded-full text-white transition-colors"
@@ -176,17 +183,35 @@ const SingleAnalysis: React.FC = () => {
176
  </div>
177
 
178
  {/* Right: Report Area */}
179
- <div className="flex flex-col">
180
- {!report && (
181
- <div className="flex-1 flex flex-col items-center justify-center glass-panel rounded-3xl p-12 text-center">
182
- <div className="w-16 h-16 bg-slate-800 rounded-2xl flex items-center justify-center mb-4 text-slate-500">
183
- <ScanIcon />
 
 
 
 
184
  </div>
185
- <p className="text-slate-400 text-lg">Upload an image or select a sample to generate a compliance report.</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
- {image && !loading && (
188
  <button
189
- onClick={handleUploadAndAnalyze}
190
  className="mt-8 bg-cyan-500 hover:bg-cyan-400 text-black font-bold py-4 px-12 rounded-xl transition-all hover:shadow-[0_0_30px_rgba(34,211,238,0.4)]"
191
  >
192
  Run Classification
 
11
  const SingleAnalysis: React.FC = () => {
12
  const navigate = useNavigate();
13
  const [image, setImage] = useState<File | null>(null);
14
+ const [selectedSample, setSelectedSample] = useState<string | null>(null);
15
  const [preview, setPreview] = useState<string | null>(null);
16
  const [loading, setLoading] = useState(false);
17
  const [report, setReport] = useState<SingleAnalysisReport | null>(null);
 
36
  if (e.target.files && e.target.files[0]) {
37
  const file = e.target.files[0];
38
  setImage(file);
39
+ setSelectedSample(null);
40
  setPreview(URL.createObjectURL(file));
41
  setReport(null);
42
  }
 
55
  }
56
  };
57
 
58
+ const handleRunAnalysis = async () => {
59
+ if (image) {
60
+ setLoading(true);
61
+ try {
62
+ const filename = await uploadSingle(image);
63
+ await runClassification(filename);
64
+ } catch (err) {
65
+ console.error(err);
66
+ alert("Upload failed.");
67
+ setLoading(false);
68
+ }
69
+ } else if (selectedSample) {
70
+ await runClassification(selectedSample);
71
  }
72
  };
73
 
 
80
  // Set preview
81
  setPreview(`/static/samples/${filename}`);
82
  setImage(null); // Clear file input
83
+ setSelectedSample(filename);
84
+ setReport(null);
 
85
  } catch (err) {
86
  console.error("Failed to use sample", err);
87
  alert("Failed to load sample.");
88
+ } finally {
89
  setLoading(false);
90
  }
91
  };
92
 
93
  const reset = () => {
94
  setImage(null);
95
+ setSelectedSample(null);
96
  setPreview(null);
97
  setReport(null);
98
  };
 
126
  onClick={() => {
127
  setPreview(null);
128
  setImage(null);
129
+ setSelectedSample(null);
130
  setReport(null);
131
  }}
132
  className="absolute top-4 right-4 p-2 bg-black/50 hover:bg-black/70 rounded-full text-white transition-colors"
 
183
  </div>
184
 
185
  {/* Right: Report Area */}
186
+ <div className="flex-1 flex flex-col">
187
+ {loading && (
188
+ <div className="flex-1 flex flex-col items-center justify-center glass-panel rounded-3xl p-12 text-center animate-pulse">
189
+ <div className="relative w-24 h-24 mb-8">
190
+ <div className="absolute inset-0 border-4 border-cyan-500/30 rounded-full"></div>
191
+ <div className="absolute inset-0 border-4 border-t-cyan-400 border-r-transparent border-b-transparent border-l-transparent rounded-full animate-spin"></div>
192
+ <div className="absolute inset-0 flex items-center justify-center">
193
+ <ScanIcon className="w-8 h-8 text-cyan-400 animate-pulse" />
194
+ </div>
195
  </div>
196
+ <h3 className="text-2xl font-bold text-white mb-2">Analyzing Image</h3>
197
+ <p className="text-cyan-400/80 animate-pulse">Running AI classification models...</p>
198
+ </div>
199
+ )}
200
+
201
+ {!report && !loading && (
202
+ <div className="flex-1 flex flex-col items-center justify-center glass-panel rounded-3xl p-12 text-center">
203
+ {!image && !selectedSample && (
204
+ <>
205
+ <div className="w-16 h-16 bg-slate-800 rounded-2xl flex items-center justify-center mb-4 text-slate-500">
206
+ <ScanIcon />
207
+ </div>
208
+ <p className="text-slate-400 text-lg">Upload an image or select a sample to generate a compliance report.</p>
209
+ </>
210
+ )}
211
 
212
+ {(image || selectedSample) && (
213
  <button
214
+ onClick={handleRunAnalysis}
215
  className="mt-8 bg-cyan-500 hover:bg-cyan-400 text-black font-bold py-4 px-12 rounded-xl transition-all hover:shadow-[0_0_30px_rgba(34,211,238,0.4)]"
216
  >
217
  Run Classification
frontend/index.html CHANGED
@@ -5,7 +5,8 @@
5
  <meta charset="UTF-8" />
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
- <title>PRISM 2.0 - Lock Screen Classifier</title>
 
9
  <meta name="description" content="Automated compliance for Samsung Glance using advanced AI." />
10
 
11
  <!-- Open Graph / Facebook -->
 
5
  <meta charset="UTF-8" />
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>Prototype v2.0</title>
9
+ <meta name="color-scheme" content="dark">
10
  <meta name="description" content="Automated compliance for Samsung Glance using advanced AI." />
11
 
12
  <!-- Open Graph / Facebook -->
frontend/package-lock.json CHANGED
@@ -16,10 +16,25 @@
16
  "devDependencies": {
17
  "@types/node": "^22.14.0",
18
  "@vitejs/plugin-react": "^5.0.0",
 
 
 
19
  "typescript": "~5.8.2",
20
  "vite": "^6.2.0"
21
  }
22
  },
 
 
 
 
 
 
 
 
 
 
 
 
23
  "node_modules/@babel/code-frame": {
24
  "version": "7.27.1",
25
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -780,6 +795,41 @@
780
  "@jridgewell/sourcemap-codec": "^1.4.14"
781
  }
782
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
783
  "node_modules/@pkgjs/parseargs": {
784
  "version": "0.11.0",
785
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -1187,6 +1237,80 @@
1187
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1188
  }
1189
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1190
  "node_modules/balanced-match": {
1191
  "version": "1.0.2",
1192
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1228,6 +1352,18 @@
1228
  "node": "*"
1229
  }
1230
  },
 
 
 
 
 
 
 
 
 
 
 
 
1231
  "node_modules/brace-expansion": {
1232
  "version": "2.0.2",
1233
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
@@ -1236,6 +1372,18 @@
1236
  "balanced-match": "^1.0.0"
1237
  }
1238
  },
 
 
 
 
 
 
 
 
 
 
 
 
1239
  "node_modules/browserslist": {
1240
  "version": "4.28.0",
1241
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
@@ -1274,6 +1422,15 @@
1274
  "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
1275
  "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
1276
  },
 
 
 
 
 
 
 
 
 
1277
  "node_modules/caniuse-lite": {
1278
  "version": "1.0.30001756",
1279
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
@@ -1294,6 +1451,42 @@
1294
  }
1295
  ]
1296
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1297
  "node_modules/color-convert": {
1298
  "version": "2.0.1",
1299
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1310,6 +1503,15 @@
1310
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1311
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1312
  },
 
 
 
 
 
 
 
 
 
1313
  "node_modules/convert-source-map": {
1314
  "version": "2.0.0",
1315
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -1337,6 +1539,18 @@
1337
  "node": ">= 8"
1338
  }
1339
  },
 
 
 
 
 
 
 
 
 
 
 
 
1340
  "node_modules/data-uri-to-buffer": {
1341
  "version": "4.0.1",
1342
  "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -1361,6 +1575,18 @@
1361
  }
1362
  }
1363
  },
 
 
 
 
 
 
 
 
 
 
 
 
1364
  "node_modules/eastasianwidth": {
1365
  "version": "0.2.0",
1366
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -1440,6 +1666,43 @@
1440
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1441
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1442
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1443
  "node_modules/fdir": {
1444
  "version": "6.5.0",
1445
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -1479,6 +1742,18 @@
1479
  "node": "^12.20 || >= 14.13"
1480
  }
1481
  },
 
 
 
 
 
 
 
 
 
 
 
 
1482
  "node_modules/foreground-child": {
1483
  "version": "3.3.1",
1484
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
@@ -1505,6 +1780,19 @@
1505
  "node": ">=12.20.0"
1506
  }
1507
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
1508
  "node_modules/fsevents": {
1509
  "version": "2.3.3",
1510
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1519,6 +1807,15 @@
1519
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1520
  }
1521
  },
 
 
 
 
 
 
 
 
 
1522
  "node_modules/gaxios": {
1523
  "version": "7.1.3",
1524
  "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
@@ -1574,6 +1871,18 @@
1574
  "url": "https://github.com/sponsors/isaacs"
1575
  }
1576
  },
 
 
 
 
 
 
 
 
 
 
 
 
1577
  "node_modules/google-auth-library": {
1578
  "version": "10.5.0",
1579
  "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz",
@@ -1611,6 +1920,18 @@
1611
  "node": ">=18"
1612
  }
1613
  },
 
 
 
 
 
 
 
 
 
 
 
 
1614
  "node_modules/https-proxy-agent": {
1615
  "version": "7.0.6",
1616
  "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
@@ -1623,6 +1944,42 @@
1623
  "node": ">= 14"
1624
  }
1625
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1626
  "node_modules/is-fullwidth-code-point": {
1627
  "version": "3.0.0",
1628
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -1631,6 +1988,27 @@
1631
  "node": ">=8"
1632
  }
1633
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1634
  "node_modules/isexe": {
1635
  "version": "2.0.0",
1636
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1650,6 +2028,15 @@
1650
  "@pkgjs/parseargs": "^0.11.0"
1651
  }
1652
  },
 
 
 
 
 
 
 
 
 
1653
  "node_modules/js-tokens": {
1654
  "version": "4.0.0",
1655
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -1707,6 +2094,24 @@
1707
  "safe-buffer": "^5.0.1"
1708
  }
1709
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1710
  "node_modules/lru-cache": {
1711
  "version": "5.1.1",
1712
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -1716,6 +2121,40 @@
1716
  "yallist": "^3.0.2"
1717
  }
1718
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1719
  "node_modules/minimatch": {
1720
  "version": "9.0.5",
1721
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -1743,6 +2182,17 @@
1743
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1744
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1745
  },
 
 
 
 
 
 
 
 
 
 
 
1746
  "node_modules/nanoid": {
1747
  "version": "3.3.11",
1748
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -1803,6 +2253,42 @@
1803
  "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
1804
  "dev": true
1805
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1806
  "node_modules/package-json-from-dist": {
1807
  "version": "1.0.1",
1808
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
@@ -1816,6 +2302,12 @@
1816
  "node": ">=8"
1817
  }
1818
  },
 
 
 
 
 
 
1819
  "node_modules/path-scurry": {
1820
  "version": "1.11.1",
1821
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
@@ -1854,6 +2346,24 @@
1854
  "url": "https://github.com/sponsors/jonschlinkert"
1855
  }
1856
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1857
  "node_modules/postcss": {
1858
  "version": "8.5.6",
1859
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -1882,6 +2392,154 @@
1882
  "node": "^10 || ^12 || >=14"
1883
  }
1884
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1885
  "node_modules/react": {
1886
  "version": "19.2.0",
1887
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
@@ -1946,6 +2604,69 @@
1946
  "react-dom": ">=18"
1947
  }
1948
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1949
  "node_modules/rimraf": {
1950
  "version": "5.0.10",
1951
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
@@ -2001,6 +2722,29 @@
2001
  "fsevents": "~2.3.2"
2002
  }
2003
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2004
  "node_modules/safe-buffer": {
2005
  "version": "5.2.1",
2006
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -2166,6 +2910,98 @@
2166
  "node": ">=8"
2167
  }
2168
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2169
  "node_modules/tinyglobby": {
2170
  "version": "0.2.15",
2171
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -2182,6 +3018,24 @@
2182
  "url": "https://github.com/sponsors/SuperchupuDev"
2183
  }
2184
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2185
  "node_modules/typescript": {
2186
  "version": "5.8.3",
2187
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
@@ -2231,6 +3085,12 @@
2231
  "browserslist": ">= 4.21.0"
2232
  }
2233
  },
 
 
 
 
 
 
2234
  "node_modules/vite": {
2235
  "version": "6.4.1",
2236
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
 
16
  "devDependencies": {
17
  "@types/node": "^22.14.0",
18
  "@vitejs/plugin-react": "^5.0.0",
19
+ "autoprefixer": "^10.4.18",
20
+ "postcss": "^8.4.35",
21
+ "tailwindcss": "^3.4.1",
22
  "typescript": "~5.8.2",
23
  "vite": "^6.2.0"
24
  }
25
  },
26
+ "node_modules/@alloc/quick-lru": {
27
+ "version": "5.2.0",
28
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
29
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
30
+ "dev": true,
31
+ "engines": {
32
+ "node": ">=10"
33
+ },
34
+ "funding": {
35
+ "url": "https://github.com/sponsors/sindresorhus"
36
+ }
37
+ },
38
  "node_modules/@babel/code-frame": {
39
  "version": "7.27.1",
40
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
 
795
  "@jridgewell/sourcemap-codec": "^1.4.14"
796
  }
797
  },
798
+ "node_modules/@nodelib/fs.scandir": {
799
+ "version": "2.1.5",
800
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
801
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
802
+ "dev": true,
803
+ "dependencies": {
804
+ "@nodelib/fs.stat": "2.0.5",
805
+ "run-parallel": "^1.1.9"
806
+ },
807
+ "engines": {
808
+ "node": ">= 8"
809
+ }
810
+ },
811
+ "node_modules/@nodelib/fs.stat": {
812
+ "version": "2.0.5",
813
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
814
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
815
+ "dev": true,
816
+ "engines": {
817
+ "node": ">= 8"
818
+ }
819
+ },
820
+ "node_modules/@nodelib/fs.walk": {
821
+ "version": "1.2.8",
822
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
823
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
824
+ "dev": true,
825
+ "dependencies": {
826
+ "@nodelib/fs.scandir": "2.1.5",
827
+ "fastq": "^1.6.0"
828
+ },
829
+ "engines": {
830
+ "node": ">= 8"
831
+ }
832
+ },
833
  "node_modules/@pkgjs/parseargs": {
834
  "version": "0.11.0",
835
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
 
1237
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1238
  }
1239
  },
1240
+ "node_modules/any-promise": {
1241
+ "version": "1.3.0",
1242
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1243
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1244
+ "dev": true
1245
+ },
1246
+ "node_modules/anymatch": {
1247
+ "version": "3.1.3",
1248
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1249
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1250
+ "dev": true,
1251
+ "dependencies": {
1252
+ "normalize-path": "^3.0.0",
1253
+ "picomatch": "^2.0.4"
1254
+ },
1255
+ "engines": {
1256
+ "node": ">= 8"
1257
+ }
1258
+ },
1259
+ "node_modules/anymatch/node_modules/picomatch": {
1260
+ "version": "2.3.1",
1261
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1262
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1263
+ "dev": true,
1264
+ "engines": {
1265
+ "node": ">=8.6"
1266
+ },
1267
+ "funding": {
1268
+ "url": "https://github.com/sponsors/jonschlinkert"
1269
+ }
1270
+ },
1271
+ "node_modules/arg": {
1272
+ "version": "5.0.2",
1273
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1274
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1275
+ "dev": true
1276
+ },
1277
+ "node_modules/autoprefixer": {
1278
+ "version": "10.4.22",
1279
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz",
1280
+ "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==",
1281
+ "dev": true,
1282
+ "funding": [
1283
+ {
1284
+ "type": "opencollective",
1285
+ "url": "https://opencollective.com/postcss/"
1286
+ },
1287
+ {
1288
+ "type": "tidelift",
1289
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1290
+ },
1291
+ {
1292
+ "type": "github",
1293
+ "url": "https://github.com/sponsors/ai"
1294
+ }
1295
+ ],
1296
+ "dependencies": {
1297
+ "browserslist": "^4.27.0",
1298
+ "caniuse-lite": "^1.0.30001754",
1299
+ "fraction.js": "^5.3.4",
1300
+ "normalize-range": "^0.1.2",
1301
+ "picocolors": "^1.1.1",
1302
+ "postcss-value-parser": "^4.2.0"
1303
+ },
1304
+ "bin": {
1305
+ "autoprefixer": "bin/autoprefixer"
1306
+ },
1307
+ "engines": {
1308
+ "node": "^10 || ^12 || >=14"
1309
+ },
1310
+ "peerDependencies": {
1311
+ "postcss": "^8.1.0"
1312
+ }
1313
+ },
1314
  "node_modules/balanced-match": {
1315
  "version": "1.0.2",
1316
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 
1352
  "node": "*"
1353
  }
1354
  },
1355
+ "node_modules/binary-extensions": {
1356
+ "version": "2.3.0",
1357
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1358
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1359
+ "dev": true,
1360
+ "engines": {
1361
+ "node": ">=8"
1362
+ },
1363
+ "funding": {
1364
+ "url": "https://github.com/sponsors/sindresorhus"
1365
+ }
1366
+ },
1367
  "node_modules/brace-expansion": {
1368
  "version": "2.0.2",
1369
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
 
1372
  "balanced-match": "^1.0.0"
1373
  }
1374
  },
1375
+ "node_modules/braces": {
1376
+ "version": "3.0.3",
1377
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1378
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1379
+ "dev": true,
1380
+ "dependencies": {
1381
+ "fill-range": "^7.1.1"
1382
+ },
1383
+ "engines": {
1384
+ "node": ">=8"
1385
+ }
1386
+ },
1387
  "node_modules/browserslist": {
1388
  "version": "4.28.0",
1389
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
 
1422
  "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
1423
  "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
1424
  },
1425
+ "node_modules/camelcase-css": {
1426
+ "version": "2.0.1",
1427
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1428
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1429
+ "dev": true,
1430
+ "engines": {
1431
+ "node": ">= 6"
1432
+ }
1433
+ },
1434
  "node_modules/caniuse-lite": {
1435
  "version": "1.0.30001756",
1436
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
 
1451
  }
1452
  ]
1453
  },
1454
+ "node_modules/chokidar": {
1455
+ "version": "3.6.0",
1456
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1457
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1458
+ "dev": true,
1459
+ "dependencies": {
1460
+ "anymatch": "~3.1.2",
1461
+ "braces": "~3.0.2",
1462
+ "glob-parent": "~5.1.2",
1463
+ "is-binary-path": "~2.1.0",
1464
+ "is-glob": "~4.0.1",
1465
+ "normalize-path": "~3.0.0",
1466
+ "readdirp": "~3.6.0"
1467
+ },
1468
+ "engines": {
1469
+ "node": ">= 8.10.0"
1470
+ },
1471
+ "funding": {
1472
+ "url": "https://paulmillr.com/funding/"
1473
+ },
1474
+ "optionalDependencies": {
1475
+ "fsevents": "~2.3.2"
1476
+ }
1477
+ },
1478
+ "node_modules/chokidar/node_modules/glob-parent": {
1479
+ "version": "5.1.2",
1480
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1481
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1482
+ "dev": true,
1483
+ "dependencies": {
1484
+ "is-glob": "^4.0.1"
1485
+ },
1486
+ "engines": {
1487
+ "node": ">= 6"
1488
+ }
1489
+ },
1490
  "node_modules/color-convert": {
1491
  "version": "2.0.1",
1492
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 
1503
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1504
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1505
  },
1506
+ "node_modules/commander": {
1507
+ "version": "4.1.1",
1508
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1509
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1510
+ "dev": true,
1511
+ "engines": {
1512
+ "node": ">= 6"
1513
+ }
1514
+ },
1515
  "node_modules/convert-source-map": {
1516
  "version": "2.0.0",
1517
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
 
1539
  "node": ">= 8"
1540
  }
1541
  },
1542
+ "node_modules/cssesc": {
1543
+ "version": "3.0.0",
1544
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1545
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1546
+ "dev": true,
1547
+ "bin": {
1548
+ "cssesc": "bin/cssesc"
1549
+ },
1550
+ "engines": {
1551
+ "node": ">=4"
1552
+ }
1553
+ },
1554
  "node_modules/data-uri-to-buffer": {
1555
  "version": "4.0.1",
1556
  "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
 
1575
  }
1576
  }
1577
  },
1578
+ "node_modules/didyoumean": {
1579
+ "version": "1.2.2",
1580
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1581
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1582
+ "dev": true
1583
+ },
1584
+ "node_modules/dlv": {
1585
+ "version": "1.1.3",
1586
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1587
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1588
+ "dev": true
1589
+ },
1590
  "node_modules/eastasianwidth": {
1591
  "version": "0.2.0",
1592
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
 
1666
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1667
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1668
  },
1669
+ "node_modules/fast-glob": {
1670
+ "version": "3.3.3",
1671
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1672
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1673
+ "dev": true,
1674
+ "dependencies": {
1675
+ "@nodelib/fs.stat": "^2.0.2",
1676
+ "@nodelib/fs.walk": "^1.2.3",
1677
+ "glob-parent": "^5.1.2",
1678
+ "merge2": "^1.3.0",
1679
+ "micromatch": "^4.0.8"
1680
+ },
1681
+ "engines": {
1682
+ "node": ">=8.6.0"
1683
+ }
1684
+ },
1685
+ "node_modules/fast-glob/node_modules/glob-parent": {
1686
+ "version": "5.1.2",
1687
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1688
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1689
+ "dev": true,
1690
+ "dependencies": {
1691
+ "is-glob": "^4.0.1"
1692
+ },
1693
+ "engines": {
1694
+ "node": ">= 6"
1695
+ }
1696
+ },
1697
+ "node_modules/fastq": {
1698
+ "version": "1.19.1",
1699
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
1700
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
1701
+ "dev": true,
1702
+ "dependencies": {
1703
+ "reusify": "^1.0.4"
1704
+ }
1705
+ },
1706
  "node_modules/fdir": {
1707
  "version": "6.5.0",
1708
  "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
 
1742
  "node": "^12.20 || >= 14.13"
1743
  }
1744
  },
1745
+ "node_modules/fill-range": {
1746
+ "version": "7.1.1",
1747
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1748
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1749
+ "dev": true,
1750
+ "dependencies": {
1751
+ "to-regex-range": "^5.0.1"
1752
+ },
1753
+ "engines": {
1754
+ "node": ">=8"
1755
+ }
1756
+ },
1757
  "node_modules/foreground-child": {
1758
  "version": "3.3.1",
1759
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
 
1780
  "node": ">=12.20.0"
1781
  }
1782
  },
1783
+ "node_modules/fraction.js": {
1784
+ "version": "5.3.4",
1785
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
1786
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
1787
+ "dev": true,
1788
+ "engines": {
1789
+ "node": "*"
1790
+ },
1791
+ "funding": {
1792
+ "type": "github",
1793
+ "url": "https://github.com/sponsors/rawify"
1794
+ }
1795
+ },
1796
  "node_modules/fsevents": {
1797
  "version": "2.3.3",
1798
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
 
1807
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1808
  }
1809
  },
1810
+ "node_modules/function-bind": {
1811
+ "version": "1.1.2",
1812
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1813
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1814
+ "dev": true,
1815
+ "funding": {
1816
+ "url": "https://github.com/sponsors/ljharb"
1817
+ }
1818
+ },
1819
  "node_modules/gaxios": {
1820
  "version": "7.1.3",
1821
  "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
 
1871
  "url": "https://github.com/sponsors/isaacs"
1872
  }
1873
  },
1874
+ "node_modules/glob-parent": {
1875
+ "version": "6.0.2",
1876
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1877
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1878
+ "dev": true,
1879
+ "dependencies": {
1880
+ "is-glob": "^4.0.3"
1881
+ },
1882
+ "engines": {
1883
+ "node": ">=10.13.0"
1884
+ }
1885
+ },
1886
  "node_modules/google-auth-library": {
1887
  "version": "10.5.0",
1888
  "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz",
 
1920
  "node": ">=18"
1921
  }
1922
  },
1923
+ "node_modules/hasown": {
1924
+ "version": "2.0.2",
1925
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1926
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1927
+ "dev": true,
1928
+ "dependencies": {
1929
+ "function-bind": "^1.1.2"
1930
+ },
1931
+ "engines": {
1932
+ "node": ">= 0.4"
1933
+ }
1934
+ },
1935
  "node_modules/https-proxy-agent": {
1936
  "version": "7.0.6",
1937
  "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
 
1944
  "node": ">= 14"
1945
  }
1946
  },
1947
+ "node_modules/is-binary-path": {
1948
+ "version": "2.1.0",
1949
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1950
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1951
+ "dev": true,
1952
+ "dependencies": {
1953
+ "binary-extensions": "^2.0.0"
1954
+ },
1955
+ "engines": {
1956
+ "node": ">=8"
1957
+ }
1958
+ },
1959
+ "node_modules/is-core-module": {
1960
+ "version": "2.16.1",
1961
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1962
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
1963
+ "dev": true,
1964
+ "dependencies": {
1965
+ "hasown": "^2.0.2"
1966
+ },
1967
+ "engines": {
1968
+ "node": ">= 0.4"
1969
+ },
1970
+ "funding": {
1971
+ "url": "https://github.com/sponsors/ljharb"
1972
+ }
1973
+ },
1974
+ "node_modules/is-extglob": {
1975
+ "version": "2.1.1",
1976
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1977
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1978
+ "dev": true,
1979
+ "engines": {
1980
+ "node": ">=0.10.0"
1981
+ }
1982
+ },
1983
  "node_modules/is-fullwidth-code-point": {
1984
  "version": "3.0.0",
1985
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 
1988
  "node": ">=8"
1989
  }
1990
  },
1991
+ "node_modules/is-glob": {
1992
+ "version": "4.0.3",
1993
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1994
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1995
+ "dev": true,
1996
+ "dependencies": {
1997
+ "is-extglob": "^2.1.1"
1998
+ },
1999
+ "engines": {
2000
+ "node": ">=0.10.0"
2001
+ }
2002
+ },
2003
+ "node_modules/is-number": {
2004
+ "version": "7.0.0",
2005
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2006
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2007
+ "dev": true,
2008
+ "engines": {
2009
+ "node": ">=0.12.0"
2010
+ }
2011
+ },
2012
  "node_modules/isexe": {
2013
  "version": "2.0.0",
2014
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 
2028
  "@pkgjs/parseargs": "^0.11.0"
2029
  }
2030
  },
2031
+ "node_modules/jiti": {
2032
+ "version": "1.21.7",
2033
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
2034
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
2035
+ "dev": true,
2036
+ "bin": {
2037
+ "jiti": "bin/jiti.js"
2038
+ }
2039
+ },
2040
  "node_modules/js-tokens": {
2041
  "version": "4.0.0",
2042
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
2094
  "safe-buffer": "^5.0.1"
2095
  }
2096
  },
2097
+ "node_modules/lilconfig": {
2098
+ "version": "3.1.3",
2099
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
2100
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
2101
+ "dev": true,
2102
+ "engines": {
2103
+ "node": ">=14"
2104
+ },
2105
+ "funding": {
2106
+ "url": "https://github.com/sponsors/antonk52"
2107
+ }
2108
+ },
2109
+ "node_modules/lines-and-columns": {
2110
+ "version": "1.2.4",
2111
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
2112
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2113
+ "dev": true
2114
+ },
2115
  "node_modules/lru-cache": {
2116
  "version": "5.1.1",
2117
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
 
2121
  "yallist": "^3.0.2"
2122
  }
2123
  },
2124
+ "node_modules/merge2": {
2125
+ "version": "1.4.1",
2126
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2127
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2128
+ "dev": true,
2129
+ "engines": {
2130
+ "node": ">= 8"
2131
+ }
2132
+ },
2133
+ "node_modules/micromatch": {
2134
+ "version": "4.0.8",
2135
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
2136
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
2137
+ "dev": true,
2138
+ "dependencies": {
2139
+ "braces": "^3.0.3",
2140
+ "picomatch": "^2.3.1"
2141
+ },
2142
+ "engines": {
2143
+ "node": ">=8.6"
2144
+ }
2145
+ },
2146
+ "node_modules/micromatch/node_modules/picomatch": {
2147
+ "version": "2.3.1",
2148
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2149
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2150
+ "dev": true,
2151
+ "engines": {
2152
+ "node": ">=8.6"
2153
+ },
2154
+ "funding": {
2155
+ "url": "https://github.com/sponsors/jonschlinkert"
2156
+ }
2157
+ },
2158
  "node_modules/minimatch": {
2159
  "version": "9.0.5",
2160
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
 
2182
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2183
  "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
2184
  },
2185
+ "node_modules/mz": {
2186
+ "version": "2.7.0",
2187
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
2188
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
2189
+ "dev": true,
2190
+ "dependencies": {
2191
+ "any-promise": "^1.0.0",
2192
+ "object-assign": "^4.0.1",
2193
+ "thenify-all": "^1.0.0"
2194
+ }
2195
+ },
2196
  "node_modules/nanoid": {
2197
  "version": "3.3.11",
2198
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
 
2253
  "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
2254
  "dev": true
2255
  },
2256
+ "node_modules/normalize-path": {
2257
+ "version": "3.0.0",
2258
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2259
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2260
+ "dev": true,
2261
+ "engines": {
2262
+ "node": ">=0.10.0"
2263
+ }
2264
+ },
2265
+ "node_modules/normalize-range": {
2266
+ "version": "0.1.2",
2267
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
2268
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
2269
+ "dev": true,
2270
+ "engines": {
2271
+ "node": ">=0.10.0"
2272
+ }
2273
+ },
2274
+ "node_modules/object-assign": {
2275
+ "version": "4.1.1",
2276
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2277
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2278
+ "dev": true,
2279
+ "engines": {
2280
+ "node": ">=0.10.0"
2281
+ }
2282
+ },
2283
+ "node_modules/object-hash": {
2284
+ "version": "3.0.0",
2285
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
2286
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
2287
+ "dev": true,
2288
+ "engines": {
2289
+ "node": ">= 6"
2290
+ }
2291
+ },
2292
  "node_modules/package-json-from-dist": {
2293
  "version": "1.0.1",
2294
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
 
2302
  "node": ">=8"
2303
  }
2304
  },
2305
+ "node_modules/path-parse": {
2306
+ "version": "1.0.7",
2307
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2308
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2309
+ "dev": true
2310
+ },
2311
  "node_modules/path-scurry": {
2312
  "version": "1.11.1",
2313
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
 
2346
  "url": "https://github.com/sponsors/jonschlinkert"
2347
  }
2348
  },
2349
+ "node_modules/pify": {
2350
+ "version": "2.3.0",
2351
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2352
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
2353
+ "dev": true,
2354
+ "engines": {
2355
+ "node": ">=0.10.0"
2356
+ }
2357
+ },
2358
+ "node_modules/pirates": {
2359
+ "version": "4.0.7",
2360
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
2361
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
2362
+ "dev": true,
2363
+ "engines": {
2364
+ "node": ">= 6"
2365
+ }
2366
+ },
2367
  "node_modules/postcss": {
2368
  "version": "8.5.6",
2369
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
 
2392
  "node": "^10 || ^12 || >=14"
2393
  }
2394
  },
2395
+ "node_modules/postcss-import": {
2396
+ "version": "15.1.0",
2397
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2398
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2399
+ "dev": true,
2400
+ "dependencies": {
2401
+ "postcss-value-parser": "^4.0.0",
2402
+ "read-cache": "^1.0.0",
2403
+ "resolve": "^1.1.7"
2404
+ },
2405
+ "engines": {
2406
+ "node": ">=14.0.0"
2407
+ },
2408
+ "peerDependencies": {
2409
+ "postcss": "^8.0.0"
2410
+ }
2411
+ },
2412
+ "node_modules/postcss-js": {
2413
+ "version": "4.1.0",
2414
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
2415
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
2416
+ "dev": true,
2417
+ "funding": [
2418
+ {
2419
+ "type": "opencollective",
2420
+ "url": "https://opencollective.com/postcss/"
2421
+ },
2422
+ {
2423
+ "type": "github",
2424
+ "url": "https://github.com/sponsors/ai"
2425
+ }
2426
+ ],
2427
+ "dependencies": {
2428
+ "camelcase-css": "^2.0.1"
2429
+ },
2430
+ "engines": {
2431
+ "node": "^12 || ^14 || >= 16"
2432
+ },
2433
+ "peerDependencies": {
2434
+ "postcss": "^8.4.21"
2435
+ }
2436
+ },
2437
+ "node_modules/postcss-load-config": {
2438
+ "version": "6.0.1",
2439
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
2440
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
2441
+ "dev": true,
2442
+ "funding": [
2443
+ {
2444
+ "type": "opencollective",
2445
+ "url": "https://opencollective.com/postcss/"
2446
+ },
2447
+ {
2448
+ "type": "github",
2449
+ "url": "https://github.com/sponsors/ai"
2450
+ }
2451
+ ],
2452
+ "dependencies": {
2453
+ "lilconfig": "^3.1.1"
2454
+ },
2455
+ "engines": {
2456
+ "node": ">= 18"
2457
+ },
2458
+ "peerDependencies": {
2459
+ "jiti": ">=1.21.0",
2460
+ "postcss": ">=8.0.9",
2461
+ "tsx": "^4.8.1",
2462
+ "yaml": "^2.4.2"
2463
+ },
2464
+ "peerDependenciesMeta": {
2465
+ "jiti": {
2466
+ "optional": true
2467
+ },
2468
+ "postcss": {
2469
+ "optional": true
2470
+ },
2471
+ "tsx": {
2472
+ "optional": true
2473
+ },
2474
+ "yaml": {
2475
+ "optional": true
2476
+ }
2477
+ }
2478
+ },
2479
+ "node_modules/postcss-nested": {
2480
+ "version": "6.2.0",
2481
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
2482
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
2483
+ "dev": true,
2484
+ "funding": [
2485
+ {
2486
+ "type": "opencollective",
2487
+ "url": "https://opencollective.com/postcss/"
2488
+ },
2489
+ {
2490
+ "type": "github",
2491
+ "url": "https://github.com/sponsors/ai"
2492
+ }
2493
+ ],
2494
+ "dependencies": {
2495
+ "postcss-selector-parser": "^6.1.1"
2496
+ },
2497
+ "engines": {
2498
+ "node": ">=12.0"
2499
+ },
2500
+ "peerDependencies": {
2501
+ "postcss": "^8.2.14"
2502
+ }
2503
+ },
2504
+ "node_modules/postcss-selector-parser": {
2505
+ "version": "6.1.2",
2506
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
2507
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
2508
+ "dev": true,
2509
+ "dependencies": {
2510
+ "cssesc": "^3.0.0",
2511
+ "util-deprecate": "^1.0.2"
2512
+ },
2513
+ "engines": {
2514
+ "node": ">=4"
2515
+ }
2516
+ },
2517
+ "node_modules/postcss-value-parser": {
2518
+ "version": "4.2.0",
2519
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2520
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
2521
+ "dev": true
2522
+ },
2523
+ "node_modules/queue-microtask": {
2524
+ "version": "1.2.3",
2525
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2526
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2527
+ "dev": true,
2528
+ "funding": [
2529
+ {
2530
+ "type": "github",
2531
+ "url": "https://github.com/sponsors/feross"
2532
+ },
2533
+ {
2534
+ "type": "patreon",
2535
+ "url": "https://www.patreon.com/feross"
2536
+ },
2537
+ {
2538
+ "type": "consulting",
2539
+ "url": "https://feross.org/support"
2540
+ }
2541
+ ]
2542
+ },
2543
  "node_modules/react": {
2544
  "version": "19.2.0",
2545
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
 
2604
  "react-dom": ">=18"
2605
  }
2606
  },
2607
+ "node_modules/read-cache": {
2608
+ "version": "1.0.0",
2609
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2610
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2611
+ "dev": true,
2612
+ "dependencies": {
2613
+ "pify": "^2.3.0"
2614
+ }
2615
+ },
2616
+ "node_modules/readdirp": {
2617
+ "version": "3.6.0",
2618
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2619
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2620
+ "dev": true,
2621
+ "dependencies": {
2622
+ "picomatch": "^2.2.1"
2623
+ },
2624
+ "engines": {
2625
+ "node": ">=8.10.0"
2626
+ }
2627
+ },
2628
+ "node_modules/readdirp/node_modules/picomatch": {
2629
+ "version": "2.3.1",
2630
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2631
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2632
+ "dev": true,
2633
+ "engines": {
2634
+ "node": ">=8.6"
2635
+ },
2636
+ "funding": {
2637
+ "url": "https://github.com/sponsors/jonschlinkert"
2638
+ }
2639
+ },
2640
+ "node_modules/resolve": {
2641
+ "version": "1.22.11",
2642
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
2643
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
2644
+ "dev": true,
2645
+ "dependencies": {
2646
+ "is-core-module": "^2.16.1",
2647
+ "path-parse": "^1.0.7",
2648
+ "supports-preserve-symlinks-flag": "^1.0.0"
2649
+ },
2650
+ "bin": {
2651
+ "resolve": "bin/resolve"
2652
+ },
2653
+ "engines": {
2654
+ "node": ">= 0.4"
2655
+ },
2656
+ "funding": {
2657
+ "url": "https://github.com/sponsors/ljharb"
2658
+ }
2659
+ },
2660
+ "node_modules/reusify": {
2661
+ "version": "1.1.0",
2662
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2663
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2664
+ "dev": true,
2665
+ "engines": {
2666
+ "iojs": ">=1.0.0",
2667
+ "node": ">=0.10.0"
2668
+ }
2669
+ },
2670
  "node_modules/rimraf": {
2671
  "version": "5.0.10",
2672
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
 
2722
  "fsevents": "~2.3.2"
2723
  }
2724
  },
2725
+ "node_modules/run-parallel": {
2726
+ "version": "1.2.0",
2727
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2728
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2729
+ "dev": true,
2730
+ "funding": [
2731
+ {
2732
+ "type": "github",
2733
+ "url": "https://github.com/sponsors/feross"
2734
+ },
2735
+ {
2736
+ "type": "patreon",
2737
+ "url": "https://www.patreon.com/feross"
2738
+ },
2739
+ {
2740
+ "type": "consulting",
2741
+ "url": "https://feross.org/support"
2742
+ }
2743
+ ],
2744
+ "dependencies": {
2745
+ "queue-microtask": "^1.2.2"
2746
+ }
2747
+ },
2748
  "node_modules/safe-buffer": {
2749
  "version": "5.2.1",
2750
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
 
2910
  "node": ">=8"
2911
  }
2912
  },
2913
+ "node_modules/sucrase": {
2914
+ "version": "3.35.1",
2915
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
2916
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
2917
+ "dev": true,
2918
+ "dependencies": {
2919
+ "@jridgewell/gen-mapping": "^0.3.2",
2920
+ "commander": "^4.0.0",
2921
+ "lines-and-columns": "^1.1.6",
2922
+ "mz": "^2.7.0",
2923
+ "pirates": "^4.0.1",
2924
+ "tinyglobby": "^0.2.11",
2925
+ "ts-interface-checker": "^0.1.9"
2926
+ },
2927
+ "bin": {
2928
+ "sucrase": "bin/sucrase",
2929
+ "sucrase-node": "bin/sucrase-node"
2930
+ },
2931
+ "engines": {
2932
+ "node": ">=16 || 14 >=14.17"
2933
+ }
2934
+ },
2935
+ "node_modules/supports-preserve-symlinks-flag": {
2936
+ "version": "1.0.0",
2937
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2938
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2939
+ "dev": true,
2940
+ "engines": {
2941
+ "node": ">= 0.4"
2942
+ },
2943
+ "funding": {
2944
+ "url": "https://github.com/sponsors/ljharb"
2945
+ }
2946
+ },
2947
+ "node_modules/tailwindcss": {
2948
+ "version": "3.4.18",
2949
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
2950
+ "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
2951
+ "dev": true,
2952
+ "dependencies": {
2953
+ "@alloc/quick-lru": "^5.2.0",
2954
+ "arg": "^5.0.2",
2955
+ "chokidar": "^3.6.0",
2956
+ "didyoumean": "^1.2.2",
2957
+ "dlv": "^1.1.3",
2958
+ "fast-glob": "^3.3.2",
2959
+ "glob-parent": "^6.0.2",
2960
+ "is-glob": "^4.0.3",
2961
+ "jiti": "^1.21.7",
2962
+ "lilconfig": "^3.1.3",
2963
+ "micromatch": "^4.0.8",
2964
+ "normalize-path": "^3.0.0",
2965
+ "object-hash": "^3.0.0",
2966
+ "picocolors": "^1.1.1",
2967
+ "postcss": "^8.4.47",
2968
+ "postcss-import": "^15.1.0",
2969
+ "postcss-js": "^4.0.1",
2970
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
2971
+ "postcss-nested": "^6.2.0",
2972
+ "postcss-selector-parser": "^6.1.2",
2973
+ "resolve": "^1.22.8",
2974
+ "sucrase": "^3.35.0"
2975
+ },
2976
+ "bin": {
2977
+ "tailwind": "lib/cli.js",
2978
+ "tailwindcss": "lib/cli.js"
2979
+ },
2980
+ "engines": {
2981
+ "node": ">=14.0.0"
2982
+ }
2983
+ },
2984
+ "node_modules/thenify": {
2985
+ "version": "3.3.1",
2986
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2987
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2988
+ "dev": true,
2989
+ "dependencies": {
2990
+ "any-promise": "^1.0.0"
2991
+ }
2992
+ },
2993
+ "node_modules/thenify-all": {
2994
+ "version": "1.6.0",
2995
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2996
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2997
+ "dev": true,
2998
+ "dependencies": {
2999
+ "thenify": ">= 3.1.0 < 4"
3000
+ },
3001
+ "engines": {
3002
+ "node": ">=0.8"
3003
+ }
3004
+ },
3005
  "node_modules/tinyglobby": {
3006
  "version": "0.2.15",
3007
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
 
3018
  "url": "https://github.com/sponsors/SuperchupuDev"
3019
  }
3020
  },
3021
+ "node_modules/to-regex-range": {
3022
+ "version": "5.0.1",
3023
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3024
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3025
+ "dev": true,
3026
+ "dependencies": {
3027
+ "is-number": "^7.0.0"
3028
+ },
3029
+ "engines": {
3030
+ "node": ">=8.0"
3031
+ }
3032
+ },
3033
+ "node_modules/ts-interface-checker": {
3034
+ "version": "0.1.13",
3035
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
3036
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
3037
+ "dev": true
3038
+ },
3039
  "node_modules/typescript": {
3040
  "version": "5.8.3",
3041
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
 
3085
  "browserslist": ">= 4.21.0"
3086
  }
3087
  },
3088
+ "node_modules/util-deprecate": {
3089
+ "version": "1.0.2",
3090
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3091
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
3092
+ "dev": true
3093
+ },
3094
  "node_modules/vite": {
3095
  "version": "6.4.1",
3096
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",