Utkarsh64 commited on
Commit
e6bc6be
·
verified ·
1 Parent(s): f88605d

Upload 21 files

Browse files
frontend/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
frontend/README.md ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # React + Vite
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
frontend/dist/assets/index-D2HbQOca.css ADDED
@@ -0,0 +1 @@
 
 
1
+ @import "https://fonts.googleapis.com/css2?family=Manrope:wght@400;600;700;800&family=Syne:wght@600;700&display=swap";:root{--body-font:"Manrope", "Segoe UI", sans-serif;--display-font:"Syne", "Trebuchet MS", sans-serif;--text-main:#0d2b2f;--text-muted:#4f6f73;--accent-2:#1a6870;--panel-bg:#ffffffbd;--panel-bg-alt:#f3faf8e0;--panel-border:#0d2b2f26;--dropzone-border:#14545c66;font-family:var(--body-font);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:400;line-height:1.45}*{box-sizing:border-box}body{min-height:100vh;color:var(--text-main);background:radial-gradient(circle at 84% 8%,#f3c96959,#0000 42%),radial-gradient(circle at 14% 30%,#5fb7c252,#0000 46%),linear-gradient(120deg,#d8ece8 0%,#eef6f3 52%,#dce9ed 100%);margin:0}#root{min-height:100vh}.app-shell{width:min(1100px,94vw);margin:0 auto;padding:40px 0 64px;animation:.5s riseIn}.hero{text-align:left;margin-bottom:28px}.eyebrow{text-transform:uppercase;letter-spacing:.14em;color:var(--accent-2);font-size:.76rem;font-weight:700}h1{font-family:var(--display-font);letter-spacing:-.03em;color:var(--text-main);margin:10px 0;font-size:clamp(1.95rem,5vw,3.55rem);line-height:1.04}.subtitle{max-width:70ch;color:var(--text-muted);line-height:1.6}.panel{border:1px solid var(--panel-border);background:linear-gradient(138deg, var(--panel-bg), var(--panel-bg-alt));-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:24px;padding:22px;box-shadow:0 24px 60px -40px #0a272ba6}.dropzone{border:1.4px dashed var(--dropzone-border);text-align:center;background:#ffffff85;border-radius:18px;padding:28px 16px;transition:all .22s}.dropzone-active{border-color:var(--accent-2);transform:translateY(-1px);box-shadow:0 20px 36px -30px #14545cb3}.dropzone-title{color:var(--text-main);font-size:1.1rem;font-weight:700}.dropzone-subtitle{color:var(--text-muted);margin-top:4px;font-size:.95rem}#imagePicker{clip:rect(0, 0, 0, 0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pick-btn{cursor:pointer;color:#f4fffd;background:linear-gradient(120deg,#14545c,#0a2f36);border-radius:999px;margin-top:16px;padding:10px 18px;font-weight:700;display:inline-block}.file-meta{color:var(--text-muted);margin-top:12px;font-size:.92rem}.actions{flex-wrap:wrap;gap:10px;margin-top:16px;display:flex}.enhance-btn,.reset-btn,.download-btn{font-family:var(--body-font);cursor:pointer;border:none;border-radius:12px;padding:11px 16px;font-size:.95rem;font-weight:700;transition:transform .2s,box-shadow .2s,opacity .2s}.enhance-btn{color:#f2fffc;background:linear-gradient(130deg,#1f7b85,#14545c);box-shadow:0 12px 30px -20px #0f4c53e6}.enhance-btn:disabled{opacity:.72;cursor:not-allowed}.reset-btn{color:var(--text-main);border:1px solid var(--panel-border);background:#ffffffb8}.download-btn{color:var(--text-main);background:#f3c969;text-decoration:none}.enhance-btn:hover,.reset-btn:hover,.download-btn:hover{transform:translateY(-1px)}.error-banner{color:#6e1f16;background:#ffe8e1;border:1px solid #f7c2b8;border-radius:12px;margin-top:12px;padding:10px 12px}.preview-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:18px;display:grid}.preview-card{border:1px solid var(--panel-border);background:#ffffffd1;border-radius:20px;min-height:310px;padding:14px}h2{color:var(--text-main);font-family:var(--display-font);margin:2px 0 10px;font-size:1.16rem}.placeholder{border-radius:12px;width:100%;height:260px}.preview-card img{display:block;max-width:100%;max-height:min(70vh,560px);width:auto;height:auto;margin:0 auto;object-fit:contain;image-rendering:auto;border-radius:12px;border:1px solid #0a2f3626;background:#f7fbfa}.placeholder{text-align:center;color:var(--text-muted);background:linear-gradient(120deg,#dde7e880,#f8fbfaf2);border:1px solid #0a2f3614;place-items:center;padding:20px;display:grid}@keyframes riseIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (width<=900px){.app-shell{padding-top:24px}.panel{padding:16px}.preview-grid{grid-template-columns:1fr}.preview-card{min-height:270px}.placeholder{height:220px}.preview-card img{max-height:420px}}
frontend/dist/assets/index-DnpYzB-O.js ADDED
The diff for this file is too large to render. See raw diff
 
frontend/dist/favicon.svg ADDED
frontend/dist/icons.svg ADDED
frontend/dist/index.html ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>frontend</title>
8
+ <script type="module" crossorigin src="/assets/index-DnpYzB-O.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-D2HbQOca.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
frontend/eslint.config.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import { defineConfig, globalIgnores } from 'eslint/config'
6
+
7
+ export default defineConfig([
8
+ globalIgnores(['dist']),
9
+ {
10
+ files: ['**/*.{js,jsx}'],
11
+ extends: [
12
+ js.configs.recommended,
13
+ reactHooks.configs.flat.recommended,
14
+ reactRefresh.configs.vite,
15
+ ],
16
+ languageOptions: {
17
+ ecmaVersion: 2020,
18
+ globals: globals.browser,
19
+ parserOptions: {
20
+ ecmaVersion: 'latest',
21
+ ecmaFeatures: { jsx: true },
22
+ sourceType: 'module',
23
+ },
24
+ },
25
+ rules: {
26
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
27
+ },
28
+ },
29
+ ])
frontend/index.html CHANGED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>frontend</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.jsx"></script>
12
+ </body>
13
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,2617 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "frontend",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "react": "^19.2.5",
12
+ "react-dom": "^19.2.5"
13
+ },
14
+ "devDependencies": {
15
+ "@eslint/js": "^9.39.4",
16
+ "@types/react": "^19.2.14",
17
+ "@types/react-dom": "^19.2.3",
18
+ "@vitejs/plugin-react": "^6.0.1",
19
+ "eslint": "^9.39.4",
20
+ "eslint-plugin-react-hooks": "^7.1.1",
21
+ "eslint-plugin-react-refresh": "^0.5.2",
22
+ "globals": "^17.5.0",
23
+ "vite": "^8.0.9"
24
+ }
25
+ },
26
+ "node_modules/@babel/code-frame": {
27
+ "version": "7.29.0",
28
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
29
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
30
+ "dev": true,
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@babel/helper-validator-identifier": "^7.28.5",
34
+ "js-tokens": "^4.0.0",
35
+ "picocolors": "^1.1.1"
36
+ },
37
+ "engines": {
38
+ "node": ">=6.9.0"
39
+ }
40
+ },
41
+ "node_modules/@babel/compat-data": {
42
+ "version": "7.29.0",
43
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
44
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
45
+ "dev": true,
46
+ "license": "MIT",
47
+ "engines": {
48
+ "node": ">=6.9.0"
49
+ }
50
+ },
51
+ "node_modules/@babel/core": {
52
+ "version": "7.29.0",
53
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
54
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
55
+ "dev": true,
56
+ "license": "MIT",
57
+ "dependencies": {
58
+ "@babel/code-frame": "^7.29.0",
59
+ "@babel/generator": "^7.29.0",
60
+ "@babel/helper-compilation-targets": "^7.28.6",
61
+ "@babel/helper-module-transforms": "^7.28.6",
62
+ "@babel/helpers": "^7.28.6",
63
+ "@babel/parser": "^7.29.0",
64
+ "@babel/template": "^7.28.6",
65
+ "@babel/traverse": "^7.29.0",
66
+ "@babel/types": "^7.29.0",
67
+ "@jridgewell/remapping": "^2.3.5",
68
+ "convert-source-map": "^2.0.0",
69
+ "debug": "^4.1.0",
70
+ "gensync": "^1.0.0-beta.2",
71
+ "json5": "^2.2.3",
72
+ "semver": "^6.3.1"
73
+ },
74
+ "engines": {
75
+ "node": ">=6.9.0"
76
+ },
77
+ "funding": {
78
+ "type": "opencollective",
79
+ "url": "https://opencollective.com/babel"
80
+ }
81
+ },
82
+ "node_modules/@babel/generator": {
83
+ "version": "7.29.1",
84
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
85
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
86
+ "dev": true,
87
+ "license": "MIT",
88
+ "dependencies": {
89
+ "@babel/parser": "^7.29.0",
90
+ "@babel/types": "^7.29.0",
91
+ "@jridgewell/gen-mapping": "^0.3.12",
92
+ "@jridgewell/trace-mapping": "^0.3.28",
93
+ "jsesc": "^3.0.2"
94
+ },
95
+ "engines": {
96
+ "node": ">=6.9.0"
97
+ }
98
+ },
99
+ "node_modules/@babel/helper-compilation-targets": {
100
+ "version": "7.28.6",
101
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
102
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
103
+ "dev": true,
104
+ "license": "MIT",
105
+ "dependencies": {
106
+ "@babel/compat-data": "^7.28.6",
107
+ "@babel/helper-validator-option": "^7.27.1",
108
+ "browserslist": "^4.24.0",
109
+ "lru-cache": "^5.1.1",
110
+ "semver": "^6.3.1"
111
+ },
112
+ "engines": {
113
+ "node": ">=6.9.0"
114
+ }
115
+ },
116
+ "node_modules/@babel/helper-globals": {
117
+ "version": "7.28.0",
118
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
119
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
120
+ "dev": true,
121
+ "license": "MIT",
122
+ "engines": {
123
+ "node": ">=6.9.0"
124
+ }
125
+ },
126
+ "node_modules/@babel/helper-module-imports": {
127
+ "version": "7.28.6",
128
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
129
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
130
+ "dev": true,
131
+ "license": "MIT",
132
+ "dependencies": {
133
+ "@babel/traverse": "^7.28.6",
134
+ "@babel/types": "^7.28.6"
135
+ },
136
+ "engines": {
137
+ "node": ">=6.9.0"
138
+ }
139
+ },
140
+ "node_modules/@babel/helper-module-transforms": {
141
+ "version": "7.28.6",
142
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
143
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
144
+ "dev": true,
145
+ "license": "MIT",
146
+ "dependencies": {
147
+ "@babel/helper-module-imports": "^7.28.6",
148
+ "@babel/helper-validator-identifier": "^7.28.5",
149
+ "@babel/traverse": "^7.28.6"
150
+ },
151
+ "engines": {
152
+ "node": ">=6.9.0"
153
+ },
154
+ "peerDependencies": {
155
+ "@babel/core": "^7.0.0"
156
+ }
157
+ },
158
+ "node_modules/@babel/helper-string-parser": {
159
+ "version": "7.27.1",
160
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
161
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
162
+ "dev": true,
163
+ "license": "MIT",
164
+ "engines": {
165
+ "node": ">=6.9.0"
166
+ }
167
+ },
168
+ "node_modules/@babel/helper-validator-identifier": {
169
+ "version": "7.28.5",
170
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
171
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
172
+ "dev": true,
173
+ "license": "MIT",
174
+ "engines": {
175
+ "node": ">=6.9.0"
176
+ }
177
+ },
178
+ "node_modules/@babel/helper-validator-option": {
179
+ "version": "7.27.1",
180
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
181
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
182
+ "dev": true,
183
+ "license": "MIT",
184
+ "engines": {
185
+ "node": ">=6.9.0"
186
+ }
187
+ },
188
+ "node_modules/@babel/helpers": {
189
+ "version": "7.29.2",
190
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
191
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
192
+ "dev": true,
193
+ "license": "MIT",
194
+ "dependencies": {
195
+ "@babel/template": "^7.28.6",
196
+ "@babel/types": "^7.29.0"
197
+ },
198
+ "engines": {
199
+ "node": ">=6.9.0"
200
+ }
201
+ },
202
+ "node_modules/@babel/parser": {
203
+ "version": "7.29.2",
204
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
205
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
206
+ "dev": true,
207
+ "license": "MIT",
208
+ "dependencies": {
209
+ "@babel/types": "^7.29.0"
210
+ },
211
+ "bin": {
212
+ "parser": "bin/babel-parser.js"
213
+ },
214
+ "engines": {
215
+ "node": ">=6.0.0"
216
+ }
217
+ },
218
+ "node_modules/@babel/template": {
219
+ "version": "7.28.6",
220
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
221
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
222
+ "dev": true,
223
+ "license": "MIT",
224
+ "dependencies": {
225
+ "@babel/code-frame": "^7.28.6",
226
+ "@babel/parser": "^7.28.6",
227
+ "@babel/types": "^7.28.6"
228
+ },
229
+ "engines": {
230
+ "node": ">=6.9.0"
231
+ }
232
+ },
233
+ "node_modules/@babel/traverse": {
234
+ "version": "7.29.0",
235
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
236
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
237
+ "dev": true,
238
+ "license": "MIT",
239
+ "dependencies": {
240
+ "@babel/code-frame": "^7.29.0",
241
+ "@babel/generator": "^7.29.0",
242
+ "@babel/helper-globals": "^7.28.0",
243
+ "@babel/parser": "^7.29.0",
244
+ "@babel/template": "^7.28.6",
245
+ "@babel/types": "^7.29.0",
246
+ "debug": "^4.3.1"
247
+ },
248
+ "engines": {
249
+ "node": ">=6.9.0"
250
+ }
251
+ },
252
+ "node_modules/@babel/types": {
253
+ "version": "7.29.0",
254
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
255
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
256
+ "dev": true,
257
+ "license": "MIT",
258
+ "dependencies": {
259
+ "@babel/helper-string-parser": "^7.27.1",
260
+ "@babel/helper-validator-identifier": "^7.28.5"
261
+ },
262
+ "engines": {
263
+ "node": ">=6.9.0"
264
+ }
265
+ },
266
+ "node_modules/@emnapi/core": {
267
+ "version": "1.9.2",
268
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz",
269
+ "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==",
270
+ "dev": true,
271
+ "license": "MIT",
272
+ "optional": true,
273
+ "dependencies": {
274
+ "@emnapi/wasi-threads": "1.2.1",
275
+ "tslib": "^2.4.0"
276
+ }
277
+ },
278
+ "node_modules/@emnapi/runtime": {
279
+ "version": "1.9.2",
280
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz",
281
+ "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==",
282
+ "dev": true,
283
+ "license": "MIT",
284
+ "optional": true,
285
+ "dependencies": {
286
+ "tslib": "^2.4.0"
287
+ }
288
+ },
289
+ "node_modules/@emnapi/wasi-threads": {
290
+ "version": "1.2.1",
291
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
292
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
293
+ "dev": true,
294
+ "license": "MIT",
295
+ "optional": true,
296
+ "dependencies": {
297
+ "tslib": "^2.4.0"
298
+ }
299
+ },
300
+ "node_modules/@eslint-community/eslint-utils": {
301
+ "version": "4.9.1",
302
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
303
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
304
+ "dev": true,
305
+ "license": "MIT",
306
+ "dependencies": {
307
+ "eslint-visitor-keys": "^3.4.3"
308
+ },
309
+ "engines": {
310
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
311
+ },
312
+ "funding": {
313
+ "url": "https://opencollective.com/eslint"
314
+ },
315
+ "peerDependencies": {
316
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
317
+ }
318
+ },
319
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
320
+ "version": "3.4.3",
321
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
322
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
323
+ "dev": true,
324
+ "license": "Apache-2.0",
325
+ "engines": {
326
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
327
+ },
328
+ "funding": {
329
+ "url": "https://opencollective.com/eslint"
330
+ }
331
+ },
332
+ "node_modules/@eslint-community/regexpp": {
333
+ "version": "4.12.2",
334
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
335
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
336
+ "dev": true,
337
+ "license": "MIT",
338
+ "engines": {
339
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
340
+ }
341
+ },
342
+ "node_modules/@eslint/config-array": {
343
+ "version": "0.21.2",
344
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
345
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
346
+ "dev": true,
347
+ "license": "Apache-2.0",
348
+ "dependencies": {
349
+ "@eslint/object-schema": "^2.1.7",
350
+ "debug": "^4.3.1",
351
+ "minimatch": "^3.1.5"
352
+ },
353
+ "engines": {
354
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
355
+ }
356
+ },
357
+ "node_modules/@eslint/config-helpers": {
358
+ "version": "0.4.2",
359
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
360
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
361
+ "dev": true,
362
+ "license": "Apache-2.0",
363
+ "dependencies": {
364
+ "@eslint/core": "^0.17.0"
365
+ },
366
+ "engines": {
367
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
368
+ }
369
+ },
370
+ "node_modules/@eslint/core": {
371
+ "version": "0.17.0",
372
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
373
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
374
+ "dev": true,
375
+ "license": "Apache-2.0",
376
+ "dependencies": {
377
+ "@types/json-schema": "^7.0.15"
378
+ },
379
+ "engines": {
380
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
381
+ }
382
+ },
383
+ "node_modules/@eslint/eslintrc": {
384
+ "version": "3.3.5",
385
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
386
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
387
+ "dev": true,
388
+ "license": "MIT",
389
+ "dependencies": {
390
+ "ajv": "^6.14.0",
391
+ "debug": "^4.3.2",
392
+ "espree": "^10.0.1",
393
+ "globals": "^14.0.0",
394
+ "ignore": "^5.2.0",
395
+ "import-fresh": "^3.2.1",
396
+ "js-yaml": "^4.1.1",
397
+ "minimatch": "^3.1.5",
398
+ "strip-json-comments": "^3.1.1"
399
+ },
400
+ "engines": {
401
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
402
+ },
403
+ "funding": {
404
+ "url": "https://opencollective.com/eslint"
405
+ }
406
+ },
407
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
408
+ "version": "14.0.0",
409
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
410
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
411
+ "dev": true,
412
+ "license": "MIT",
413
+ "engines": {
414
+ "node": ">=18"
415
+ },
416
+ "funding": {
417
+ "url": "https://github.com/sponsors/sindresorhus"
418
+ }
419
+ },
420
+ "node_modules/@eslint/js": {
421
+ "version": "9.39.4",
422
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
423
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
424
+ "dev": true,
425
+ "license": "MIT",
426
+ "engines": {
427
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
428
+ },
429
+ "funding": {
430
+ "url": "https://eslint.org/donate"
431
+ }
432
+ },
433
+ "node_modules/@eslint/object-schema": {
434
+ "version": "2.1.7",
435
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
436
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
437
+ "dev": true,
438
+ "license": "Apache-2.0",
439
+ "engines": {
440
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
441
+ }
442
+ },
443
+ "node_modules/@eslint/plugin-kit": {
444
+ "version": "0.4.1",
445
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
446
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
447
+ "dev": true,
448
+ "license": "Apache-2.0",
449
+ "dependencies": {
450
+ "@eslint/core": "^0.17.0",
451
+ "levn": "^0.4.1"
452
+ },
453
+ "engines": {
454
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
455
+ }
456
+ },
457
+ "node_modules/@humanfs/core": {
458
+ "version": "0.19.2",
459
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
460
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
461
+ "dev": true,
462
+ "license": "Apache-2.0",
463
+ "dependencies": {
464
+ "@humanfs/types": "^0.15.0"
465
+ },
466
+ "engines": {
467
+ "node": ">=18.18.0"
468
+ }
469
+ },
470
+ "node_modules/@humanfs/node": {
471
+ "version": "0.16.8",
472
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
473
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
474
+ "dev": true,
475
+ "license": "Apache-2.0",
476
+ "dependencies": {
477
+ "@humanfs/core": "^0.19.2",
478
+ "@humanfs/types": "^0.15.0",
479
+ "@humanwhocodes/retry": "^0.4.0"
480
+ },
481
+ "engines": {
482
+ "node": ">=18.18.0"
483
+ }
484
+ },
485
+ "node_modules/@humanfs/types": {
486
+ "version": "0.15.0",
487
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
488
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
489
+ "dev": true,
490
+ "license": "Apache-2.0",
491
+ "engines": {
492
+ "node": ">=18.18.0"
493
+ }
494
+ },
495
+ "node_modules/@humanwhocodes/module-importer": {
496
+ "version": "1.0.1",
497
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
498
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
499
+ "dev": true,
500
+ "license": "Apache-2.0",
501
+ "engines": {
502
+ "node": ">=12.22"
503
+ },
504
+ "funding": {
505
+ "type": "github",
506
+ "url": "https://github.com/sponsors/nzakas"
507
+ }
508
+ },
509
+ "node_modules/@humanwhocodes/retry": {
510
+ "version": "0.4.3",
511
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
512
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
513
+ "dev": true,
514
+ "license": "Apache-2.0",
515
+ "engines": {
516
+ "node": ">=18.18"
517
+ },
518
+ "funding": {
519
+ "type": "github",
520
+ "url": "https://github.com/sponsors/nzakas"
521
+ }
522
+ },
523
+ "node_modules/@jridgewell/gen-mapping": {
524
+ "version": "0.3.13",
525
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
526
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
527
+ "dev": true,
528
+ "license": "MIT",
529
+ "dependencies": {
530
+ "@jridgewell/sourcemap-codec": "^1.5.0",
531
+ "@jridgewell/trace-mapping": "^0.3.24"
532
+ }
533
+ },
534
+ "node_modules/@jridgewell/remapping": {
535
+ "version": "2.3.5",
536
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
537
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
538
+ "dev": true,
539
+ "license": "MIT",
540
+ "dependencies": {
541
+ "@jridgewell/gen-mapping": "^0.3.5",
542
+ "@jridgewell/trace-mapping": "^0.3.24"
543
+ }
544
+ },
545
+ "node_modules/@jridgewell/resolve-uri": {
546
+ "version": "3.1.2",
547
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
548
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
549
+ "dev": true,
550
+ "license": "MIT",
551
+ "engines": {
552
+ "node": ">=6.0.0"
553
+ }
554
+ },
555
+ "node_modules/@jridgewell/sourcemap-codec": {
556
+ "version": "1.5.5",
557
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
558
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
559
+ "dev": true,
560
+ "license": "MIT"
561
+ },
562
+ "node_modules/@jridgewell/trace-mapping": {
563
+ "version": "0.3.31",
564
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
565
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
566
+ "dev": true,
567
+ "license": "MIT",
568
+ "dependencies": {
569
+ "@jridgewell/resolve-uri": "^3.1.0",
570
+ "@jridgewell/sourcemap-codec": "^1.4.14"
571
+ }
572
+ },
573
+ "node_modules/@napi-rs/wasm-runtime": {
574
+ "version": "1.1.4",
575
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
576
+ "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
577
+ "dev": true,
578
+ "license": "MIT",
579
+ "optional": true,
580
+ "dependencies": {
581
+ "@tybys/wasm-util": "^0.10.1"
582
+ },
583
+ "funding": {
584
+ "type": "github",
585
+ "url": "https://github.com/sponsors/Brooooooklyn"
586
+ },
587
+ "peerDependencies": {
588
+ "@emnapi/core": "^1.7.1",
589
+ "@emnapi/runtime": "^1.7.1"
590
+ }
591
+ },
592
+ "node_modules/@oxc-project/types": {
593
+ "version": "0.126.0",
594
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.126.0.tgz",
595
+ "integrity": "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==",
596
+ "dev": true,
597
+ "license": "MIT",
598
+ "funding": {
599
+ "url": "https://github.com/sponsors/Boshen"
600
+ }
601
+ },
602
+ "node_modules/@rolldown/binding-android-arm64": {
603
+ "version": "1.0.0-rc.16",
604
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.16.tgz",
605
+ "integrity": "sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==",
606
+ "cpu": [
607
+ "arm64"
608
+ ],
609
+ "dev": true,
610
+ "license": "MIT",
611
+ "optional": true,
612
+ "os": [
613
+ "android"
614
+ ],
615
+ "engines": {
616
+ "node": "^20.19.0 || >=22.12.0"
617
+ }
618
+ },
619
+ "node_modules/@rolldown/binding-darwin-arm64": {
620
+ "version": "1.0.0-rc.16",
621
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.16.tgz",
622
+ "integrity": "sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==",
623
+ "cpu": [
624
+ "arm64"
625
+ ],
626
+ "dev": true,
627
+ "license": "MIT",
628
+ "optional": true,
629
+ "os": [
630
+ "darwin"
631
+ ],
632
+ "engines": {
633
+ "node": "^20.19.0 || >=22.12.0"
634
+ }
635
+ },
636
+ "node_modules/@rolldown/binding-darwin-x64": {
637
+ "version": "1.0.0-rc.16",
638
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.16.tgz",
639
+ "integrity": "sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==",
640
+ "cpu": [
641
+ "x64"
642
+ ],
643
+ "dev": true,
644
+ "license": "MIT",
645
+ "optional": true,
646
+ "os": [
647
+ "darwin"
648
+ ],
649
+ "engines": {
650
+ "node": "^20.19.0 || >=22.12.0"
651
+ }
652
+ },
653
+ "node_modules/@rolldown/binding-freebsd-x64": {
654
+ "version": "1.0.0-rc.16",
655
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.16.tgz",
656
+ "integrity": "sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==",
657
+ "cpu": [
658
+ "x64"
659
+ ],
660
+ "dev": true,
661
+ "license": "MIT",
662
+ "optional": true,
663
+ "os": [
664
+ "freebsd"
665
+ ],
666
+ "engines": {
667
+ "node": "^20.19.0 || >=22.12.0"
668
+ }
669
+ },
670
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
671
+ "version": "1.0.0-rc.16",
672
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.16.tgz",
673
+ "integrity": "sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==",
674
+ "cpu": [
675
+ "arm"
676
+ ],
677
+ "dev": true,
678
+ "license": "MIT",
679
+ "optional": true,
680
+ "os": [
681
+ "linux"
682
+ ],
683
+ "engines": {
684
+ "node": "^20.19.0 || >=22.12.0"
685
+ }
686
+ },
687
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
688
+ "version": "1.0.0-rc.16",
689
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.16.tgz",
690
+ "integrity": "sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==",
691
+ "cpu": [
692
+ "arm64"
693
+ ],
694
+ "dev": true,
695
+ "license": "MIT",
696
+ "optional": true,
697
+ "os": [
698
+ "linux"
699
+ ],
700
+ "engines": {
701
+ "node": "^20.19.0 || >=22.12.0"
702
+ }
703
+ },
704
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
705
+ "version": "1.0.0-rc.16",
706
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.16.tgz",
707
+ "integrity": "sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==",
708
+ "cpu": [
709
+ "arm64"
710
+ ],
711
+ "dev": true,
712
+ "license": "MIT",
713
+ "optional": true,
714
+ "os": [
715
+ "linux"
716
+ ],
717
+ "engines": {
718
+ "node": "^20.19.0 || >=22.12.0"
719
+ }
720
+ },
721
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
722
+ "version": "1.0.0-rc.16",
723
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.16.tgz",
724
+ "integrity": "sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==",
725
+ "cpu": [
726
+ "ppc64"
727
+ ],
728
+ "dev": true,
729
+ "license": "MIT",
730
+ "optional": true,
731
+ "os": [
732
+ "linux"
733
+ ],
734
+ "engines": {
735
+ "node": "^20.19.0 || >=22.12.0"
736
+ }
737
+ },
738
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
739
+ "version": "1.0.0-rc.16",
740
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.16.tgz",
741
+ "integrity": "sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==",
742
+ "cpu": [
743
+ "s390x"
744
+ ],
745
+ "dev": true,
746
+ "license": "MIT",
747
+ "optional": true,
748
+ "os": [
749
+ "linux"
750
+ ],
751
+ "engines": {
752
+ "node": "^20.19.0 || >=22.12.0"
753
+ }
754
+ },
755
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
756
+ "version": "1.0.0-rc.16",
757
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.16.tgz",
758
+ "integrity": "sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==",
759
+ "cpu": [
760
+ "x64"
761
+ ],
762
+ "dev": true,
763
+ "license": "MIT",
764
+ "optional": true,
765
+ "os": [
766
+ "linux"
767
+ ],
768
+ "engines": {
769
+ "node": "^20.19.0 || >=22.12.0"
770
+ }
771
+ },
772
+ "node_modules/@rolldown/binding-linux-x64-musl": {
773
+ "version": "1.0.0-rc.16",
774
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.16.tgz",
775
+ "integrity": "sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==",
776
+ "cpu": [
777
+ "x64"
778
+ ],
779
+ "dev": true,
780
+ "license": "MIT",
781
+ "optional": true,
782
+ "os": [
783
+ "linux"
784
+ ],
785
+ "engines": {
786
+ "node": "^20.19.0 || >=22.12.0"
787
+ }
788
+ },
789
+ "node_modules/@rolldown/binding-openharmony-arm64": {
790
+ "version": "1.0.0-rc.16",
791
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.16.tgz",
792
+ "integrity": "sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==",
793
+ "cpu": [
794
+ "arm64"
795
+ ],
796
+ "dev": true,
797
+ "license": "MIT",
798
+ "optional": true,
799
+ "os": [
800
+ "openharmony"
801
+ ],
802
+ "engines": {
803
+ "node": "^20.19.0 || >=22.12.0"
804
+ }
805
+ },
806
+ "node_modules/@rolldown/binding-wasm32-wasi": {
807
+ "version": "1.0.0-rc.16",
808
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.16.tgz",
809
+ "integrity": "sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==",
810
+ "cpu": [
811
+ "wasm32"
812
+ ],
813
+ "dev": true,
814
+ "license": "MIT",
815
+ "optional": true,
816
+ "dependencies": {
817
+ "@emnapi/core": "1.9.2",
818
+ "@emnapi/runtime": "1.9.2",
819
+ "@napi-rs/wasm-runtime": "^1.1.4"
820
+ },
821
+ "engines": {
822
+ "node": "^20.19.0 || >=22.12.0"
823
+ }
824
+ },
825
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
826
+ "version": "1.0.0-rc.16",
827
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.16.tgz",
828
+ "integrity": "sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==",
829
+ "cpu": [
830
+ "arm64"
831
+ ],
832
+ "dev": true,
833
+ "license": "MIT",
834
+ "optional": true,
835
+ "os": [
836
+ "win32"
837
+ ],
838
+ "engines": {
839
+ "node": "^20.19.0 || >=22.12.0"
840
+ }
841
+ },
842
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
843
+ "version": "1.0.0-rc.16",
844
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.16.tgz",
845
+ "integrity": "sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==",
846
+ "cpu": [
847
+ "x64"
848
+ ],
849
+ "dev": true,
850
+ "license": "MIT",
851
+ "optional": true,
852
+ "os": [
853
+ "win32"
854
+ ],
855
+ "engines": {
856
+ "node": "^20.19.0 || >=22.12.0"
857
+ }
858
+ },
859
+ "node_modules/@rolldown/pluginutils": {
860
+ "version": "1.0.0-rc.7",
861
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz",
862
+ "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==",
863
+ "dev": true,
864
+ "license": "MIT"
865
+ },
866
+ "node_modules/@tybys/wasm-util": {
867
+ "version": "0.10.1",
868
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
869
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
870
+ "dev": true,
871
+ "license": "MIT",
872
+ "optional": true,
873
+ "dependencies": {
874
+ "tslib": "^2.4.0"
875
+ }
876
+ },
877
+ "node_modules/@types/estree": {
878
+ "version": "1.0.8",
879
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
880
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
881
+ "dev": true,
882
+ "license": "MIT"
883
+ },
884
+ "node_modules/@types/json-schema": {
885
+ "version": "7.0.15",
886
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
887
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
888
+ "dev": true,
889
+ "license": "MIT"
890
+ },
891
+ "node_modules/@types/react": {
892
+ "version": "19.2.14",
893
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
894
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
895
+ "dev": true,
896
+ "license": "MIT",
897
+ "dependencies": {
898
+ "csstype": "^3.2.2"
899
+ }
900
+ },
901
+ "node_modules/@types/react-dom": {
902
+ "version": "19.2.3",
903
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
904
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
905
+ "dev": true,
906
+ "license": "MIT",
907
+ "peerDependencies": {
908
+ "@types/react": "^19.2.0"
909
+ }
910
+ },
911
+ "node_modules/@vitejs/plugin-react": {
912
+ "version": "6.0.1",
913
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz",
914
+ "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==",
915
+ "dev": true,
916
+ "license": "MIT",
917
+ "dependencies": {
918
+ "@rolldown/pluginutils": "1.0.0-rc.7"
919
+ },
920
+ "engines": {
921
+ "node": "^20.19.0 || >=22.12.0"
922
+ },
923
+ "peerDependencies": {
924
+ "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
925
+ "babel-plugin-react-compiler": "^1.0.0",
926
+ "vite": "^8.0.0"
927
+ },
928
+ "peerDependenciesMeta": {
929
+ "@rolldown/plugin-babel": {
930
+ "optional": true
931
+ },
932
+ "babel-plugin-react-compiler": {
933
+ "optional": true
934
+ }
935
+ }
936
+ },
937
+ "node_modules/acorn": {
938
+ "version": "8.16.0",
939
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
940
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
941
+ "dev": true,
942
+ "license": "MIT",
943
+ "bin": {
944
+ "acorn": "bin/acorn"
945
+ },
946
+ "engines": {
947
+ "node": ">=0.4.0"
948
+ }
949
+ },
950
+ "node_modules/acorn-jsx": {
951
+ "version": "5.3.2",
952
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
953
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
954
+ "dev": true,
955
+ "license": "MIT",
956
+ "peerDependencies": {
957
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
958
+ }
959
+ },
960
+ "node_modules/ajv": {
961
+ "version": "6.14.0",
962
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
963
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
964
+ "dev": true,
965
+ "license": "MIT",
966
+ "dependencies": {
967
+ "fast-deep-equal": "^3.1.1",
968
+ "fast-json-stable-stringify": "^2.0.0",
969
+ "json-schema-traverse": "^0.4.1",
970
+ "uri-js": "^4.2.2"
971
+ },
972
+ "funding": {
973
+ "type": "github",
974
+ "url": "https://github.com/sponsors/epoberezkin"
975
+ }
976
+ },
977
+ "node_modules/ansi-styles": {
978
+ "version": "4.3.0",
979
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
980
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
981
+ "dev": true,
982
+ "license": "MIT",
983
+ "dependencies": {
984
+ "color-convert": "^2.0.1"
985
+ },
986
+ "engines": {
987
+ "node": ">=8"
988
+ },
989
+ "funding": {
990
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
991
+ }
992
+ },
993
+ "node_modules/argparse": {
994
+ "version": "2.0.1",
995
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
996
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
997
+ "dev": true,
998
+ "license": "Python-2.0"
999
+ },
1000
+ "node_modules/balanced-match": {
1001
+ "version": "1.0.2",
1002
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1003
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1004
+ "dev": true,
1005
+ "license": "MIT"
1006
+ },
1007
+ "node_modules/baseline-browser-mapping": {
1008
+ "version": "2.10.20",
1009
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz",
1010
+ "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==",
1011
+ "dev": true,
1012
+ "license": "Apache-2.0",
1013
+ "bin": {
1014
+ "baseline-browser-mapping": "dist/cli.cjs"
1015
+ },
1016
+ "engines": {
1017
+ "node": ">=6.0.0"
1018
+ }
1019
+ },
1020
+ "node_modules/brace-expansion": {
1021
+ "version": "1.1.14",
1022
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
1023
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
1024
+ "dev": true,
1025
+ "license": "MIT",
1026
+ "dependencies": {
1027
+ "balanced-match": "^1.0.0",
1028
+ "concat-map": "0.0.1"
1029
+ }
1030
+ },
1031
+ "node_modules/browserslist": {
1032
+ "version": "4.28.2",
1033
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
1034
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
1035
+ "dev": true,
1036
+ "funding": [
1037
+ {
1038
+ "type": "opencollective",
1039
+ "url": "https://opencollective.com/browserslist"
1040
+ },
1041
+ {
1042
+ "type": "tidelift",
1043
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1044
+ },
1045
+ {
1046
+ "type": "github",
1047
+ "url": "https://github.com/sponsors/ai"
1048
+ }
1049
+ ],
1050
+ "license": "MIT",
1051
+ "dependencies": {
1052
+ "baseline-browser-mapping": "^2.10.12",
1053
+ "caniuse-lite": "^1.0.30001782",
1054
+ "electron-to-chromium": "^1.5.328",
1055
+ "node-releases": "^2.0.36",
1056
+ "update-browserslist-db": "^1.2.3"
1057
+ },
1058
+ "bin": {
1059
+ "browserslist": "cli.js"
1060
+ },
1061
+ "engines": {
1062
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1063
+ }
1064
+ },
1065
+ "node_modules/callsites": {
1066
+ "version": "3.1.0",
1067
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1068
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1069
+ "dev": true,
1070
+ "license": "MIT",
1071
+ "engines": {
1072
+ "node": ">=6"
1073
+ }
1074
+ },
1075
+ "node_modules/caniuse-lite": {
1076
+ "version": "1.0.30001788",
1077
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz",
1078
+ "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==",
1079
+ "dev": true,
1080
+ "funding": [
1081
+ {
1082
+ "type": "opencollective",
1083
+ "url": "https://opencollective.com/browserslist"
1084
+ },
1085
+ {
1086
+ "type": "tidelift",
1087
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1088
+ },
1089
+ {
1090
+ "type": "github",
1091
+ "url": "https://github.com/sponsors/ai"
1092
+ }
1093
+ ],
1094
+ "license": "CC-BY-4.0"
1095
+ },
1096
+ "node_modules/chalk": {
1097
+ "version": "4.1.2",
1098
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1099
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1100
+ "dev": true,
1101
+ "license": "MIT",
1102
+ "dependencies": {
1103
+ "ansi-styles": "^4.1.0",
1104
+ "supports-color": "^7.1.0"
1105
+ },
1106
+ "engines": {
1107
+ "node": ">=10"
1108
+ },
1109
+ "funding": {
1110
+ "url": "https://github.com/chalk/chalk?sponsor=1"
1111
+ }
1112
+ },
1113
+ "node_modules/color-convert": {
1114
+ "version": "2.0.1",
1115
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1116
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1117
+ "dev": true,
1118
+ "license": "MIT",
1119
+ "dependencies": {
1120
+ "color-name": "~1.1.4"
1121
+ },
1122
+ "engines": {
1123
+ "node": ">=7.0.0"
1124
+ }
1125
+ },
1126
+ "node_modules/color-name": {
1127
+ "version": "1.1.4",
1128
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1129
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1130
+ "dev": true,
1131
+ "license": "MIT"
1132
+ },
1133
+ "node_modules/concat-map": {
1134
+ "version": "0.0.1",
1135
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1136
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1137
+ "dev": true,
1138
+ "license": "MIT"
1139
+ },
1140
+ "node_modules/convert-source-map": {
1141
+ "version": "2.0.0",
1142
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1143
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1144
+ "dev": true,
1145
+ "license": "MIT"
1146
+ },
1147
+ "node_modules/cross-spawn": {
1148
+ "version": "7.0.6",
1149
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1150
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1151
+ "dev": true,
1152
+ "license": "MIT",
1153
+ "dependencies": {
1154
+ "path-key": "^3.1.0",
1155
+ "shebang-command": "^2.0.0",
1156
+ "which": "^2.0.1"
1157
+ },
1158
+ "engines": {
1159
+ "node": ">= 8"
1160
+ }
1161
+ },
1162
+ "node_modules/csstype": {
1163
+ "version": "3.2.3",
1164
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1165
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1166
+ "dev": true,
1167
+ "license": "MIT"
1168
+ },
1169
+ "node_modules/debug": {
1170
+ "version": "4.4.3",
1171
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1172
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1173
+ "dev": true,
1174
+ "license": "MIT",
1175
+ "dependencies": {
1176
+ "ms": "^2.1.3"
1177
+ },
1178
+ "engines": {
1179
+ "node": ">=6.0"
1180
+ },
1181
+ "peerDependenciesMeta": {
1182
+ "supports-color": {
1183
+ "optional": true
1184
+ }
1185
+ }
1186
+ },
1187
+ "node_modules/deep-is": {
1188
+ "version": "0.1.4",
1189
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1190
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1191
+ "dev": true,
1192
+ "license": "MIT"
1193
+ },
1194
+ "node_modules/detect-libc": {
1195
+ "version": "2.1.2",
1196
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
1197
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
1198
+ "dev": true,
1199
+ "license": "Apache-2.0",
1200
+ "engines": {
1201
+ "node": ">=8"
1202
+ }
1203
+ },
1204
+ "node_modules/electron-to-chromium": {
1205
+ "version": "1.5.340",
1206
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz",
1207
+ "integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==",
1208
+ "dev": true,
1209
+ "license": "ISC"
1210
+ },
1211
+ "node_modules/escalade": {
1212
+ "version": "3.2.0",
1213
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1214
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1215
+ "dev": true,
1216
+ "license": "MIT",
1217
+ "engines": {
1218
+ "node": ">=6"
1219
+ }
1220
+ },
1221
+ "node_modules/escape-string-regexp": {
1222
+ "version": "4.0.0",
1223
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1224
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1225
+ "dev": true,
1226
+ "license": "MIT",
1227
+ "engines": {
1228
+ "node": ">=10"
1229
+ },
1230
+ "funding": {
1231
+ "url": "https://github.com/sponsors/sindresorhus"
1232
+ }
1233
+ },
1234
+ "node_modules/eslint": {
1235
+ "version": "9.39.4",
1236
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
1237
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
1238
+ "dev": true,
1239
+ "license": "MIT",
1240
+ "dependencies": {
1241
+ "@eslint-community/eslint-utils": "^4.8.0",
1242
+ "@eslint-community/regexpp": "^4.12.1",
1243
+ "@eslint/config-array": "^0.21.2",
1244
+ "@eslint/config-helpers": "^0.4.2",
1245
+ "@eslint/core": "^0.17.0",
1246
+ "@eslint/eslintrc": "^3.3.5",
1247
+ "@eslint/js": "9.39.4",
1248
+ "@eslint/plugin-kit": "^0.4.1",
1249
+ "@humanfs/node": "^0.16.6",
1250
+ "@humanwhocodes/module-importer": "^1.0.1",
1251
+ "@humanwhocodes/retry": "^0.4.2",
1252
+ "@types/estree": "^1.0.6",
1253
+ "ajv": "^6.14.0",
1254
+ "chalk": "^4.0.0",
1255
+ "cross-spawn": "^7.0.6",
1256
+ "debug": "^4.3.2",
1257
+ "escape-string-regexp": "^4.0.0",
1258
+ "eslint-scope": "^8.4.0",
1259
+ "eslint-visitor-keys": "^4.2.1",
1260
+ "espree": "^10.4.0",
1261
+ "esquery": "^1.5.0",
1262
+ "esutils": "^2.0.2",
1263
+ "fast-deep-equal": "^3.1.3",
1264
+ "file-entry-cache": "^8.0.0",
1265
+ "find-up": "^5.0.0",
1266
+ "glob-parent": "^6.0.2",
1267
+ "ignore": "^5.2.0",
1268
+ "imurmurhash": "^0.1.4",
1269
+ "is-glob": "^4.0.0",
1270
+ "json-stable-stringify-without-jsonify": "^1.0.1",
1271
+ "lodash.merge": "^4.6.2",
1272
+ "minimatch": "^3.1.5",
1273
+ "natural-compare": "^1.4.0",
1274
+ "optionator": "^0.9.3"
1275
+ },
1276
+ "bin": {
1277
+ "eslint": "bin/eslint.js"
1278
+ },
1279
+ "engines": {
1280
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1281
+ },
1282
+ "funding": {
1283
+ "url": "https://eslint.org/donate"
1284
+ },
1285
+ "peerDependencies": {
1286
+ "jiti": "*"
1287
+ },
1288
+ "peerDependenciesMeta": {
1289
+ "jiti": {
1290
+ "optional": true
1291
+ }
1292
+ }
1293
+ },
1294
+ "node_modules/eslint-plugin-react-hooks": {
1295
+ "version": "7.1.1",
1296
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
1297
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
1298
+ "dev": true,
1299
+ "license": "MIT",
1300
+ "dependencies": {
1301
+ "@babel/core": "^7.24.4",
1302
+ "@babel/parser": "^7.24.4",
1303
+ "hermes-parser": "^0.25.1",
1304
+ "zod": "^3.25.0 || ^4.0.0",
1305
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
1306
+ },
1307
+ "engines": {
1308
+ "node": ">=18"
1309
+ },
1310
+ "peerDependencies": {
1311
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
1312
+ }
1313
+ },
1314
+ "node_modules/eslint-plugin-react-refresh": {
1315
+ "version": "0.5.2",
1316
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
1317
+ "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
1318
+ "dev": true,
1319
+ "license": "MIT",
1320
+ "peerDependencies": {
1321
+ "eslint": "^9 || ^10"
1322
+ }
1323
+ },
1324
+ "node_modules/eslint-scope": {
1325
+ "version": "8.4.0",
1326
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
1327
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
1328
+ "dev": true,
1329
+ "license": "BSD-2-Clause",
1330
+ "dependencies": {
1331
+ "esrecurse": "^4.3.0",
1332
+ "estraverse": "^5.2.0"
1333
+ },
1334
+ "engines": {
1335
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1336
+ },
1337
+ "funding": {
1338
+ "url": "https://opencollective.com/eslint"
1339
+ }
1340
+ },
1341
+ "node_modules/eslint-visitor-keys": {
1342
+ "version": "4.2.1",
1343
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
1344
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
1345
+ "dev": true,
1346
+ "license": "Apache-2.0",
1347
+ "engines": {
1348
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1349
+ },
1350
+ "funding": {
1351
+ "url": "https://opencollective.com/eslint"
1352
+ }
1353
+ },
1354
+ "node_modules/espree": {
1355
+ "version": "10.4.0",
1356
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
1357
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
1358
+ "dev": true,
1359
+ "license": "BSD-2-Clause",
1360
+ "dependencies": {
1361
+ "acorn": "^8.15.0",
1362
+ "acorn-jsx": "^5.3.2",
1363
+ "eslint-visitor-keys": "^4.2.1"
1364
+ },
1365
+ "engines": {
1366
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1367
+ },
1368
+ "funding": {
1369
+ "url": "https://opencollective.com/eslint"
1370
+ }
1371
+ },
1372
+ "node_modules/esquery": {
1373
+ "version": "1.7.0",
1374
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
1375
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
1376
+ "dev": true,
1377
+ "license": "BSD-3-Clause",
1378
+ "dependencies": {
1379
+ "estraverse": "^5.1.0"
1380
+ },
1381
+ "engines": {
1382
+ "node": ">=0.10"
1383
+ }
1384
+ },
1385
+ "node_modules/esrecurse": {
1386
+ "version": "4.3.0",
1387
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1388
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1389
+ "dev": true,
1390
+ "license": "BSD-2-Clause",
1391
+ "dependencies": {
1392
+ "estraverse": "^5.2.0"
1393
+ },
1394
+ "engines": {
1395
+ "node": ">=4.0"
1396
+ }
1397
+ },
1398
+ "node_modules/estraverse": {
1399
+ "version": "5.3.0",
1400
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1401
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1402
+ "dev": true,
1403
+ "license": "BSD-2-Clause",
1404
+ "engines": {
1405
+ "node": ">=4.0"
1406
+ }
1407
+ },
1408
+ "node_modules/esutils": {
1409
+ "version": "2.0.3",
1410
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1411
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1412
+ "dev": true,
1413
+ "license": "BSD-2-Clause",
1414
+ "engines": {
1415
+ "node": ">=0.10.0"
1416
+ }
1417
+ },
1418
+ "node_modules/fast-deep-equal": {
1419
+ "version": "3.1.3",
1420
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1421
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1422
+ "dev": true,
1423
+ "license": "MIT"
1424
+ },
1425
+ "node_modules/fast-json-stable-stringify": {
1426
+ "version": "2.1.0",
1427
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1428
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1429
+ "dev": true,
1430
+ "license": "MIT"
1431
+ },
1432
+ "node_modules/fast-levenshtein": {
1433
+ "version": "2.0.6",
1434
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1435
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1436
+ "dev": true,
1437
+ "license": "MIT"
1438
+ },
1439
+ "node_modules/fdir": {
1440
+ "version": "6.5.0",
1441
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1442
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1443
+ "dev": true,
1444
+ "license": "MIT",
1445
+ "engines": {
1446
+ "node": ">=12.0.0"
1447
+ },
1448
+ "peerDependencies": {
1449
+ "picomatch": "^3 || ^4"
1450
+ },
1451
+ "peerDependenciesMeta": {
1452
+ "picomatch": {
1453
+ "optional": true
1454
+ }
1455
+ }
1456
+ },
1457
+ "node_modules/file-entry-cache": {
1458
+ "version": "8.0.0",
1459
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
1460
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
1461
+ "dev": true,
1462
+ "license": "MIT",
1463
+ "dependencies": {
1464
+ "flat-cache": "^4.0.0"
1465
+ },
1466
+ "engines": {
1467
+ "node": ">=16.0.0"
1468
+ }
1469
+ },
1470
+ "node_modules/find-up": {
1471
+ "version": "5.0.0",
1472
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1473
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1474
+ "dev": true,
1475
+ "license": "MIT",
1476
+ "dependencies": {
1477
+ "locate-path": "^6.0.0",
1478
+ "path-exists": "^4.0.0"
1479
+ },
1480
+ "engines": {
1481
+ "node": ">=10"
1482
+ },
1483
+ "funding": {
1484
+ "url": "https://github.com/sponsors/sindresorhus"
1485
+ }
1486
+ },
1487
+ "node_modules/flat-cache": {
1488
+ "version": "4.0.1",
1489
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
1490
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
1491
+ "dev": true,
1492
+ "license": "MIT",
1493
+ "dependencies": {
1494
+ "flatted": "^3.2.9",
1495
+ "keyv": "^4.5.4"
1496
+ },
1497
+ "engines": {
1498
+ "node": ">=16"
1499
+ }
1500
+ },
1501
+ "node_modules/flatted": {
1502
+ "version": "3.4.2",
1503
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
1504
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
1505
+ "dev": true,
1506
+ "license": "ISC"
1507
+ },
1508
+ "node_modules/fsevents": {
1509
+ "version": "2.3.3",
1510
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1511
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1512
+ "dev": true,
1513
+ "hasInstallScript": true,
1514
+ "license": "MIT",
1515
+ "optional": true,
1516
+ "os": [
1517
+ "darwin"
1518
+ ],
1519
+ "engines": {
1520
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1521
+ }
1522
+ },
1523
+ "node_modules/gensync": {
1524
+ "version": "1.0.0-beta.2",
1525
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1526
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1527
+ "dev": true,
1528
+ "license": "MIT",
1529
+ "engines": {
1530
+ "node": ">=6.9.0"
1531
+ }
1532
+ },
1533
+ "node_modules/glob-parent": {
1534
+ "version": "6.0.2",
1535
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1536
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1537
+ "dev": true,
1538
+ "license": "ISC",
1539
+ "dependencies": {
1540
+ "is-glob": "^4.0.3"
1541
+ },
1542
+ "engines": {
1543
+ "node": ">=10.13.0"
1544
+ }
1545
+ },
1546
+ "node_modules/globals": {
1547
+ "version": "17.5.0",
1548
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
1549
+ "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
1550
+ "dev": true,
1551
+ "license": "MIT",
1552
+ "engines": {
1553
+ "node": ">=18"
1554
+ },
1555
+ "funding": {
1556
+ "url": "https://github.com/sponsors/sindresorhus"
1557
+ }
1558
+ },
1559
+ "node_modules/has-flag": {
1560
+ "version": "4.0.0",
1561
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1562
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1563
+ "dev": true,
1564
+ "license": "MIT",
1565
+ "engines": {
1566
+ "node": ">=8"
1567
+ }
1568
+ },
1569
+ "node_modules/hermes-estree": {
1570
+ "version": "0.25.1",
1571
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
1572
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
1573
+ "dev": true,
1574
+ "license": "MIT"
1575
+ },
1576
+ "node_modules/hermes-parser": {
1577
+ "version": "0.25.1",
1578
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
1579
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
1580
+ "dev": true,
1581
+ "license": "MIT",
1582
+ "dependencies": {
1583
+ "hermes-estree": "0.25.1"
1584
+ }
1585
+ },
1586
+ "node_modules/ignore": {
1587
+ "version": "5.3.2",
1588
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
1589
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
1590
+ "dev": true,
1591
+ "license": "MIT",
1592
+ "engines": {
1593
+ "node": ">= 4"
1594
+ }
1595
+ },
1596
+ "node_modules/import-fresh": {
1597
+ "version": "3.3.1",
1598
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
1599
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
1600
+ "dev": true,
1601
+ "license": "MIT",
1602
+ "dependencies": {
1603
+ "parent-module": "^1.0.0",
1604
+ "resolve-from": "^4.0.0"
1605
+ },
1606
+ "engines": {
1607
+ "node": ">=6"
1608
+ },
1609
+ "funding": {
1610
+ "url": "https://github.com/sponsors/sindresorhus"
1611
+ }
1612
+ },
1613
+ "node_modules/imurmurhash": {
1614
+ "version": "0.1.4",
1615
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1616
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
1617
+ "dev": true,
1618
+ "license": "MIT",
1619
+ "engines": {
1620
+ "node": ">=0.8.19"
1621
+ }
1622
+ },
1623
+ "node_modules/is-extglob": {
1624
+ "version": "2.1.1",
1625
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1626
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1627
+ "dev": true,
1628
+ "license": "MIT",
1629
+ "engines": {
1630
+ "node": ">=0.10.0"
1631
+ }
1632
+ },
1633
+ "node_modules/is-glob": {
1634
+ "version": "4.0.3",
1635
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1636
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1637
+ "dev": true,
1638
+ "license": "MIT",
1639
+ "dependencies": {
1640
+ "is-extglob": "^2.1.1"
1641
+ },
1642
+ "engines": {
1643
+ "node": ">=0.10.0"
1644
+ }
1645
+ },
1646
+ "node_modules/isexe": {
1647
+ "version": "2.0.0",
1648
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1649
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1650
+ "dev": true,
1651
+ "license": "ISC"
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",
1656
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1657
+ "dev": true,
1658
+ "license": "MIT"
1659
+ },
1660
+ "node_modules/js-yaml": {
1661
+ "version": "4.1.1",
1662
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
1663
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
1664
+ "dev": true,
1665
+ "license": "MIT",
1666
+ "dependencies": {
1667
+ "argparse": "^2.0.1"
1668
+ },
1669
+ "bin": {
1670
+ "js-yaml": "bin/js-yaml.js"
1671
+ }
1672
+ },
1673
+ "node_modules/jsesc": {
1674
+ "version": "3.1.0",
1675
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1676
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1677
+ "dev": true,
1678
+ "license": "MIT",
1679
+ "bin": {
1680
+ "jsesc": "bin/jsesc"
1681
+ },
1682
+ "engines": {
1683
+ "node": ">=6"
1684
+ }
1685
+ },
1686
+ "node_modules/json-buffer": {
1687
+ "version": "3.0.1",
1688
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
1689
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
1690
+ "dev": true,
1691
+ "license": "MIT"
1692
+ },
1693
+ "node_modules/json-schema-traverse": {
1694
+ "version": "0.4.1",
1695
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1696
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1697
+ "dev": true,
1698
+ "license": "MIT"
1699
+ },
1700
+ "node_modules/json-stable-stringify-without-jsonify": {
1701
+ "version": "1.0.1",
1702
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1703
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1704
+ "dev": true,
1705
+ "license": "MIT"
1706
+ },
1707
+ "node_modules/json5": {
1708
+ "version": "2.2.3",
1709
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1710
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1711
+ "dev": true,
1712
+ "license": "MIT",
1713
+ "bin": {
1714
+ "json5": "lib/cli.js"
1715
+ },
1716
+ "engines": {
1717
+ "node": ">=6"
1718
+ }
1719
+ },
1720
+ "node_modules/keyv": {
1721
+ "version": "4.5.4",
1722
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
1723
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
1724
+ "dev": true,
1725
+ "license": "MIT",
1726
+ "dependencies": {
1727
+ "json-buffer": "3.0.1"
1728
+ }
1729
+ },
1730
+ "node_modules/levn": {
1731
+ "version": "0.4.1",
1732
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1733
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1734
+ "dev": true,
1735
+ "license": "MIT",
1736
+ "dependencies": {
1737
+ "prelude-ls": "^1.2.1",
1738
+ "type-check": "~0.4.0"
1739
+ },
1740
+ "engines": {
1741
+ "node": ">= 0.8.0"
1742
+ }
1743
+ },
1744
+ "node_modules/lightningcss": {
1745
+ "version": "1.32.0",
1746
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
1747
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
1748
+ "dev": true,
1749
+ "license": "MPL-2.0",
1750
+ "dependencies": {
1751
+ "detect-libc": "^2.0.3"
1752
+ },
1753
+ "engines": {
1754
+ "node": ">= 12.0.0"
1755
+ },
1756
+ "funding": {
1757
+ "type": "opencollective",
1758
+ "url": "https://opencollective.com/parcel"
1759
+ },
1760
+ "optionalDependencies": {
1761
+ "lightningcss-android-arm64": "1.32.0",
1762
+ "lightningcss-darwin-arm64": "1.32.0",
1763
+ "lightningcss-darwin-x64": "1.32.0",
1764
+ "lightningcss-freebsd-x64": "1.32.0",
1765
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
1766
+ "lightningcss-linux-arm64-gnu": "1.32.0",
1767
+ "lightningcss-linux-arm64-musl": "1.32.0",
1768
+ "lightningcss-linux-x64-gnu": "1.32.0",
1769
+ "lightningcss-linux-x64-musl": "1.32.0",
1770
+ "lightningcss-win32-arm64-msvc": "1.32.0",
1771
+ "lightningcss-win32-x64-msvc": "1.32.0"
1772
+ }
1773
+ },
1774
+ "node_modules/lightningcss-android-arm64": {
1775
+ "version": "1.32.0",
1776
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
1777
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
1778
+ "cpu": [
1779
+ "arm64"
1780
+ ],
1781
+ "dev": true,
1782
+ "license": "MPL-2.0",
1783
+ "optional": true,
1784
+ "os": [
1785
+ "android"
1786
+ ],
1787
+ "engines": {
1788
+ "node": ">= 12.0.0"
1789
+ },
1790
+ "funding": {
1791
+ "type": "opencollective",
1792
+ "url": "https://opencollective.com/parcel"
1793
+ }
1794
+ },
1795
+ "node_modules/lightningcss-darwin-arm64": {
1796
+ "version": "1.32.0",
1797
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
1798
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
1799
+ "cpu": [
1800
+ "arm64"
1801
+ ],
1802
+ "dev": true,
1803
+ "license": "MPL-2.0",
1804
+ "optional": true,
1805
+ "os": [
1806
+ "darwin"
1807
+ ],
1808
+ "engines": {
1809
+ "node": ">= 12.0.0"
1810
+ },
1811
+ "funding": {
1812
+ "type": "opencollective",
1813
+ "url": "https://opencollective.com/parcel"
1814
+ }
1815
+ },
1816
+ "node_modules/lightningcss-darwin-x64": {
1817
+ "version": "1.32.0",
1818
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
1819
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
1820
+ "cpu": [
1821
+ "x64"
1822
+ ],
1823
+ "dev": true,
1824
+ "license": "MPL-2.0",
1825
+ "optional": true,
1826
+ "os": [
1827
+ "darwin"
1828
+ ],
1829
+ "engines": {
1830
+ "node": ">= 12.0.0"
1831
+ },
1832
+ "funding": {
1833
+ "type": "opencollective",
1834
+ "url": "https://opencollective.com/parcel"
1835
+ }
1836
+ },
1837
+ "node_modules/lightningcss-freebsd-x64": {
1838
+ "version": "1.32.0",
1839
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
1840
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
1841
+ "cpu": [
1842
+ "x64"
1843
+ ],
1844
+ "dev": true,
1845
+ "license": "MPL-2.0",
1846
+ "optional": true,
1847
+ "os": [
1848
+ "freebsd"
1849
+ ],
1850
+ "engines": {
1851
+ "node": ">= 12.0.0"
1852
+ },
1853
+ "funding": {
1854
+ "type": "opencollective",
1855
+ "url": "https://opencollective.com/parcel"
1856
+ }
1857
+ },
1858
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
1859
+ "version": "1.32.0",
1860
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
1861
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
1862
+ "cpu": [
1863
+ "arm"
1864
+ ],
1865
+ "dev": true,
1866
+ "license": "MPL-2.0",
1867
+ "optional": true,
1868
+ "os": [
1869
+ "linux"
1870
+ ],
1871
+ "engines": {
1872
+ "node": ">= 12.0.0"
1873
+ },
1874
+ "funding": {
1875
+ "type": "opencollective",
1876
+ "url": "https://opencollective.com/parcel"
1877
+ }
1878
+ },
1879
+ "node_modules/lightningcss-linux-arm64-gnu": {
1880
+ "version": "1.32.0",
1881
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
1882
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
1883
+ "cpu": [
1884
+ "arm64"
1885
+ ],
1886
+ "dev": true,
1887
+ "license": "MPL-2.0",
1888
+ "optional": true,
1889
+ "os": [
1890
+ "linux"
1891
+ ],
1892
+ "engines": {
1893
+ "node": ">= 12.0.0"
1894
+ },
1895
+ "funding": {
1896
+ "type": "opencollective",
1897
+ "url": "https://opencollective.com/parcel"
1898
+ }
1899
+ },
1900
+ "node_modules/lightningcss-linux-arm64-musl": {
1901
+ "version": "1.32.0",
1902
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
1903
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
1904
+ "cpu": [
1905
+ "arm64"
1906
+ ],
1907
+ "dev": true,
1908
+ "license": "MPL-2.0",
1909
+ "optional": true,
1910
+ "os": [
1911
+ "linux"
1912
+ ],
1913
+ "engines": {
1914
+ "node": ">= 12.0.0"
1915
+ },
1916
+ "funding": {
1917
+ "type": "opencollective",
1918
+ "url": "https://opencollective.com/parcel"
1919
+ }
1920
+ },
1921
+ "node_modules/lightningcss-linux-x64-gnu": {
1922
+ "version": "1.32.0",
1923
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
1924
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
1925
+ "cpu": [
1926
+ "x64"
1927
+ ],
1928
+ "dev": true,
1929
+ "license": "MPL-2.0",
1930
+ "optional": true,
1931
+ "os": [
1932
+ "linux"
1933
+ ],
1934
+ "engines": {
1935
+ "node": ">= 12.0.0"
1936
+ },
1937
+ "funding": {
1938
+ "type": "opencollective",
1939
+ "url": "https://opencollective.com/parcel"
1940
+ }
1941
+ },
1942
+ "node_modules/lightningcss-linux-x64-musl": {
1943
+ "version": "1.32.0",
1944
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
1945
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
1946
+ "cpu": [
1947
+ "x64"
1948
+ ],
1949
+ "dev": true,
1950
+ "license": "MPL-2.0",
1951
+ "optional": true,
1952
+ "os": [
1953
+ "linux"
1954
+ ],
1955
+ "engines": {
1956
+ "node": ">= 12.0.0"
1957
+ },
1958
+ "funding": {
1959
+ "type": "opencollective",
1960
+ "url": "https://opencollective.com/parcel"
1961
+ }
1962
+ },
1963
+ "node_modules/lightningcss-win32-arm64-msvc": {
1964
+ "version": "1.32.0",
1965
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
1966
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
1967
+ "cpu": [
1968
+ "arm64"
1969
+ ],
1970
+ "dev": true,
1971
+ "license": "MPL-2.0",
1972
+ "optional": true,
1973
+ "os": [
1974
+ "win32"
1975
+ ],
1976
+ "engines": {
1977
+ "node": ">= 12.0.0"
1978
+ },
1979
+ "funding": {
1980
+ "type": "opencollective",
1981
+ "url": "https://opencollective.com/parcel"
1982
+ }
1983
+ },
1984
+ "node_modules/lightningcss-win32-x64-msvc": {
1985
+ "version": "1.32.0",
1986
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
1987
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
1988
+ "cpu": [
1989
+ "x64"
1990
+ ],
1991
+ "dev": true,
1992
+ "license": "MPL-2.0",
1993
+ "optional": true,
1994
+ "os": [
1995
+ "win32"
1996
+ ],
1997
+ "engines": {
1998
+ "node": ">= 12.0.0"
1999
+ },
2000
+ "funding": {
2001
+ "type": "opencollective",
2002
+ "url": "https://opencollective.com/parcel"
2003
+ }
2004
+ },
2005
+ "node_modules/locate-path": {
2006
+ "version": "6.0.0",
2007
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2008
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2009
+ "dev": true,
2010
+ "license": "MIT",
2011
+ "dependencies": {
2012
+ "p-locate": "^5.0.0"
2013
+ },
2014
+ "engines": {
2015
+ "node": ">=10"
2016
+ },
2017
+ "funding": {
2018
+ "url": "https://github.com/sponsors/sindresorhus"
2019
+ }
2020
+ },
2021
+ "node_modules/lodash.merge": {
2022
+ "version": "4.6.2",
2023
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2024
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2025
+ "dev": true,
2026
+ "license": "MIT"
2027
+ },
2028
+ "node_modules/lru-cache": {
2029
+ "version": "5.1.1",
2030
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2031
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2032
+ "dev": true,
2033
+ "license": "ISC",
2034
+ "dependencies": {
2035
+ "yallist": "^3.0.2"
2036
+ }
2037
+ },
2038
+ "node_modules/minimatch": {
2039
+ "version": "3.1.5",
2040
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
2041
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
2042
+ "dev": true,
2043
+ "license": "ISC",
2044
+ "dependencies": {
2045
+ "brace-expansion": "^1.1.7"
2046
+ },
2047
+ "engines": {
2048
+ "node": "*"
2049
+ }
2050
+ },
2051
+ "node_modules/ms": {
2052
+ "version": "2.1.3",
2053
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2054
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2055
+ "dev": true,
2056
+ "license": "MIT"
2057
+ },
2058
+ "node_modules/nanoid": {
2059
+ "version": "3.3.11",
2060
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
2061
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
2062
+ "dev": true,
2063
+ "funding": [
2064
+ {
2065
+ "type": "github",
2066
+ "url": "https://github.com/sponsors/ai"
2067
+ }
2068
+ ],
2069
+ "license": "MIT",
2070
+ "bin": {
2071
+ "nanoid": "bin/nanoid.cjs"
2072
+ },
2073
+ "engines": {
2074
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2075
+ }
2076
+ },
2077
+ "node_modules/natural-compare": {
2078
+ "version": "1.4.0",
2079
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2080
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2081
+ "dev": true,
2082
+ "license": "MIT"
2083
+ },
2084
+ "node_modules/node-releases": {
2085
+ "version": "2.0.37",
2086
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
2087
+ "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
2088
+ "dev": true,
2089
+ "license": "MIT"
2090
+ },
2091
+ "node_modules/optionator": {
2092
+ "version": "0.9.4",
2093
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
2094
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
2095
+ "dev": true,
2096
+ "license": "MIT",
2097
+ "dependencies": {
2098
+ "deep-is": "^0.1.3",
2099
+ "fast-levenshtein": "^2.0.6",
2100
+ "levn": "^0.4.1",
2101
+ "prelude-ls": "^1.2.1",
2102
+ "type-check": "^0.4.0",
2103
+ "word-wrap": "^1.2.5"
2104
+ },
2105
+ "engines": {
2106
+ "node": ">= 0.8.0"
2107
+ }
2108
+ },
2109
+ "node_modules/p-limit": {
2110
+ "version": "3.1.0",
2111
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2112
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2113
+ "dev": true,
2114
+ "license": "MIT",
2115
+ "dependencies": {
2116
+ "yocto-queue": "^0.1.0"
2117
+ },
2118
+ "engines": {
2119
+ "node": ">=10"
2120
+ },
2121
+ "funding": {
2122
+ "url": "https://github.com/sponsors/sindresorhus"
2123
+ }
2124
+ },
2125
+ "node_modules/p-locate": {
2126
+ "version": "5.0.0",
2127
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2128
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2129
+ "dev": true,
2130
+ "license": "MIT",
2131
+ "dependencies": {
2132
+ "p-limit": "^3.0.2"
2133
+ },
2134
+ "engines": {
2135
+ "node": ">=10"
2136
+ },
2137
+ "funding": {
2138
+ "url": "https://github.com/sponsors/sindresorhus"
2139
+ }
2140
+ },
2141
+ "node_modules/parent-module": {
2142
+ "version": "1.0.1",
2143
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2144
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2145
+ "dev": true,
2146
+ "license": "MIT",
2147
+ "dependencies": {
2148
+ "callsites": "^3.0.0"
2149
+ },
2150
+ "engines": {
2151
+ "node": ">=6"
2152
+ }
2153
+ },
2154
+ "node_modules/path-exists": {
2155
+ "version": "4.0.0",
2156
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2157
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2158
+ "dev": true,
2159
+ "license": "MIT",
2160
+ "engines": {
2161
+ "node": ">=8"
2162
+ }
2163
+ },
2164
+ "node_modules/path-key": {
2165
+ "version": "3.1.1",
2166
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2167
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2168
+ "dev": true,
2169
+ "license": "MIT",
2170
+ "engines": {
2171
+ "node": ">=8"
2172
+ }
2173
+ },
2174
+ "node_modules/picocolors": {
2175
+ "version": "1.1.1",
2176
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2177
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2178
+ "dev": true,
2179
+ "license": "ISC"
2180
+ },
2181
+ "node_modules/picomatch": {
2182
+ "version": "4.0.4",
2183
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
2184
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
2185
+ "dev": true,
2186
+ "license": "MIT",
2187
+ "engines": {
2188
+ "node": ">=12"
2189
+ },
2190
+ "funding": {
2191
+ "url": "https://github.com/sponsors/jonschlinkert"
2192
+ }
2193
+ },
2194
+ "node_modules/postcss": {
2195
+ "version": "8.5.10",
2196
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
2197
+ "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
2198
+ "dev": true,
2199
+ "funding": [
2200
+ {
2201
+ "type": "opencollective",
2202
+ "url": "https://opencollective.com/postcss/"
2203
+ },
2204
+ {
2205
+ "type": "tidelift",
2206
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2207
+ },
2208
+ {
2209
+ "type": "github",
2210
+ "url": "https://github.com/sponsors/ai"
2211
+ }
2212
+ ],
2213
+ "license": "MIT",
2214
+ "dependencies": {
2215
+ "nanoid": "^3.3.11",
2216
+ "picocolors": "^1.1.1",
2217
+ "source-map-js": "^1.2.1"
2218
+ },
2219
+ "engines": {
2220
+ "node": "^10 || ^12 || >=14"
2221
+ }
2222
+ },
2223
+ "node_modules/prelude-ls": {
2224
+ "version": "1.2.1",
2225
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2226
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2227
+ "dev": true,
2228
+ "license": "MIT",
2229
+ "engines": {
2230
+ "node": ">= 0.8.0"
2231
+ }
2232
+ },
2233
+ "node_modules/punycode": {
2234
+ "version": "2.3.1",
2235
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2236
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2237
+ "dev": true,
2238
+ "license": "MIT",
2239
+ "engines": {
2240
+ "node": ">=6"
2241
+ }
2242
+ },
2243
+ "node_modules/react": {
2244
+ "version": "19.2.5",
2245
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz",
2246
+ "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==",
2247
+ "license": "MIT",
2248
+ "engines": {
2249
+ "node": ">=0.10.0"
2250
+ }
2251
+ },
2252
+ "node_modules/react-dom": {
2253
+ "version": "19.2.5",
2254
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz",
2255
+ "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==",
2256
+ "license": "MIT",
2257
+ "dependencies": {
2258
+ "scheduler": "^0.27.0"
2259
+ },
2260
+ "peerDependencies": {
2261
+ "react": "^19.2.5"
2262
+ }
2263
+ },
2264
+ "node_modules/resolve-from": {
2265
+ "version": "4.0.0",
2266
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2267
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2268
+ "dev": true,
2269
+ "license": "MIT",
2270
+ "engines": {
2271
+ "node": ">=4"
2272
+ }
2273
+ },
2274
+ "node_modules/rolldown": {
2275
+ "version": "1.0.0-rc.16",
2276
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.16.tgz",
2277
+ "integrity": "sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==",
2278
+ "dev": true,
2279
+ "license": "MIT",
2280
+ "dependencies": {
2281
+ "@oxc-project/types": "=0.126.0",
2282
+ "@rolldown/pluginutils": "1.0.0-rc.16"
2283
+ },
2284
+ "bin": {
2285
+ "rolldown": "bin/cli.mjs"
2286
+ },
2287
+ "engines": {
2288
+ "node": "^20.19.0 || >=22.12.0"
2289
+ },
2290
+ "optionalDependencies": {
2291
+ "@rolldown/binding-android-arm64": "1.0.0-rc.16",
2292
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.16",
2293
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.16",
2294
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.16",
2295
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.16",
2296
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.16",
2297
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.16",
2298
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.16",
2299
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.16",
2300
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.16",
2301
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.16",
2302
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.16",
2303
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.16",
2304
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.16",
2305
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.16"
2306
+ }
2307
+ },
2308
+ "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
2309
+ "version": "1.0.0-rc.16",
2310
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.16.tgz",
2311
+ "integrity": "sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==",
2312
+ "dev": true,
2313
+ "license": "MIT"
2314
+ },
2315
+ "node_modules/scheduler": {
2316
+ "version": "0.27.0",
2317
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
2318
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
2319
+ "license": "MIT"
2320
+ },
2321
+ "node_modules/semver": {
2322
+ "version": "6.3.1",
2323
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2324
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2325
+ "dev": true,
2326
+ "license": "ISC",
2327
+ "bin": {
2328
+ "semver": "bin/semver.js"
2329
+ }
2330
+ },
2331
+ "node_modules/shebang-command": {
2332
+ "version": "2.0.0",
2333
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2334
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2335
+ "dev": true,
2336
+ "license": "MIT",
2337
+ "dependencies": {
2338
+ "shebang-regex": "^3.0.0"
2339
+ },
2340
+ "engines": {
2341
+ "node": ">=8"
2342
+ }
2343
+ },
2344
+ "node_modules/shebang-regex": {
2345
+ "version": "3.0.0",
2346
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2347
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2348
+ "dev": true,
2349
+ "license": "MIT",
2350
+ "engines": {
2351
+ "node": ">=8"
2352
+ }
2353
+ },
2354
+ "node_modules/source-map-js": {
2355
+ "version": "1.2.1",
2356
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2357
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2358
+ "dev": true,
2359
+ "license": "BSD-3-Clause",
2360
+ "engines": {
2361
+ "node": ">=0.10.0"
2362
+ }
2363
+ },
2364
+ "node_modules/strip-json-comments": {
2365
+ "version": "3.1.1",
2366
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2367
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2368
+ "dev": true,
2369
+ "license": "MIT",
2370
+ "engines": {
2371
+ "node": ">=8"
2372
+ },
2373
+ "funding": {
2374
+ "url": "https://github.com/sponsors/sindresorhus"
2375
+ }
2376
+ },
2377
+ "node_modules/supports-color": {
2378
+ "version": "7.2.0",
2379
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2380
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2381
+ "dev": true,
2382
+ "license": "MIT",
2383
+ "dependencies": {
2384
+ "has-flag": "^4.0.0"
2385
+ },
2386
+ "engines": {
2387
+ "node": ">=8"
2388
+ }
2389
+ },
2390
+ "node_modules/tinyglobby": {
2391
+ "version": "0.2.16",
2392
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
2393
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
2394
+ "dev": true,
2395
+ "license": "MIT",
2396
+ "dependencies": {
2397
+ "fdir": "^6.5.0",
2398
+ "picomatch": "^4.0.4"
2399
+ },
2400
+ "engines": {
2401
+ "node": ">=12.0.0"
2402
+ },
2403
+ "funding": {
2404
+ "url": "https://github.com/sponsors/SuperchupuDev"
2405
+ }
2406
+ },
2407
+ "node_modules/tslib": {
2408
+ "version": "2.8.1",
2409
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2410
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2411
+ "dev": true,
2412
+ "license": "0BSD",
2413
+ "optional": true
2414
+ },
2415
+ "node_modules/type-check": {
2416
+ "version": "0.4.0",
2417
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2418
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2419
+ "dev": true,
2420
+ "license": "MIT",
2421
+ "dependencies": {
2422
+ "prelude-ls": "^1.2.1"
2423
+ },
2424
+ "engines": {
2425
+ "node": ">= 0.8.0"
2426
+ }
2427
+ },
2428
+ "node_modules/update-browserslist-db": {
2429
+ "version": "1.2.3",
2430
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
2431
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
2432
+ "dev": true,
2433
+ "funding": [
2434
+ {
2435
+ "type": "opencollective",
2436
+ "url": "https://opencollective.com/browserslist"
2437
+ },
2438
+ {
2439
+ "type": "tidelift",
2440
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2441
+ },
2442
+ {
2443
+ "type": "github",
2444
+ "url": "https://github.com/sponsors/ai"
2445
+ }
2446
+ ],
2447
+ "license": "MIT",
2448
+ "dependencies": {
2449
+ "escalade": "^3.2.0",
2450
+ "picocolors": "^1.1.1"
2451
+ },
2452
+ "bin": {
2453
+ "update-browserslist-db": "cli.js"
2454
+ },
2455
+ "peerDependencies": {
2456
+ "browserslist": ">= 4.21.0"
2457
+ }
2458
+ },
2459
+ "node_modules/uri-js": {
2460
+ "version": "4.4.1",
2461
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2462
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2463
+ "dev": true,
2464
+ "license": "BSD-2-Clause",
2465
+ "dependencies": {
2466
+ "punycode": "^2.1.0"
2467
+ }
2468
+ },
2469
+ "node_modules/vite": {
2470
+ "version": "8.0.9",
2471
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.9.tgz",
2472
+ "integrity": "sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==",
2473
+ "dev": true,
2474
+ "license": "MIT",
2475
+ "dependencies": {
2476
+ "lightningcss": "^1.32.0",
2477
+ "picomatch": "^4.0.4",
2478
+ "postcss": "^8.5.10",
2479
+ "rolldown": "1.0.0-rc.16",
2480
+ "tinyglobby": "^0.2.16"
2481
+ },
2482
+ "bin": {
2483
+ "vite": "bin/vite.js"
2484
+ },
2485
+ "engines": {
2486
+ "node": "^20.19.0 || >=22.12.0"
2487
+ },
2488
+ "funding": {
2489
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2490
+ },
2491
+ "optionalDependencies": {
2492
+ "fsevents": "~2.3.3"
2493
+ },
2494
+ "peerDependencies": {
2495
+ "@types/node": "^20.19.0 || >=22.12.0",
2496
+ "@vitejs/devtools": "^0.1.0",
2497
+ "esbuild": "^0.27.0 || ^0.28.0",
2498
+ "jiti": ">=1.21.0",
2499
+ "less": "^4.0.0",
2500
+ "sass": "^1.70.0",
2501
+ "sass-embedded": "^1.70.0",
2502
+ "stylus": ">=0.54.8",
2503
+ "sugarss": "^5.0.0",
2504
+ "terser": "^5.16.0",
2505
+ "tsx": "^4.8.1",
2506
+ "yaml": "^2.4.2"
2507
+ },
2508
+ "peerDependenciesMeta": {
2509
+ "@types/node": {
2510
+ "optional": true
2511
+ },
2512
+ "@vitejs/devtools": {
2513
+ "optional": true
2514
+ },
2515
+ "esbuild": {
2516
+ "optional": true
2517
+ },
2518
+ "jiti": {
2519
+ "optional": true
2520
+ },
2521
+ "less": {
2522
+ "optional": true
2523
+ },
2524
+ "sass": {
2525
+ "optional": true
2526
+ },
2527
+ "sass-embedded": {
2528
+ "optional": true
2529
+ },
2530
+ "stylus": {
2531
+ "optional": true
2532
+ },
2533
+ "sugarss": {
2534
+ "optional": true
2535
+ },
2536
+ "terser": {
2537
+ "optional": true
2538
+ },
2539
+ "tsx": {
2540
+ "optional": true
2541
+ },
2542
+ "yaml": {
2543
+ "optional": true
2544
+ }
2545
+ }
2546
+ },
2547
+ "node_modules/which": {
2548
+ "version": "2.0.2",
2549
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2550
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2551
+ "dev": true,
2552
+ "license": "ISC",
2553
+ "dependencies": {
2554
+ "isexe": "^2.0.0"
2555
+ },
2556
+ "bin": {
2557
+ "node-which": "bin/node-which"
2558
+ },
2559
+ "engines": {
2560
+ "node": ">= 8"
2561
+ }
2562
+ },
2563
+ "node_modules/word-wrap": {
2564
+ "version": "1.2.5",
2565
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
2566
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
2567
+ "dev": true,
2568
+ "license": "MIT",
2569
+ "engines": {
2570
+ "node": ">=0.10.0"
2571
+ }
2572
+ },
2573
+ "node_modules/yallist": {
2574
+ "version": "3.1.1",
2575
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2576
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2577
+ "dev": true,
2578
+ "license": "ISC"
2579
+ },
2580
+ "node_modules/yocto-queue": {
2581
+ "version": "0.1.0",
2582
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2583
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2584
+ "dev": true,
2585
+ "license": "MIT",
2586
+ "engines": {
2587
+ "node": ">=10"
2588
+ },
2589
+ "funding": {
2590
+ "url": "https://github.com/sponsors/sindresorhus"
2591
+ }
2592
+ },
2593
+ "node_modules/zod": {
2594
+ "version": "4.3.6",
2595
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
2596
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
2597
+ "dev": true,
2598
+ "license": "MIT",
2599
+ "funding": {
2600
+ "url": "https://github.com/sponsors/colinhacks"
2601
+ }
2602
+ },
2603
+ "node_modules/zod-validation-error": {
2604
+ "version": "4.0.2",
2605
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
2606
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
2607
+ "dev": true,
2608
+ "license": "MIT",
2609
+ "engines": {
2610
+ "node": ">=18.0.0"
2611
+ },
2612
+ "peerDependencies": {
2613
+ "zod": "^3.25.0 || ^4.0.0"
2614
+ }
2615
+ }
2616
+ }
2617
+ }
frontend/package.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "frontend",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "react": "^19.2.5",
14
+ "react-dom": "^19.2.5"
15
+ },
16
+ "devDependencies": {
17
+ "@eslint/js": "^9.39.4",
18
+ "@types/react": "^19.2.14",
19
+ "@types/react-dom": "^19.2.3",
20
+ "@vitejs/plugin-react": "^6.0.1",
21
+ "eslint": "^9.39.4",
22
+ "eslint-plugin-react-hooks": "^7.1.1",
23
+ "eslint-plugin-react-refresh": "^0.5.2",
24
+ "globals": "^17.5.0",
25
+ "vite": "^8.0.9"
26
+ }
27
+ }
frontend/public/favicon.svg ADDED
frontend/public/icons.svg ADDED
frontend/src/App.css ADDED
@@ -0,0 +1,1206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@600;700;800&display=swap");
2
+
3
+ /* ==================== LAYOUT & STRUCTURE ==================== */
4
+
5
+ .app-container {
6
+ display: flex;
7
+ flex-direction: column;
8
+ min-height: 100vh;
9
+ background: var(--bg-gradient);
10
+ color: var(--text-primary);
11
+ font-family: var(--body-font);
12
+ overflow-x: hidden;
13
+ }
14
+
15
+ .app-header {
16
+ padding: 32px 20px;
17
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.1), rgba(139, 92, 246, 0.1));
18
+ border-bottom: 1px solid var(--border-light);
19
+ position: relative;
20
+ animation: slideDown 600ms ease-out;
21
+ }
22
+
23
+ .header-content {
24
+ max-width: 1200px;
25
+ margin: 0 auto;
26
+ }
27
+
28
+ .logo-section {
29
+ display: flex;
30
+ align-items: center;
31
+ gap: 12px;
32
+ margin-bottom: 8px;
33
+ }
34
+
35
+ .logo-icon {
36
+ font-size: 28px;
37
+ animation: float 3s ease-in-out infinite;
38
+ }
39
+
40
+ .app-title {
41
+ font-size: 24px;
42
+ font-weight: 700;
43
+ margin: 0;
44
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
45
+ -webkit-background-clip: text;
46
+ -webkit-text-fill-color: transparent;
47
+ background-clip: text;
48
+ }
49
+
50
+ .brand-image {
51
+ width: 64px;
52
+ height: 28px;
53
+ border-radius: 8px;
54
+ background:
55
+ linear-gradient(90deg, rgba(17, 24, 39, 0.75) 0 50%, rgba(59, 130, 246, 0.35) 50% 100%);
56
+ border: 1px solid rgba(59, 130, 246, 0.35);
57
+ box-shadow: 0 6px 18px rgba(15, 23, 42, 0.25);
58
+ position: relative;
59
+ overflow: hidden;
60
+ }
61
+
62
+ .brand-image::after {
63
+ content: "";
64
+ position: absolute;
65
+ top: 0;
66
+ bottom: 0;
67
+ left: 50%;
68
+ width: 2px;
69
+ background: rgba(255, 255, 255, 0.65);
70
+ transform: translateX(-1px);
71
+ }
72
+
73
+ .app-tagline {
74
+ margin: 0;
75
+ color: var(--text-secondary);
76
+ font-size: 14px;
77
+ font-weight: 500;
78
+ }
79
+
80
+ .app-shell {
81
+ flex: 1;
82
+ max-width: 1100px;
83
+ width: 100%;
84
+ margin: 0 auto;
85
+ padding: 48px 24px;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 40px;
89
+ }
90
+
91
+ /* ==================== HERO SECTION ==================== */
92
+
93
+ .hero-section {
94
+ text-align: center;
95
+ animation: slideUp 600ms ease-out;
96
+ }
97
+
98
+ .hero-content {
99
+ max-width: 700px;
100
+ margin: 0 auto;
101
+ }
102
+
103
+ .eyebrow {
104
+ text-transform: uppercase;
105
+ letter-spacing: 0.12em;
106
+ font-size: 12px;
107
+ font-weight: 700;
108
+ color: #3b82f6;
109
+ margin: 0 0 12px;
110
+ animation: slideUp 600ms ease-out backwards;
111
+ animation-delay: 50ms;
112
+ }
113
+
114
+ .hero-title {
115
+ font-size: clamp(28px, 6vw, 48px);
116
+ font-weight: 800;
117
+ letter-spacing: -0.02em;
118
+ line-height: 1.1;
119
+ margin: 0 0 16px;
120
+ background: linear-gradient(135deg, #1e293b, #3b82f6);
121
+ -webkit-background-clip: text;
122
+ -webkit-text-fill-color: transparent;
123
+ background-clip: text;
124
+ animation: slideUp 600ms ease-out 100ms both;
125
+ }
126
+
127
+ .hero-description {
128
+ font-size: 16px;
129
+ line-height: 1.6;
130
+ color: var(--text-secondary);
131
+ margin: 0 0 24px;
132
+ animation: slideUp 600ms ease-out 200ms both;
133
+ }
134
+
135
+ .feature-pills {
136
+ display: flex;
137
+ gap: 12px;
138
+ justify-content: center;
139
+ flex-wrap: wrap;
140
+ margin-top: 28px;
141
+ }
142
+
143
+ /* ==================== LOSSES SECTION ==================== */
144
+
145
+ .losses-section {
146
+ background: rgba(15, 23, 42, 0.85);
147
+ border: 1px solid rgba(148, 163, 184, 0.2);
148
+ border-radius: 18px;
149
+ padding: 22px;
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: 16px;
153
+ animation: slideUp 600ms ease-out 120ms both;
154
+ }
155
+
156
+ .losses-header h3 {
157
+ margin: 0;
158
+ font-size: 18px;
159
+ font-weight: 700;
160
+ color: #f8fafc;
161
+ }
162
+
163
+ .losses-subtitle {
164
+ margin: 6px 0 0;
165
+ font-size: 13px;
166
+ color: rgba(226, 232, 240, 0.75);
167
+ }
168
+
169
+ .loss-grid {
170
+ display: grid;
171
+ grid-template-columns: repeat(2, minmax(0, 1fr));
172
+ gap: 16px;
173
+ }
174
+
175
+ .loss-card {
176
+ padding: 16px;
177
+ border-radius: 12px;
178
+ background: rgba(15, 23, 42, 0.85);
179
+ border: 1px solid rgba(148, 163, 184, 0.25);
180
+ display: flex;
181
+ flex-direction: column;
182
+ gap: 8px;
183
+ box-shadow: 0 12px 30px -24px rgba(15, 23, 42, 0.75);
184
+ }
185
+
186
+ .loss-name {
187
+ font-size: 12px;
188
+ font-weight: 700;
189
+ letter-spacing: 0.08em;
190
+ text-transform: uppercase;
191
+ color: #7dd3fc;
192
+ }
193
+
194
+ .loss-value {
195
+ font-size: 15px;
196
+ font-weight: 700;
197
+ color: #f8fafc;
198
+ }
199
+
200
+ .loss-desc {
201
+ margin: 0;
202
+ font-size: 12px;
203
+ color: rgba(226, 232, 240, 0.8);
204
+ line-height: 1.5;
205
+ }
206
+
207
+ .pill {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ gap: 6px;
211
+ padding: 8px 16px;
212
+ background: rgba(59, 130, 246, 0.1);
213
+ border: 1px solid var(--border-light);
214
+ border-radius: 20px;
215
+ font-size: 13px;
216
+ font-weight: 500;
217
+ color: #3b82f6;
218
+ transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
219
+ animation: slideUp 600ms ease-out backwards;
220
+ }
221
+
222
+ .pill:nth-child(1) { animation-delay: 300ms; }
223
+ .pill:nth-child(2) { animation-delay: 350ms; }
224
+ .pill:nth-child(3) { animation-delay: 400ms; }
225
+
226
+ .pill:hover {
227
+ background: rgba(59, 130, 246, 0.15);
228
+ border-color: #3b82f6;
229
+ transform: translateY(-2px);
230
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
231
+ }
232
+
233
+ /* ==================== MAIN LAYOUT ==================== */
234
+
235
+ .main-layout {
236
+ display: grid;
237
+ grid-template-columns: 1fr;
238
+ gap: 24px;
239
+ align-items: start;
240
+ animation: slideUp 600ms ease-out 100ms both;
241
+ }
242
+
243
+ /* Upload Bar */
244
+
245
+ .upload-bar {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: 16px;
249
+ width: 100%;
250
+ }
251
+
252
+ .upload-bar.has-results {
253
+ grid-column: 1;
254
+ grid-row: 1;
255
+ }
256
+
257
+ .sidebar-header {
258
+ padding: 12px 0;
259
+ border-bottom: 1px solid var(--border-light);
260
+ }
261
+
262
+ .sidebar-header h3 {
263
+ font-size: 14px;
264
+ font-weight: 700;
265
+ text-transform: uppercase;
266
+ letter-spacing: 0.08em;
267
+ color: #3b82f6;
268
+ margin: 0;
269
+ }
270
+
271
+ /* Compact Dropzone */
272
+
273
+ .compact-dropzone {
274
+ padding: 18px 22px !important;
275
+ border-radius: 14px !important;
276
+ max-width: 100% !important;
277
+ animation: slideUp 600ms ease-out 150ms both;
278
+ }
279
+
280
+ .compact-dropzone.has-file {
281
+ padding: 18px 22px !important;
282
+ }
283
+
284
+ .compact-upload-content {
285
+ display: flex;
286
+ flex-direction: row;
287
+ justify-content: space-between;
288
+ align-items: center;
289
+ align-items: center;
290
+ gap: 12px;
291
+ padding: 0;
292
+ }
293
+
294
+ .compact-upload-icon {
295
+ font-size: 32px;
296
+ animation: bounce 2s ease-in-out infinite;
297
+ }
298
+
299
+ .compact-upload-text {
300
+ font-size: 13px;
301
+ font-weight: 600;
302
+ color: var(--text-primary);
303
+ margin: 0;
304
+ text-align: left;
305
+ }
306
+
307
+ /* Compact Preview */
308
+
309
+ .compact-preview {
310
+ display: flex;
311
+ flex-direction: row;
312
+ gap: 14px;
313
+ padding: 0 !important;
314
+ align-items: center;
315
+ justify-content: space-between;
316
+ }
317
+
318
+ .compact-preview-image {
319
+ width: 180px;
320
+ height: 120px;
321
+ border-radius: 10px;
322
+ object-fit: cover;
323
+ animation: slideUp 400ms ease-out;
324
+ }
325
+
326
+ .file-meta {
327
+ text-align: left;
328
+ width: auto;
329
+ flex: 1;
330
+ }
331
+
332
+ .file-name-compact {
333
+ font-size: 11px;
334
+ font-weight: 600;
335
+ color: var(--text-primary);
336
+ margin: 0;
337
+ word-break: break-all;
338
+ }
339
+
340
+ .file-size-compact {
341
+ font-size: 10px;
342
+ color: var(--text-secondary);
343
+ margin: 2px 0 0;
344
+ }
345
+
346
+ /* Compact Buttons */
347
+
348
+ .compact-button {
349
+ padding: 8px 14px !important;
350
+ font-size: 12px !important;
351
+ border-radius: 8px !important;
352
+ }
353
+
354
+ .compact-enhance-button {
355
+ width: 100%;
356
+ padding: 10px 16px !important;
357
+ font-size: 13px !important;
358
+ animation: slideUp 600ms ease-out 200ms both;
359
+ }
360
+
361
+ .compact-reset-button {
362
+ width: 100%;
363
+ padding: 8px 12px !important;
364
+ font-size: 12px !important;
365
+ }
366
+
367
+ .compact-alert {
368
+ font-size: 12px !important;
369
+ padding: 10px 12px !important;
370
+ max-width: 100% !important;
371
+ margin: 0 !important;
372
+ }
373
+
374
+ /* Results Main */
375
+
376
+ .results-main {
377
+ display: flex;
378
+ flex-direction: column;
379
+ gap: 20px;
380
+ width: 100%;
381
+ }
382
+
383
+ .results-main .section-title {
384
+ margin: 0 0 8px;
385
+ animation: slideUp 600ms ease-out 50ms both;
386
+ }
387
+
388
+ .dropzone::before {
389
+ content: "";
390
+ position: absolute;
391
+ inset: 0;
392
+ background: radial-gradient(circle at 30% 20%, rgba(59, 130, 246, 0.05), transparent 50%);
393
+ pointer-events: none;
394
+ }
395
+
396
+ .dropzone::after {
397
+ content: "";
398
+ position: absolute;
399
+ inset: 0;
400
+ background: linear-gradient(135deg, transparent, rgba(255, 255, 255, 0.4), transparent);
401
+ opacity: 0;
402
+ transition: opacity 300ms ease;
403
+ pointer-events: none;
404
+ }
405
+
406
+ .dropzone:hover::after {
407
+ opacity: 1;
408
+ }
409
+
410
+ .dropzone.dropzone-active {
411
+ border-color: #3b82f6;
412
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.1), rgba(139, 92, 246, 0.06));
413
+ transform: translateY(-4px);
414
+ box-shadow: 0 20px 60px rgba(59, 130, 246, 0.18);
415
+ }
416
+
417
+ .dropzone.has-file {
418
+ border-color: var(--border-light);
419
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.05), rgba(34, 197, 94, 0.05));
420
+ }
421
+
422
+ #imagePicker {
423
+ display: none;
424
+ }
425
+
426
+ .upload-button,
427
+ .change-button {
428
+ display: inline-block;
429
+ padding: 12px 28px;
430
+ background: linear-gradient(135deg, #3b82f6, #2563eb);
431
+ color: white;
432
+ border: none;
433
+ border-radius: 10px;
434
+ font-size: 14px;
435
+ font-weight: 600;
436
+ cursor: pointer;
437
+ transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
438
+ box-shadow: 0 4px 15px rgba(59, 130, 246, 0.35);
439
+ position: relative;
440
+ overflow: hidden;
441
+ }
442
+
443
+ .upload-button::before,
444
+ .change-button::before {
445
+ content: '';
446
+ position: absolute;
447
+ top: 50%;
448
+ left: 50%;
449
+ width: 0;
450
+ height: 0;
451
+ background: rgba(255, 255, 255, 0.2);
452
+ border-radius: 50%;
453
+ transform: translate(-50%, -50%);
454
+ transition: width 400ms, height 400ms;
455
+ }
456
+
457
+ .upload-button:hover::before,
458
+ .change-button:hover::before {
459
+ width: 300px;
460
+ height: 300px;
461
+ }
462
+
463
+ .upload-button:hover,
464
+ .change-button:hover {
465
+ transform: translateY(-3px);
466
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.45);
467
+ }
468
+
469
+ .upload-button:active,
470
+ .change-button:active {
471
+ transform: translateY(-1px);
472
+ box-shadow: 0 5px 15px rgba(59, 130, 246, 0.3);
473
+ }
474
+
475
+ .upload-button:focus-visible,
476
+ .change-button:focus-visible {
477
+ outline: 2px solid #3b82f6;
478
+ outline-offset: 2px;
479
+ }
480
+
481
+ /* Base Dropzone Styling */
482
+
483
+ .dropzone {
484
+ border: 2px dashed var(--border-medium);
485
+ border-radius: 16px;
486
+ padding: 48px 32px;
487
+ text-align: center;
488
+ background: linear-gradient(135deg, rgba(248, 250, 252, 0.9), rgba(241, 245, 249, 0.7));
489
+ backdrop-filter: blur(10px);
490
+ transition: all 300ms cubic-bezier(0.23, 1, 0.320, 1);
491
+ cursor: pointer;
492
+ position: relative;
493
+ overflow: hidden;
494
+ }
495
+
496
+ /* File Preview */
497
+
498
+ .file-preview {
499
+ position: relative;
500
+ display: flex;
501
+ flex-direction: column;
502
+ align-items: center;
503
+ gap: 16px;
504
+ animation: slideUp 300ms ease-out;
505
+ }
506
+
507
+ .preview-image {
508
+ max-width: 100%;
509
+ max-height: 300px;
510
+ border-radius: 12px;
511
+ object-fit: cover;
512
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
513
+ animation: slideUp 500ms ease-out;
514
+ transition: transform 250ms ease;
515
+ }
516
+
517
+ .preview-image:hover {
518
+ transform: scale(1.02);
519
+ }
520
+
521
+ .file-info {
522
+ text-align: center;
523
+ }
524
+
525
+ .file-name {
526
+ font-size: 14px;
527
+ font-weight: 600;
528
+ color: var(--text-primary);
529
+ margin: 0;
530
+ word-break: break-all;
531
+ }
532
+
533
+ .file-size {
534
+ font-size: 12px;
535
+ color: var(--text-secondary);
536
+ margin: 4px 0 0;
537
+ }
538
+
539
+ /* ==================== ACTION SECTION ==================== */
540
+
541
+ .action-section {
542
+ display: flex;
543
+ justify-content: center;
544
+ gap: 12px;
545
+ margin-top: 24px;
546
+ animation: slideUp 600ms ease-out 200ms both;
547
+ }
548
+
549
+ .enhance-button {
550
+ display: inline-flex;
551
+ align-items: center;
552
+ gap: 8px;
553
+ padding: 14px 36px;
554
+ background: linear-gradient(135deg, #3b82f6, #2563eb);
555
+ color: white;
556
+ border: none;
557
+ border-radius: 10px;
558
+ font-size: 15px;
559
+ font-weight: 600;
560
+ cursor: pointer;
561
+ transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
562
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.35);
563
+ position: relative;
564
+ overflow: hidden;
565
+ }
566
+
567
+ .enhance-button::before {
568
+ content: '';
569
+ position: absolute;
570
+ top: 0;
571
+ left: -100%;
572
+ width: 100%;
573
+ height: 100%;
574
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
575
+ transition: left 500ms ease;
576
+ }
577
+
578
+ .enhance-button:hover:not(:disabled)::before {
579
+ left: 100%;
580
+ }
581
+
582
+ .enhance-button:hover:not(:disabled) {
583
+ transform: translateY(-4px);
584
+ box-shadow: 0 12px 35px rgba(59, 130, 246, 0.45);
585
+ }
586
+
587
+ .enhance-button:active:not(:disabled) {
588
+ transform: translateY(-2px);
589
+ box-shadow: 0 6px 20px rgba(59, 130, 246, 0.3);
590
+ }
591
+
592
+ .enhance-button:focus-visible {
593
+ outline: 2px solid #3b82f6;
594
+ outline-offset: 2px;
595
+ }
596
+
597
+ .enhance-button:disabled {
598
+ opacity: 0.85;
599
+ cursor: not-allowed;
600
+ }
601
+
602
+ .enhance-button.processing {
603
+ background: linear-gradient(135deg, #2563eb, #1d4ed8);
604
+ }
605
+
606
+ .spinner {
607
+ display: inline-block;
608
+ width: 16px;
609
+ height: 16px;
610
+ border: 2.5px solid rgba(255, 255, 255, 0.25);
611
+ border-top-color: white;
612
+ border-radius: 50%;
613
+ animation: spin 0.8s linear infinite;
614
+ margin-right: 2px;
615
+ }
616
+
617
+ /* ==================== ALERTS ==================== */
618
+
619
+ .alert {
620
+ max-width: 600px;
621
+ margin: 0 auto;
622
+ padding: 14px 16px;
623
+ border-radius: 10px;
624
+ font-size: 14px;
625
+ animation: slideDown 300ms ease-out;
626
+ border-left: 4px solid transparent;
627
+ backdrop-filter: blur(8px);
628
+ }
629
+
630
+ .alert-error {
631
+ background: linear-gradient(135deg, rgba(239, 68, 68, 0.12), rgba(220, 38, 38, 0.08));
632
+ border: 1px solid rgba(239, 68, 68, 0.35);
633
+ border-left-color: #ef4444;
634
+ color: #b91c1c;
635
+ }
636
+
637
+ .alert-success {
638
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.12), rgba(34, 197, 94, 0.08));
639
+ border: 1px solid rgba(16, 185, 129, 0.35);
640
+ border-left-color: #10b981;
641
+ color: #065f46;
642
+ }
643
+
644
+ /* ==================== COMPARISON SECTION ==================== */
645
+
646
+ .comparison-section {
647
+ animation: slideUp 500ms ease-out;
648
+ }
649
+
650
+ .section-title {
651
+ font-size: 24px;
652
+ font-weight: 700;
653
+ margin: 0 0 8px;
654
+ color: var(--text-primary);
655
+ animation: slideUp 500ms ease-out 50ms both;
656
+ }
657
+
658
+ .section-subtitle {
659
+ font-size: 14px;
660
+ color: var(--text-secondary);
661
+ margin: 0 0 24px;
662
+ animation: slideUp 500ms ease-out 100ms both;
663
+ }
664
+
665
+ /* Comparison Images */
666
+
667
+ .comparison-images {
668
+ display: grid;
669
+ grid-template-columns: 1fr 1fr;
670
+ gap: 20px;
671
+ max-width: 1700px;
672
+ width: 100%;
673
+ margin: 0 auto;
674
+ animation: slideUp 600ms ease-out 150ms both;
675
+ }
676
+
677
+ .comparison-item {
678
+ position: relative;
679
+ display: flex;
680
+ flex-direction: column;
681
+ gap: 12px;
682
+ }
683
+
684
+ .comparison-label {
685
+ font-size: 13px;
686
+ font-weight: 600;
687
+ text-transform: uppercase;
688
+ letter-spacing: 0.08em;
689
+ color: #3b82f6;
690
+ padding: 8px 12px;
691
+ background: rgba(59, 130, 246, 0.1);
692
+ border-radius: 6px;
693
+ text-align: center;
694
+ }
695
+
696
+ .comparison-image {
697
+ width: 100%;
698
+ height: clamp(300px, 34vw, 520px);
699
+ border-radius: 12px;
700
+ object-fit: cover;
701
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
702
+ transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
703
+ animation: slideUp 600ms ease-out 150ms both;
704
+ }
705
+
706
+ .comparison-image:hover {
707
+ transform: scale(1.02);
708
+ box-shadow: 0 25px 70px rgba(0, 0, 0, 0.2);
709
+ }
710
+
711
+ /* Result Actions */
712
+
713
+ .result-actions {
714
+ display: flex;
715
+ gap: 12px;
716
+ justify-content: center;
717
+ margin-top: 28px;
718
+ animation: slideUp 600ms ease-out 250ms both;
719
+ }
720
+
721
+ .download-button,
722
+ .reset-button {
723
+ padding: 12px 28px;
724
+ border: none;
725
+ border-radius: 10px;
726
+ font-size: 14px;
727
+ font-weight: 600;
728
+ cursor: pointer;
729
+ transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
730
+ position: relative;
731
+ overflow: hidden;
732
+ }
733
+
734
+ .download-button {
735
+ background: linear-gradient(135deg, #10b981, #059669);
736
+ color: white;
737
+ box-shadow: 0 4px 15px rgba(16, 185, 129, 0.35);
738
+ }
739
+
740
+ .download-button::before {
741
+ content: '';
742
+ position: absolute;
743
+ top: 50%;
744
+ left: 50%;
745
+ width: 0;
746
+ height: 0;
747
+ background: rgba(255, 255, 255, 0.2);
748
+ border-radius: 50%;
749
+ transform: translate(-50%, -50%);
750
+ transition: width 400ms, height 400ms;
751
+ }
752
+
753
+ .download-button:hover {
754
+ transform: translateY(-3px);
755
+ box-shadow: 0 8px 25px rgba(16, 185, 129, 0.45);
756
+ }
757
+
758
+ .download-button:hover::before {
759
+ width: 300px;
760
+ height: 300px;
761
+ }
762
+
763
+ .download-button:active {
764
+ transform: translateY(-1px);
765
+ }
766
+
767
+ .download-button:focus-visible {
768
+ outline: 2px solid #10b981;
769
+ outline-offset: 2px;
770
+ }
771
+
772
+ .reset-button {
773
+ background: var(--bg-secondary);
774
+ color: var(--text-primary);
775
+ border: 1.5px solid var(--border-medium);
776
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
777
+ }
778
+
779
+ .reset-button:hover {
780
+ background: var(--bg-tertiary);
781
+ border-color: var(--border-dark);
782
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
783
+ }
784
+
785
+ .reset-button:active {
786
+ transform: translateY(-1px);
787
+ }
788
+
789
+ .reset-button:focus-visible {
790
+ outline: 2px solid #3b82f6;
791
+ outline-offset: 2px;
792
+ }
793
+
794
+ /* ==================== EMPTY STATE ==================== */
795
+
796
+ .empty-state {
797
+ display: flex;
798
+ flex-direction: column;
799
+ align-items: center;
800
+ justify-content: center;
801
+ gap: 16px;
802
+ padding: 60px 20px;
803
+ color: var(--text-secondary);
804
+ animation: fadeIn 500ms ease-out 300ms both;
805
+ }
806
+
807
+ .empty-icon {
808
+ font-size: 64px;
809
+ opacity: 0.5;
810
+ animation: float 3s ease-in-out infinite;
811
+ }
812
+
813
+ .empty-state p {
814
+ margin: 0;
815
+ font-size: 16px;
816
+ font-weight: 500;
817
+ }
818
+
819
+ /* ==================== FOOTER ==================== */
820
+
821
+ .app-footer {
822
+ padding: 24px 20px;
823
+ text-align: center;
824
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.05), rgba(139, 92, 246, 0.05));
825
+ border-top: 1px solid var(--border-light);
826
+ color: var(--text-secondary);
827
+ font-size: 13px;
828
+ margin-top: auto;
829
+ animation: slideUp 600ms ease-out 400ms both;
830
+ }
831
+
832
+ /* ==================== ANIMATIONS ==================== */
833
+
834
+ @keyframes slideUp {
835
+ from {
836
+ opacity: 0;
837
+ transform: translateY(20px);
838
+ }
839
+ to {
840
+ opacity: 1;
841
+ transform: translateY(0);
842
+ }
843
+ }
844
+
845
+ @keyframes slideDown {
846
+ from {
847
+ opacity: 0;
848
+ transform: translateY(-10px);
849
+ }
850
+ to {
851
+ opacity: 1;
852
+ transform: translateY(0);
853
+ }
854
+ }
855
+
856
+ @keyframes fadeIn {
857
+ from {
858
+ opacity: 0;
859
+ }
860
+ to {
861
+ opacity: 1;
862
+ }
863
+ }
864
+
865
+ @keyframes float {
866
+ 0%,
867
+ 100% {
868
+ transform: translateY(0);
869
+ }
870
+ 50% {
871
+ transform: translateY(-8px);
872
+ }
873
+ }
874
+
875
+ @keyframes bounce {
876
+ 0%,
877
+ 100% {
878
+ transform: scale(1);
879
+ }
880
+ 50% {
881
+ transform: scale(1.05);
882
+ }
883
+ }
884
+
885
+ @keyframes spin {
886
+ to {
887
+ transform: rotate(360deg);
888
+ }
889
+ }
890
+
891
+ @keyframes shimmer {
892
+ 0% {
893
+ background-position: -1000px 0;
894
+ }
895
+ 100% {
896
+ background-position: 1000px 0;
897
+ }
898
+ }
899
+
900
+ @keyframes pulse-glow {
901
+ 0%,
902
+ 100% {
903
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.5);
904
+ }
905
+ 50% {
906
+ box-shadow: 0 0 0 10px rgba(59, 130, 246, 0);
907
+ }
908
+ }
909
+
910
+ /* ==================== RESPONSIVE ==================== */
911
+
912
+ @media (max-width: 1024px) {
913
+ .main-layout {
914
+ grid-template-columns: 1fr;
915
+ gap: 24px;
916
+ }
917
+
918
+ .upload-bar {
919
+ position: static;
920
+ }
921
+
922
+ .comparison-images {
923
+ grid-template-columns: 1fr 1fr;
924
+ }
925
+
926
+ .comparison-image {
927
+ height: clamp(260px, 34vw, 420px);
928
+ }
929
+ }
930
+
931
+ @media (max-width: 768px) {
932
+ .app-shell {
933
+ padding: 32px 16px;
934
+ gap: 32px;
935
+ }
936
+
937
+ .app-header {
938
+ padding: 24px 16px;
939
+ }
940
+
941
+ .main-layout {
942
+ grid-template-columns: 1fr;
943
+ gap: 20px;
944
+ }
945
+
946
+ .upload-bar {
947
+ order: 2;
948
+ }
949
+
950
+ .results-main {
951
+ order: 1;
952
+ }
953
+
954
+ .dropzone {
955
+ padding: 36px 20px;
956
+ border-radius: 16px;
957
+ }
958
+
959
+ .hero-title {
960
+ font-size: clamp(24px, 5vw, 36px);
961
+ }
962
+
963
+ .preview-image {
964
+ max-height: 200px;
965
+ }
966
+
967
+ .comparison-images {
968
+ grid-template-columns: 1fr;
969
+ gap: 16px;
970
+ }
971
+
972
+ .comparison-image {
973
+ height: 240px;
974
+ }
975
+
976
+ .feature-pills {
977
+ gap: 8px;
978
+ }
979
+
980
+ .pill {
981
+ font-size: 12px;
982
+ padding: 6px 12px;
983
+ }
984
+
985
+ .result-actions {
986
+ flex-direction: column;
987
+ width: 100%;
988
+ }
989
+
990
+ .download-button,
991
+ .reset-button {
992
+ width: 100%;
993
+ }
994
+
995
+ .loss-grid {
996
+ grid-template-columns: 1fr;
997
+ }
998
+ }
999
+
1000
+ @media (max-width: 480px) {
1001
+ .app-shell {
1002
+ padding: 24px 12px;
1003
+ gap: 24px;
1004
+ }
1005
+
1006
+ .dropzone {
1007
+ padding: 28px 16px;
1008
+ border-radius: 12px;
1009
+ }
1010
+
1011
+ .dropzone-title {
1012
+ font-size: 16px;
1013
+ }
1014
+
1015
+ .upload-icon {
1016
+ font-size: 36px;
1017
+ }
1018
+
1019
+ .hero-title {
1020
+ font-size: 24px;
1021
+ }
1022
+
1023
+ .feature-pills {
1024
+ gap: 6px;
1025
+ }
1026
+
1027
+ .pill {
1028
+ font-size: 11px;
1029
+ }
1030
+
1031
+ .comparison-images {
1032
+ grid-template-columns: 1fr;
1033
+ gap: 12px;
1034
+ }
1035
+
1036
+ .comparison-image {
1037
+ aspect-ratio: 4/3;
1038
+ }
1039
+
1040
+ .comparison-label {
1041
+ font-size: 11px;
1042
+ }
1043
+
1044
+ .logo-section {
1045
+ gap: 8px;
1046
+ }
1047
+
1048
+ .app-title {
1049
+ font-size: 20px;
1050
+ }
1051
+
1052
+ .main-layout {
1053
+ grid-template-columns: 1fr;
1054
+ }
1055
+
1056
+ .compact-button {
1057
+ padding: 6px 10px !important;
1058
+ }
1059
+ }
1060
+
1061
+ .actions {
1062
+ margin-top: 16px;
1063
+ display: flex;
1064
+ flex-wrap: wrap;
1065
+ gap: 10px;
1066
+ }
1067
+
1068
+ .enhance-btn,
1069
+ .reset-btn,
1070
+ .download-btn {
1071
+ border: none;
1072
+ border-radius: 12px;
1073
+ padding: 11px 16px;
1074
+ font-family: var(--body-font);
1075
+ font-weight: 700;
1076
+ font-size: 0.95rem;
1077
+ cursor: pointer;
1078
+ transition: transform 200ms ease, box-shadow 200ms ease, opacity 200ms ease;
1079
+ }
1080
+
1081
+ .enhance-btn {
1082
+ color: #f2fffc;
1083
+ background: linear-gradient(130deg, #1f7b85, #14545c);
1084
+ box-shadow: 0 12px 30px -20px rgba(15, 76, 83, 0.9);
1085
+ }
1086
+
1087
+ .enhance-btn:disabled {
1088
+ opacity: 0.72;
1089
+ cursor: not-allowed;
1090
+ }
1091
+
1092
+ .reset-btn {
1093
+ color: var(--text-main);
1094
+ background: rgba(255, 255, 255, 0.72);
1095
+ border: 1px solid var(--panel-border);
1096
+ }
1097
+
1098
+ .download-btn {
1099
+ text-decoration: none;
1100
+ color: var(--text-main);
1101
+ background: #f3c969;
1102
+ }
1103
+
1104
+ .enhance-btn:hover,
1105
+ .reset-btn:hover,
1106
+ .download-btn:hover {
1107
+ transform: translateY(-1px);
1108
+ }
1109
+
1110
+ .error-banner {
1111
+ margin-top: 12px;
1112
+ border-radius: 12px;
1113
+ padding: 10px 12px;
1114
+ color: #6e1f16;
1115
+ background: #ffe8e1;
1116
+ border: 1px solid #f7c2b8;
1117
+ }
1118
+
1119
+ .preview-grid {
1120
+ margin-top: 18px;
1121
+ display: grid;
1122
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1123
+ gap: 14px;
1124
+ }
1125
+
1126
+ .preview-card {
1127
+ border: 1px solid var(--panel-border);
1128
+ border-radius: 20px;
1129
+ padding: 14px;
1130
+ background: rgba(255, 255, 255, 0.82);
1131
+ min-height: 310px;
1132
+ }
1133
+
1134
+ h2 {
1135
+ margin: 2px 0 10px;
1136
+ color: var(--text-main);
1137
+ font-family: var(--display-font);
1138
+ font-size: 1.16rem;
1139
+ }
1140
+
1141
+ .placeholder {
1142
+ width: 100%;
1143
+ height: 260px;
1144
+ border-radius: 12px;
1145
+ }
1146
+
1147
+ .preview-card img {
1148
+ display: block;
1149
+ max-width: 100%;
1150
+ max-height: min(70vh, 560px);
1151
+ width: auto;
1152
+ height: auto;
1153
+ margin: 0 auto;
1154
+ object-fit: contain;
1155
+ image-rendering: auto;
1156
+ border-radius: 12px;
1157
+ border: 1px solid rgba(10, 47, 54, 0.15);
1158
+ background: #f7fbfa;
1159
+ }
1160
+
1161
+ .placeholder {
1162
+ display: grid;
1163
+ place-items: center;
1164
+ text-align: center;
1165
+ color: var(--text-muted);
1166
+ padding: 20px;
1167
+ background: linear-gradient(120deg, rgba(221, 231, 232, 0.5), rgba(248, 251, 250, 0.95));
1168
+ border: 1px solid rgba(10, 47, 54, 0.08);
1169
+ }
1170
+
1171
+ @keyframes riseIn {
1172
+ from {
1173
+ opacity: 0;
1174
+ transform: translateY(10px);
1175
+ }
1176
+ to {
1177
+ opacity: 1;
1178
+ transform: translateY(0);
1179
+ }
1180
+ }
1181
+
1182
+ @media (max-width: 900px) {
1183
+ .app-shell {
1184
+ padding-top: 24px;
1185
+ }
1186
+
1187
+ .panel {
1188
+ padding: 16px;
1189
+ }
1190
+
1191
+ .preview-grid {
1192
+ grid-template-columns: 1fr;
1193
+ }
1194
+
1195
+ .preview-card {
1196
+ min-height: 270px;
1197
+ }
1198
+
1199
+ .placeholder {
1200
+ height: 220px;
1201
+ }
1202
+
1203
+ .preview-card img {
1204
+ max-height: 420px;
1205
+ }
1206
+ }
frontend/src/App.jsx ADDED
@@ -0,0 +1,361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useMemo, useState } from "react";
2
+ import "./App.css";
3
+
4
+ const API_URL = "http://127.0.0.1:5000/enhance";
5
+ const ACCEPTED_TYPES = ["image/png", "image/jpeg", "image/jpg", "image/webp"];
6
+
7
+ function App() {
8
+ const [selectedFile, setSelectedFile] = useState(null);
9
+ const [inputPreviewUrl, setInputPreviewUrl] = useState("");
10
+ const [outputPreviewUrl, setOutputPreviewUrl] = useState("");
11
+ const [isEnhancing, setIsEnhancing] = useState(false);
12
+ const [errorMessage, setErrorMessage] = useState("");
13
+ const [isDragging, setIsDragging] = useState(false);
14
+ const [successMessage, setSuccessMessage] = useState("");
15
+
16
+ const fileSizeInMb = useMemo(() => {
17
+ if (!selectedFile) return "";
18
+ return `${(selectedFile.size / (1024 * 1024)).toFixed(2)} MB`;
19
+ }, [selectedFile]);
20
+
21
+ useEffect(() => {
22
+ return () => {
23
+ if (inputPreviewUrl) URL.revokeObjectURL(inputPreviewUrl);
24
+ if (outputPreviewUrl) URL.revokeObjectURL(outputPreviewUrl);
25
+ };
26
+ }, [inputPreviewUrl, outputPreviewUrl]);
27
+
28
+ const clearResult = () => {
29
+ if (outputPreviewUrl) {
30
+ URL.revokeObjectURL(outputPreviewUrl);
31
+ }
32
+ setOutputPreviewUrl("");
33
+ };
34
+
35
+ const resetAll = () => {
36
+ if (inputPreviewUrl) URL.revokeObjectURL(inputPreviewUrl);
37
+ if (outputPreviewUrl) URL.revokeObjectURL(outputPreviewUrl);
38
+
39
+ setSelectedFile(null);
40
+ setInputPreviewUrl("");
41
+ setOutputPreviewUrl("");
42
+ setErrorMessage("");
43
+ setSuccessMessage("");
44
+ setIsDragging(false);
45
+ };
46
+
47
+ const validateAndSetFile = (file) => {
48
+ if (!file) return;
49
+
50
+ if (!ACCEPTED_TYPES.includes(file.type)) {
51
+ setErrorMessage("Please upload PNG, JPG, JPEG, or WEBP formats only.");
52
+ setSuccessMessage("");
53
+ return;
54
+ }
55
+
56
+ if (file.size > 50 * 1024 * 1024) {
57
+ setErrorMessage("Image must be smaller than 50 MB.");
58
+ setSuccessMessage("");
59
+ return;
60
+ }
61
+
62
+ if (inputPreviewUrl) URL.revokeObjectURL(inputPreviewUrl);
63
+
64
+ const newInputUrl = URL.createObjectURL(file);
65
+ setSelectedFile(file);
66
+ setInputPreviewUrl(newInputUrl);
67
+ setErrorMessage("");
68
+ setSuccessMessage("");
69
+ clearResult();
70
+ };
71
+
72
+ const handleFileChange = (event) => {
73
+ const file = event.target.files?.[0];
74
+ validateAndSetFile(file);
75
+ };
76
+
77
+ const handleDrop = (event) => {
78
+ event.preventDefault();
79
+ setIsDragging(false);
80
+ const file = event.dataTransfer.files?.[0];
81
+ validateAndSetFile(file);
82
+ };
83
+
84
+ const downloadEnhanced = () => {
85
+ const a = document.createElement("a");
86
+ a.href = outputPreviewUrl;
87
+ a.download = "enhanced-image.png";
88
+ document.body.appendChild(a);
89
+ a.click();
90
+ document.body.removeChild(a);
91
+ };
92
+
93
+ const enhanceImage = async () => {
94
+ if (!selectedFile) {
95
+ setErrorMessage("Please select an image first.");
96
+ return;
97
+ }
98
+
99
+ setIsEnhancing(true);
100
+ setErrorMessage("");
101
+ setSuccessMessage("");
102
+
103
+ const formData = new FormData();
104
+ formData.append("image", selectedFile);
105
+
106
+ try {
107
+ const response = await fetch(API_URL, {
108
+ method: "POST",
109
+ body: formData,
110
+ });
111
+
112
+ if (!response.ok) {
113
+ let serverMessage = "Enhancement failed. Please try again.";
114
+ try {
115
+ const errorBody = await response.json();
116
+ serverMessage = errorBody.error || serverMessage;
117
+ } catch {
118
+ serverMessage = `Enhancement failed with status ${response.status}.`;
119
+ }
120
+ throw new Error(serverMessage);
121
+ }
122
+
123
+ const blob = await response.blob();
124
+ const outputUrl = URL.createObjectURL(blob);
125
+
126
+ if (outputPreviewUrl) URL.revokeObjectURL(outputPreviewUrl);
127
+ setOutputPreviewUrl(outputUrl);
128
+ setSuccessMessage("✓ Enhancement complete! Compare the images below.");
129
+ } catch (error) {
130
+ setErrorMessage(error.message || "An unexpected error occurred.");
131
+ setSuccessMessage("");
132
+ } finally {
133
+ setIsEnhancing(false);
134
+ }
135
+ };
136
+
137
+ return (
138
+ <main className="app-container">
139
+ {/* Header */}
140
+ <header className="app-header">
141
+ <div className="header-content">
142
+ <div className="logo-section">
143
+ <div className="logo-icon">✨</div>
144
+ <h1 className="app-title">LumiGAN</h1>
145
+ <div className="brand-image" aria-hidden="true"></div>
146
+ </div>
147
+ <p className="app-tagline">Professional Low-Light Image Enhancement</p>
148
+ </div>
149
+ </header>
150
+
151
+ {/* Main Content */}
152
+ <section className="app-shell">
153
+ {/* Hero Section */}
154
+ <div className="hero-section">
155
+ <div className="hero-content">
156
+ <p className="eyebrow">POWERED BY GENERATIVE AI</p>
157
+ <h2 className="hero-title">Brighten Your Darkness</h2>
158
+ <p className="hero-description">
159
+ Transform underexposed photos into stunning, well-lit images using advanced
160
+ neural networks. Perfect for night photography, dimly lit interiors, and more.
161
+ </p>
162
+ <div className="feature-pills">
163
+ <span className="pill">🚀 Real-Time Processing</span>
164
+ <span className="pill">🎨 Neural Enhancement</span>
165
+ <span className="pill">📊 Before/After Comparison</span>
166
+ </div>
167
+ </div>
168
+ </div>
169
+
170
+ {/* Main Layout: Upload + Results */}
171
+ <div className="main-layout">
172
+ {/* Upload Bar */}
173
+ <div className={`upload-bar ${outputPreviewUrl ? "has-results" : ""}`}>
174
+ <div className="sidebar-header">
175
+ <h3>Upload Image</h3>
176
+ </div>
177
+
178
+ <div
179
+ className={`dropzone compact-dropzone ${isDragging ? "dropzone-active" : ""} ${inputPreviewUrl ? "has-file" : ""}`}
180
+ onDragEnter={(event) => {
181
+ event.preventDefault();
182
+ setIsDragging(true);
183
+ }}
184
+ onDragOver={(event) => event.preventDefault()}
185
+ onDragLeave={() => setIsDragging(false)}
186
+ onDrop={handleDrop}
187
+ >
188
+ {!inputPreviewUrl ? (
189
+ <div className="compact-upload-content">
190
+ <div className="compact-upload-icon">📸</div>
191
+ <p className="compact-upload-text">Choose image</p>
192
+ <label className="upload-button compact-button" htmlFor="imagePicker">
193
+ <span>Select</span>
194
+ </label>
195
+ <input
196
+ id="imagePicker"
197
+ type="file"
198
+ accept="image/png,image/jpeg,image/jpg,image/webp"
199
+ onChange={handleFileChange}
200
+ />
201
+ </div>
202
+ ) : (
203
+ <div className="file-preview compact-preview">
204
+ <img src={inputPreviewUrl} alt="Preview" className="preview-image compact-preview-image" />
205
+ <div className="file-meta">
206
+ <p className="file-name-compact">{selectedFile?.name}</p>
207
+ <p className="file-size-compact">{fileSizeInMb}</p>
208
+ </div>
209
+ <label className="change-button compact-button" htmlFor="imagePicker">
210
+
211
+ </label>
212
+ <input
213
+ id="imagePicker"
214
+ type="file"
215
+ accept="image/png,image/jpeg,image/jpg,image/webp"
216
+ onChange={handleFileChange}
217
+ />
218
+ </div>
219
+ )}
220
+ </div>
221
+
222
+ {/* Alerts */}
223
+ {errorMessage && <div className="alert alert-error compact-alert">{errorMessage}</div>}
224
+ {successMessage && <div className="alert alert-success compact-alert">{successMessage}</div>}
225
+
226
+ {/* Action Button */}
227
+ {inputPreviewUrl && !outputPreviewUrl && (
228
+ <button
229
+ className={`enhance-button compact-enhance-button ${isEnhancing ? "processing" : ""}`}
230
+ onClick={enhanceImage}
231
+ disabled={isEnhancing}
232
+ >
233
+ {isEnhancing ? (
234
+ <>
235
+ <span className="spinner"></span>
236
+ Processing...
237
+ </>
238
+ ) : (
239
+ "✨ Enhance"
240
+ )}
241
+ </button>
242
+ )}
243
+
244
+ {/* Reset Button */}
245
+ {outputPreviewUrl && (
246
+ <button className="reset-button compact-reset-button" onClick={resetAll}>
247
+ ↻ New Image
248
+ </button>
249
+ )}
250
+ </div>
251
+
252
+ {/* Results Section */}
253
+ {outputPreviewUrl && (
254
+ <div className="results-main">
255
+ <h3 className="section-title">Results</h3>
256
+
257
+ <div className="comparison-images">
258
+ <div className="comparison-item">
259
+ <div className="comparison-label">Original</div>
260
+ <img src={inputPreviewUrl} alt="Original" className="comparison-image" />
261
+ </div>
262
+ <div className="comparison-item">
263
+ <div className="comparison-label">Enhanced</div>
264
+ <img src={outputPreviewUrl} alt="Enhanced" className="comparison-image" />
265
+ </div>
266
+ </div>
267
+
268
+ <div className="result-actions">
269
+ <button className="download-button" onClick={downloadEnhanced}>
270
+ ⬇️ Download Enhanced
271
+ </button>
272
+ </div>
273
+ </div>
274
+ )}
275
+ </div>
276
+
277
+ <section className="losses-section">
278
+ <div className="losses-header">
279
+ <div>
280
+ <h3>Training Snapshot</h3>
281
+ <p className="losses-subtitle">Last epoch metrics (Source to Target samples)</p>
282
+ </div>
283
+ </div>
284
+ <div className="loss-grid">
285
+ <div className="loss-card">
286
+ <div className="loss-name">source_discr</div>
287
+ <div className="loss-value">0.31682008504867554</div>
288
+ <p className="loss-desc">
289
+ Discriminator loss for the source domain. Lower means better real/fake separation.
290
+ </p>
291
+ </div>
292
+ <div className="loss-card">
293
+ <div className="loss-name">target_discr</div>
294
+ <div className="loss-value">0.21157756447792053</div>
295
+ <p className="loss-desc">
296
+ Discriminator loss for the target domain. Lower means better real/fake separation.
297
+ </p>
298
+ </div>
299
+ <div className="loss-card">
300
+ <div className="loss-name">source_gener</div>
301
+ <div className="loss-value">0.7708375255266825</div>
302
+ <p className="loss-desc">
303
+ Generator adversarial loss for source to target mapping. Lower is better.
304
+ </p>
305
+ </div>
306
+ <div className="loss-card">
307
+ <div className="loss-name">target_gener</div>
308
+ <div className="loss-value">0.6412161688009897</div>
309
+ <p className="loss-desc">
310
+ Generator adversarial loss for target to source mapping. Lower is better.
311
+ </p>
312
+ </div>
313
+ <div className="loss-card">
314
+ <div className="loss-name">recon_target_loss</div>
315
+ <div className="loss-value">0.05315116047859192</div>
316
+ <p className="loss-desc">
317
+ Cycle reconstruction loss for target domain consistency. Lower means better cycle match.
318
+ </p>
319
+ </div>
320
+ <div className="loss-card">
321
+ <div className="loss-name">recon_source_loss</div>
322
+ <div className="loss-value">0.03360244259238243</div>
323
+ <p className="loss-desc">
324
+ Cycle reconstruction loss for source domain consistency. Lower means better cycle match.
325
+ </p>
326
+ </div>
327
+ <div className="loss-card">
328
+ <div className="loss-name">ident_target</div>
329
+ <div className="loss-value">0.09518671035766602</div>
330
+ <p className="loss-desc">
331
+ Identity loss on target images. Encourages keeping colors and structure when already in target domain.
332
+ </p>
333
+ </div>
334
+ <div className="loss-card">
335
+ <div className="loss-name">ident_source</div>
336
+ <div className="loss-value">0.049587182700634</div>
337
+ <p className="loss-desc">
338
+ Identity loss on source images. Encourages minimal change when already in source domain.
339
+ </p>
340
+ </div>
341
+ </div>
342
+ </section>
343
+
344
+ {/* Empty State */}
345
+ {!inputPreviewUrl && !outputPreviewUrl && !errorMessage && (
346
+ <div className="empty-state">
347
+ <div className="empty-icon">🌙</div>
348
+ <p>Ready to enhance your low-light photos?</p>
349
+ </div>
350
+ )}
351
+ </section>
352
+
353
+ {/* Footer */}
354
+ <footer className="app-footer">
355
+ <p>LumiGAN © 2026 • Advanced Image Enhancement</p>
356
+ </footer>
357
+ </main>
358
+ );
359
+ }
360
+
361
+ export default App;
frontend/src/assets/hero.png ADDED
frontend/src/assets/react.svg ADDED
frontend/src/assets/vite.svg ADDED
frontend/src/index.css ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@600;700;800&display=swap");
2
+
3
+ :root {
4
+ /* Typography */
5
+ --body-font: "Inter", "Segoe UI", -apple-system, BlinkMacSystemFont, sans-serif;
6
+ --display-font: "Plus Jakarta Sans", "Trebuchet MS", sans-serif;
7
+
8
+ /* Color Palette */
9
+ --text-primary: #0f172a;
10
+ --text-secondary: #64748b;
11
+ --text-muted: #94a3b8;
12
+
13
+ --bg-primary: #ffffff;
14
+ --bg-secondary: #f8fafc;
15
+ --bg-tertiary: #f1f5f9;
16
+ --bg-gradient: linear-gradient(135deg, #f0f4f8 0%, #f8f9fb 100%);
17
+
18
+ --border-light: rgba(15, 23, 42, 0.08);
19
+ --border-medium: rgba(15, 23, 42, 0.12);
20
+ --border-dark: rgba(15, 23, 42, 0.2);
21
+
22
+ --accent-primary: #3b82f6;
23
+ --accent-secondary: #8b5cf6;
24
+ --success: #10b981;
25
+ --error: #ef4444;
26
+
27
+ /* Shadows */
28
+ --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.08);
29
+ --shadow-md: 0 4px 12px rgba(15, 23, 42, 0.1);
30
+ --shadow-lg: 0 10px 30px rgba(15, 23, 42, 0.15);
31
+ --shadow-xl: 0 20px 60px rgba(15, 23, 42, 0.2);
32
+
33
+ /* Spacing */
34
+ --space-xs: 4px;
35
+ --space-sm: 8px;
36
+ --space-md: 12px;
37
+ --space-lg: 16px;
38
+ --space-xl: 24px;
39
+ --space-2xl: 32px;
40
+ --space-3xl: 48px;
41
+
42
+ /* Transitions */
43
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
44
+ --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);
45
+ --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
46
+
47
+ /* Borders */
48
+ --radius-sm: 4px;
49
+ --radius-md: 8px;
50
+ --radius-lg: 12px;
51
+ --radius-xl: 20px;
52
+ --radius-full: 999px;
53
+
54
+ font-family: var(--body-font);
55
+ font-size: 15px;
56
+ line-height: 1.6;
57
+ font-weight: 400;
58
+ font-feature-settings: "rlig" 1, "calt" 1;
59
+ font-variant-numeric: tabular-nums;
60
+ text-rendering: optimizeLegibility;
61
+ -webkit-font-smoothing: antialiased;
62
+ -moz-osx-font-smoothing: grayscale;
63
+ color: var(--text-primary);
64
+ }
65
+
66
+ /* Dark Mode Support */
67
+ @media (prefers-color-scheme: dark) {
68
+ :root {
69
+ --text-primary: #f1f5f9;
70
+ --text-secondary: #cbd5e1;
71
+ --text-muted: #94a3b8;
72
+
73
+ --bg-primary: #0f172a;
74
+ --bg-secondary: #1e293b;
75
+ --bg-tertiary: #334155;
76
+ --bg-gradient: linear-gradient(135deg, #0f172a 0%, #1a1f36 100%);
77
+
78
+ --border-light: rgba(248, 250, 252, 0.08);
79
+ --border-medium: rgba(248, 250, 252, 0.12);
80
+ --border-dark: rgba(248, 250, 252, 0.2);
81
+ }
82
+ }
83
+
84
+ /* Reset & Base Styles */
85
+ * {
86
+ box-sizing: border-box;
87
+ margin: 0;
88
+ padding: 0;
89
+ }
90
+
91
+ html,
92
+ body {
93
+ width: 100%;
94
+ height: 100%;
95
+ }
96
+
97
+ body {
98
+ margin: 0;
99
+ padding: 0;
100
+ min-height: 100vh;
101
+ background: var(--bg-gradient);
102
+ color: var(--text-primary);
103
+ }
104
+
105
+ #root {
106
+ width: 100%;
107
+ min-height: 100vh;
108
+ }
109
+
110
+ /* Typography */
111
+ h1,
112
+ h2,
113
+ h3,
114
+ h4,
115
+ h5,
116
+ h6 {
117
+ font-family: var(--display-font);
118
+ font-weight: 700;
119
+ line-height: 1.2;
120
+ letter-spacing: -0.02em;
121
+ }
122
+
123
+ p {
124
+ margin: 0;
125
+ line-height: 1.6;
126
+ }
127
+
128
+ a {
129
+ color: var(--accent-primary);
130
+ text-decoration: none;
131
+ transition: color var(--transition-fast);
132
+ }
133
+
134
+ a:hover {
135
+ color: var(--accent-secondary);
136
+ }
137
+
138
+ /* Buttons */
139
+ button {
140
+ font-family: var(--body-font);
141
+ font-size: inherit;
142
+ font-weight: 600;
143
+ }
144
+
145
+ /* Form Elements */
146
+ input,
147
+ textarea,
148
+ select {
149
+ font-family: var(--body-font);
150
+ font-size: inherit;
151
+ }
152
+
153
+ /* Scrollbar */
154
+ ::-webkit-scrollbar {
155
+ width: 8px;
156
+ height: 8px;
157
+ }
158
+
159
+ ::-webkit-scrollbar-track {
160
+ background: var(--bg-secondary);
161
+ }
162
+
163
+ ::-webkit-scrollbar-thumb {
164
+ background: var(--border-medium);
165
+ border-radius: 4px;
166
+ }
167
+
168
+ ::-webkit-scrollbar-thumb:hover {
169
+ background: var(--border-dark);
170
+ }
171
+
172
+ /* Selection */
173
+ ::selection {
174
+ background: var(--accent-primary);
175
+ color: white;
176
+ }
177
+
178
+ ::-moz-selection {
179
+ background: var(--accent-primary);
180
+ color: white;
181
+ }
frontend/src/main.jsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.jsx'
5
+
6
+ createRoot(document.getElementById('root')).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
frontend/vite.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ // https://vite.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ })