diff --git a/.env.example b/.env.example
index 63f1ec5..5f232d2 100644
--- a/.env.example
+++ b/.env.example
@@ -1,8 +1,12 @@
# Frontend Configuration
# Flask Backend URL - If set, the app will automatically use Flask backend instead of IndexedDB
-# Development: VITE_FLASK_BACKEND_URL=http://localhost:5000
-# Production: VITE_FLASK_BACKEND_URL=https://backend.example.com
-VITE_FLASK_BACKEND_URL=
+# Development: NEXT_PUBLIC_FLASK_BACKEND_URL=http://localhost:5000
+# Production: NEXT_PUBLIC_FLASK_BACKEND_URL=https://backend.example.com
+NEXT_PUBLIC_FLASK_BACKEND_URL=
+
+# Base path for deployment (e.g., for GitHub Pages)
+# Leave empty for root deployment
+NEXT_PUBLIC_BASE_PATH=
# Backend Configuration (for backend/app.py)
# CORS Allowed Origins - Comma-separated list of allowed frontend URLs
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..3722418
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals", "next/typescript"]
+}
diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml
index 755891f..7151d43 100644
--- a/.github/workflows/deploy-pages.yml
+++ b/.github/workflows/deploy-pages.yml
@@ -31,11 +31,12 @@ jobs:
- name: Install dependencies
run: npm ci
- - name: Build
+ - name: Build Next.js
run: npm run build
env:
- VITE_FLASK_BACKEND_URL: ${{ vars.VITE_FLASK_BACKEND_URL || '' }}
- VITE_BASE_PATH: ${{ vars.VITE_BASE_PATH || '/' }}
+ BUILD_STATIC: 'true'
+ NEXT_PUBLIC_FLASK_BACKEND_URL: ${{ vars.NEXT_PUBLIC_FLASK_BACKEND_URL || '' }}
+ NEXT_PUBLIC_BASE_PATH: ${{ vars.NEXT_PUBLIC_BASE_PATH || '' }}
- name: Setup Pages
uses: actions/configure-pages@v4
@@ -43,7 +44,7 @@ jobs:
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
- path: './dist'
+ path: './out'
deploy:
environment:
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 9c8696c..3332c64 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -117,5 +117,5 @@ jobs:
cache-from: type=gha,scope=frontend
cache-to: type=gha,mode=max,scope=frontend
build-args: |
- VITE_FLASK_BACKEND_URL=${{ vars.VITE_FLASK_BACKEND_URL || '' }}
- VITE_BASE_PATH=${{ vars.VITE_BASE_PATH || '/' }}
+ NEXT_PUBLIC_FLASK_BACKEND_URL=${{ vars.NEXT_PUBLIC_FLASK_BACKEND_URL || '' }}
+ NEXT_PUBLIC_BASE_PATH=${{ vars.NEXT_PUBLIC_BASE_PATH || '' }}
diff --git a/.gitignore b/.gitignore
index 6cfe203..a8a84fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,12 @@ dist-ssr
*-dist
*.local
+# Next.js
+/.next/
+/out/
+next-env.d.ts
+.vercel
+
# Editor directories and files
.vscode/*
!.vscode/extensions.json
@@ -25,6 +31,8 @@ dist-ssr
*.sw?
.env
+.env.local
+.env*.local
**/agent-eval-report*
packages
pids
diff --git a/Dockerfile b/Dockerfile
index ef0c9cb..4f89310 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,26 +3,37 @@ FROM node:20-alpine AS builder
WORKDIR /app
+# Copy package files
COPY package*.json ./
RUN npm ci
+# Copy source code
COPY . .
-ARG VITE_FLASK_BACKEND_URL
-ENV VITE_FLASK_BACKEND_URL=$VITE_FLASK_BACKEND_URL
-
-ARG VITE_BASE_PATH
-ENV VITE_BASE_PATH=$VITE_BASE_PATH
+# Build arguments for environment variables
+ARG NEXT_PUBLIC_FLASK_BACKEND_URL
+ARG NEXT_PUBLIC_BASE_PATH
+ENV NEXT_PUBLIC_FLASK_BACKEND_URL=$NEXT_PUBLIC_FLASK_BACKEND_URL
+ENV NEXT_PUBLIC_BASE_PATH=$NEXT_PUBLIC_BASE_PATH
+# Build Next.js app
RUN npm run build
# Production stage
-FROM nginx:alpine
+FROM node:20-alpine AS runner
-COPY --from=builder /app/dist /usr/share/nginx/html
+WORKDIR /app
-COPY nginx.conf /etc/nginx/conf.d/default.conf
+ENV NODE_ENV=production
+
+# Copy necessary files from builder
+COPY --from=builder /app/public ./public
+COPY --from=builder /app/.next/standalone ./
+COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
-CMD ["nginx", "-g", "daemon off;"]
+ENV PORT=3000
+ENV HOSTNAME="0.0.0.0"
+
+CMD ["node", "server.js"]
diff --git a/docker-compose.production.yml b/docker-compose.production.yml
index 234c7bb..64f1a07 100644
--- a/docker-compose.production.yml
+++ b/docker-compose.production.yml
@@ -18,7 +18,7 @@ services:
build:
context: .
args:
- - VITE_FLASK_BACKEND_URL=https://backend.example.com
+ - NEXT_PUBLIC_FLASK_BACKEND_URL=https://backend.example.com
ports:
- "3000:3000"
depends_on:
diff --git a/docker-compose.yml b/docker-compose.yml
index f70dd80..61a6756 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -16,7 +16,7 @@ services:
build:
context: .
args:
- - VITE_FLASK_BACKEND_URL=http://localhost:5000
+ - NEXT_PUBLIC_FLASK_BACKEND_URL=http://localhost:5000
ports:
- "3000:3000"
depends_on:
diff --git a/index.html b/index.html
deleted file mode 100644
index a1a2dd9..0000000
--- a/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- CodeSnippet - Share & Run Code (Python, React & More)
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 0000000..b74fb38
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,14 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: process.env.BUILD_STATIC ? 'export' : 'standalone',
+ basePath: process.env.NEXT_PUBLIC_BASE_PATH || '',
+ turbopack: {},
+ images: {
+ unoptimized: true,
+ },
+ experimental: {
+ optimizePackageImports: ['@radix-ui/react-icons', '@phosphor-icons/react'],
+ },
+};
+
+export default nextConfig;
diff --git a/nginx.conf b/nginx.conf
deleted file mode 100644
index ae726e1..0000000
--- a/nginx.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-server {
- listen 3000;
- server_name localhost;
- root /usr/share/nginx/html;
- index index.html;
-
- location / {
- try_files $uri $uri/ /index.html;
-
- add_header Cache-Control "no-cache, no-store, must-revalidate";
- add_header Pragma "no-cache";
- add_header Expires "0";
- }
-
- location /api {
- proxy_pass http://backend:5000;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_cache_bypass $http_upgrade;
-
- proxy_buffering off;
- proxy_request_buffering off;
- }
-}
diff --git a/package-lock.json b/package-lock.json
index 8501272..2dbf27b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -44,7 +44,6 @@
"@radix-ui/react-tooltip": "^1.1.8",
"@reduxjs/toolkit": "^2.11.2",
"@tailwindcss/container-queries": "^0.1.1",
- "@tailwindcss/vite": "^4.1.11",
"@tanstack/react-query": "^5.83.1",
"@types/sql.js": "^1.4.9",
"class-variance-authority": "^0.7.1",
@@ -57,6 +56,7 @@
"input-otp": "^1.4.2",
"lucide-react": "^0.484.0",
"marked": "^15.0.7",
+ "next": "16.1.3",
"next-themes": "^0.4.6",
"octokit": "^4.1.2",
"pyodide": "^0.29.1",
@@ -70,7 +70,6 @@
"react-router-dom": "^7.12.0",
"recharts": "^2.15.1",
"sonner": "^2.0.1",
- "sql.js": "^1.13.0",
"tailwind-merge": "^3.0.2",
"three": "^0.175.0",
"tw-animate-css": "^1.2.4",
@@ -80,18 +79,17 @@
},
"devDependencies": {
"@eslint/js": "^9.21.0",
- "@tailwindcss/postcss": "^4.1.8",
+ "@tailwindcss/postcss": "^4.1.18",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react-swc": "^4.2.2",
+ "autoprefixer": "^10.4.23",
"eslint": "^9.28.0",
+ "eslint-config-next": "^16.1.3",
"eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-react-refresh": "^0.4.19",
"globals": "^16.0.0",
"tailwindcss": "^4.1.11",
"typescript": "~5.7.2",
- "typescript-eslint": "^8.38.0",
- "vite": "^7.2.6"
+ "typescript-eslint": "^8.38.0"
},
"workspaces": {
"packages": [
@@ -112,6 +110,256 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
+ "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
+ "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
+ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/generator": "^7.28.6",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@babel/core/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@babel/core/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
+ "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
+ "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.6"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
@@ -130,12 +378,118 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
+ "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/generator": "^7.28.6",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.6",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@date-fns/tz": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz",
"integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==",
"license": "MIT"
},
+ "node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
@@ -148,6 +502,7 @@
"os": [
"aix"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -164,6 +519,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -180,6 +536,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -196,6 +553,7 @@
"os": [
"android"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -212,6 +570,7 @@
"os": [
"darwin"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -228,6 +587,7 @@
"os": [
"darwin"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -244,6 +604,7 @@
"os": [
"freebsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -260,6 +621,7 @@
"os": [
"freebsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -276,6 +638,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -292,6 +655,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -308,6 +672,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -324,6 +689,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -340,6 +706,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -356,6 +723,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -372,6 +740,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -388,6 +757,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -404,6 +774,7 @@
"os": [
"linux"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -420,6 +791,7 @@
"os": [
"netbsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -436,6 +808,7 @@
"os": [
"netbsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -452,6 +825,7 @@
"os": [
"openbsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -468,6 +842,7 @@
"os": [
"openbsd"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -484,6 +859,7 @@
"os": [
"openharmony"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -500,6 +876,7 @@
"os": [
"sunos"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -516,6 +893,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -532,6 +910,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -548,6 +927,7 @@
"os": [
"win32"
],
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -1270,10 +1650,477 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@img/colour": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
+ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -1284,6 +2131,7 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -1294,6 +2142,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1303,12 +2152,14 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -1338,6 +2189,211 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.3.tgz",
+ "integrity": "sha512-BLP14oBOvZWXgfdJf9ao+VD8O30uE+x7PaV++QtACLX329WcRSJRO5YJ+Bcvu0Q+c/lei41TjSiFf6pXqnpbQA==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.3.tgz",
+ "integrity": "sha512-MqBh3ltFAy0AZCRFVdjVjjeV7nEszJDaVIpDAnkQcn8U9ib6OEwkSnuK6xdYxMGPhV/Y4IlY6RbDipPOpLfBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.3.tgz",
+ "integrity": "sha512-CpOD3lmig6VflihVoGxiR/l5Jkjfi4uLaOR4ziriMv0YMDoF6cclI+p5t2nstM8TmaFiY6PCTBgRWB57/+LiBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.3.tgz",
+ "integrity": "sha512-aF4us2JXh0zn3hNxvL1Bx3BOuh8Lcw3p3Xnurlvca/iptrDH1BrpObwkw9WZra7L7/0qB9kjlREq3hN/4x4x+Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.3.tgz",
+ "integrity": "sha512-8VRkcpcfBtYvhGgXAF7U3MBx6+G1lACM1XCo1JyaUr4KmAkTNP8Dv2wdMq7BI+jqRBw3zQE7c57+lmp7jCFfKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.3.tgz",
+ "integrity": "sha512-UbFx69E2UP7MhzogJRMFvV9KdEn4sLGPicClwgqnLht2TEi204B71HuVfps3ymGAh0c44QRAF+ZmvZZhLLmhNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.3.tgz",
+ "integrity": "sha512-SzGTfTjR5e9T+sZh5zXqG/oeRQufExxBF6MssXS7HPeZFE98JDhCRZXpSyCfWrWrYrzmnw/RVhlP2AxQm+wkRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.3.tgz",
+ "integrity": "sha512-HlrDpj0v+JBIvQex1mXHq93Mht5qQmfyci+ZNwGClnAQldSfxI6h0Vupte1dSR4ueNv4q7qp5kTnmLOBIQnGow==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.3.tgz",
+ "integrity": "sha512-3gFCp83/LSduZMSIa+lBREP7+5e7FxpdBoc9QrCdmp+dapmTK9I+SLpY60Z39GDmTXSZA4huGg9WwmYbr6+WRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.3.tgz",
+ "integrity": "sha512-1SZVfFT8zmMB+Oblrh5OKDvUo5mYQOkX2We6VGzpg7JUVZlqe4DYOFGKYZKTweSx1gbMixyO1jnFT4thU+nNHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
"node_modules/@octokit/app": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@octokit/app/-/app-15.1.6.tgz",
@@ -3333,13 +4389,6 @@
}
}
},
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-beta.47",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz",
- "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.53.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz",
@@ -3351,7 +4400,8 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.53.3",
@@ -3364,7 +4414,8 @@
"optional": true,
"os": [
"android"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.53.3",
@@ -3377,7 +4428,8 @@
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.53.3",
@@ -3390,7 +4442,8 @@
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.53.3",
@@ -3403,7 +4456,8 @@
"optional": true,
"os": [
"freebsd"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.53.3",
@@ -3416,7 +4470,8 @@
"optional": true,
"os": [
"freebsd"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.53.3",
@@ -3429,7 +4484,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.53.3",
@@ -3442,7 +4498,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.53.3",
@@ -3455,7 +4512,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.53.3",
@@ -3468,7 +4526,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
"version": "4.53.3",
@@ -3481,7 +4540,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
"version": "4.53.3",
@@ -3494,7 +4554,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.53.3",
@@ -3507,7 +4568,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.53.3",
@@ -3520,7 +4582,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.53.3",
@@ -3533,7 +4596,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.53.3",
@@ -3546,7 +4610,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.53.3",
@@ -3559,7 +4624,8 @@
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-openharmony-arm64": {
"version": "4.53.3",
@@ -3572,7 +4638,8 @@
"optional": true,
"os": [
"openharmony"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.53.3",
@@ -3585,7 +4652,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.53.3",
@@ -3598,7 +4666,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
"version": "4.53.3",
@@ -3611,7 +4680,8 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.53.3",
@@ -3624,7 +4694,15 @@
"optional": true,
"os": [
"win32"
- ]
+ ],
+ "peer": true
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
@@ -3638,232 +4716,6 @@
"integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
"license": "MIT"
},
- "node_modules/@swc/core": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.3.tgz",
- "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==",
- "dev": true,
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3",
- "@swc/types": "^0.1.25"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/swc"
- },
- "optionalDependencies": {
- "@swc/core-darwin-arm64": "1.15.3",
- "@swc/core-darwin-x64": "1.15.3",
- "@swc/core-linux-arm-gnueabihf": "1.15.3",
- "@swc/core-linux-arm64-gnu": "1.15.3",
- "@swc/core-linux-arm64-musl": "1.15.3",
- "@swc/core-linux-x64-gnu": "1.15.3",
- "@swc/core-linux-x64-musl": "1.15.3",
- "@swc/core-win32-arm64-msvc": "1.15.3",
- "@swc/core-win32-ia32-msvc": "1.15.3",
- "@swc/core-win32-x64-msvc": "1.15.3"
- },
- "peerDependencies": {
- "@swc/helpers": ">=0.5.17"
- },
- "peerDependenciesMeta": {
- "@swc/helpers": {
- "optional": true
- }
- }
- },
- "node_modules/@swc/core-darwin-arm64": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz",
- "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-darwin-x64": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz",
- "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz",
- "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz",
- "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz",
- "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz",
- "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-musl": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz",
- "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz",
- "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz",
- "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz",
- "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/@swc/types": {
- "version": "0.1.25",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz",
- "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3"
- }
- },
"node_modules/@tailwindcss/container-queries": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz",
@@ -3874,9 +4726,10 @@
}
},
"node_modules/@tailwindcss/node": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz",
- "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz",
+ "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
@@ -3885,39 +4738,41 @@
"lightningcss": "1.30.2",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.1.17"
+ "tailwindcss": "4.1.18"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz",
- "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz",
+ "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.1.17",
- "@tailwindcss/oxide-darwin-arm64": "4.1.17",
- "@tailwindcss/oxide-darwin-x64": "4.1.17",
- "@tailwindcss/oxide-freebsd-x64": "4.1.17",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17",
- "@tailwindcss/oxide-linux-arm64-musl": "4.1.17",
- "@tailwindcss/oxide-linux-x64-gnu": "4.1.17",
- "@tailwindcss/oxide-linux-x64-musl": "4.1.17",
- "@tailwindcss/oxide-wasm32-wasi": "4.1.17",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17",
- "@tailwindcss/oxide-win32-x64-msvc": "4.1.17"
+ "@tailwindcss/oxide-android-arm64": "4.1.18",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.18",
+ "@tailwindcss/oxide-darwin-x64": "4.1.18",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.18",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.18",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.18",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.18",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.18",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.18"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz",
- "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz",
+ "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3928,12 +4783,13 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz",
- "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz",
+ "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3944,12 +4800,13 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz",
- "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz",
+ "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3960,12 +4817,13 @@
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz",
- "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz",
+ "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3976,12 +4834,13 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz",
- "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz",
+ "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==",
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3992,12 +4851,13 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz",
- "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz",
+ "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4008,12 +4868,13 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz",
- "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz",
+ "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4024,12 +4885,13 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz",
- "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz",
+ "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4040,12 +4902,13 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz",
- "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz",
+ "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4056,9 +4919,9 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz",
- "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz",
+ "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -4070,13 +4933,14 @@
"cpu": [
"wasm32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.6.0",
- "@emnapi/runtime": "^1.6.0",
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
"@emnapi/wasi-threads": "^1.1.0",
- "@napi-rs/wasm-runtime": "^1.0.7",
+ "@napi-rs/wasm-runtime": "^1.1.0",
"@tybys/wasm-util": "^0.10.1",
"tslib": "^2.4.0"
},
@@ -4084,67 +4948,14 @@
"node": ">=14.0.0"
}
},
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.6.0",
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.1.0",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.6.0",
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.1.0",
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.0.7",
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.5.0",
- "@emnapi/runtime": "^1.5.0",
- "@tybys/wasm-util": "^0.10.1"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
- "version": "0.10.1",
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
- "version": "2.8.1",
- "inBundle": true,
- "license": "0BSD",
- "optional": true
- },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz",
- "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz",
+ "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4155,12 +4966,13 @@
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz",
- "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
+ "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -4171,31 +4983,17 @@
}
},
"node_modules/@tailwindcss/postcss": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz",
- "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz",
+ "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "4.1.17",
- "@tailwindcss/oxide": "4.1.17",
+ "@tailwindcss/node": "4.1.18",
+ "@tailwindcss/oxide": "4.1.18",
"postcss": "^8.4.41",
- "tailwindcss": "4.1.17"
- }
- },
- "node_modules/@tailwindcss/vite": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz",
- "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==",
- "license": "MIT",
- "dependencies": {
- "@tailwindcss/node": "4.1.17",
- "@tailwindcss/oxide": "4.1.17",
- "tailwindcss": "4.1.17"
- },
- "peerDependencies": {
- "vite": "^5.2.0 || ^6 || ^7"
+ "tailwindcss": "4.1.18"
}
},
"node_modules/@tanstack/query-core": {
@@ -4224,6 +5022,17 @@
"react": "^18 || ^19"
}
},
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@types/aws-lambda": {
"version": "8.10.159",
"resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.159.tgz",
@@ -4312,6 +5121,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
"version": "22.19.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz",
@@ -4722,23 +5538,275 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@vitejs/plugin-react-swc": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.2.tgz",
- "integrity": "sha512-x+rE6tsxq/gxrEJN3Nv3dIV60lFflPj94c90b+NNo6n1QV1QQUTLoL0MpaOVasUZ0zqVBn7ead1B5ecx1JAGfA==",
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@rolldown/pluginutils": "1.0.0-beta.47",
- "@swc/core": "^1.13.5"
+ "@napi-rs/wasm-runtime": "^0.2.11"
},
"engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "peerDependencies": {
- "vite": "^4 || ^5 || ^6 || ^7"
+ "node": ">=14.0.0"
}
},
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/accepts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -4756,7 +5824,7 @@
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -4827,6 +5895,266 @@
"node": ">=10"
}
},
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.23",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz",
+ "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1",
+ "caniuse-lite": "^1.0.30001760",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz",
+ "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -4834,6 +6162,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.9.15",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz",
+ "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
"node_modules/before-after-hook": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
@@ -4881,6 +6218,53 @@
"concat-map": "0.0.1"
}
},
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -4890,6 +6274,25 @@
"node": ">= 0.8"
}
},
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -4929,6 +6332,26 @@
"node": ">=6"
}
},
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001765",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz",
+ "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -4958,6 +6381,12 @@
"url": "https://polar.sh/cva"
}
},
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -5041,6 +6470,13 @@
"node": ">= 0.6"
}
},
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/cookie": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
@@ -5493,6 +6929,67 @@
"node": ">=12"
}
},
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/date-fns": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
@@ -5531,6 +7028,42 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/delaunator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
@@ -5563,6 +7096,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -5574,6 +7108,19 @@
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
"license": "MIT"
},
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
@@ -5614,6 +7161,13 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"license": "MIT"
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.267",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
+ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/embla-carousel": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
@@ -5642,6 +7196,13 @@
"embla-carousel": "8.6.0"
}
},
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -5652,9 +7213,10 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.18.4",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz",
+ "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -5664,6 +7226,75 @@
"node": ">=10.13.0"
}
},
+ "node_modules/es-abstract": {
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -5682,6 +7313,34 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz",
+ "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.1",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.1.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.3.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.5",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
@@ -5694,12 +7353,60 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/esbuild": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
"integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"bin": {
"esbuild": "bin/esbuild"
},
@@ -5735,6 +7442,16 @@
"@esbuild/win32-x64": "0.25.12"
}
},
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -5814,6 +7531,314 @@
}
}
},
+ "node_modules/eslint-config-next": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.3.tgz",
+ "integrity": "sha512-q2Z87VSsoJcv+vgR+Dm8NPRf+rErXcRktuBR5y3umo/j5zLjIWH7rqBCh3X804gUGKbOrqbgsLUkqDE35C93Gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "16.1.3",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.32.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^7.0.0",
+ "globals": "16.4.0",
+ "typescript-eslint": "^8.46.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/globals": {
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
+ "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+ "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.4.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^2.0.0",
+ "stable-hash": "^0.0.5",
+ "tinyglobby": "^0.2.13",
+ "unrs-resolver": "^1.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
"node_modules/eslint-plugin-react-hooks": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
@@ -5827,14 +7852,32 @@
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
}
},
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz",
- "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==",
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
"dev": true,
"license": "MIT",
- "peerDependencies": {
- "eslint": ">=8.40"
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
"node_modules/eslint-scope": {
@@ -6147,6 +8190,36 @@
"node": ">=6.0.0"
}
},
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -6161,6 +8234,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -6191,6 +8274,19 @@
"node": ">=16.0.0"
}
},
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/finalhandler": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
@@ -6273,6 +8369,22 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -6282,6 +8394,20 @@
"node": ">= 0.6"
}
},
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
"node_modules/framer-motion": {
"version": "12.23.25",
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz",
@@ -6328,6 +8454,7 @@
"os": [
"darwin"
],
+ "peer": true,
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
@@ -6341,6 +8468,57 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -6387,6 +8565,37 @@
"node": ">= 0.4"
}
},
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -6413,6 +8622,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -6429,6 +8655,7 @@
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/graphemer": {
@@ -6438,6 +8665,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6448,6 +8688,35 @@
"node": ">=8"
}
},
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -6460,6 +8729,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -6472,6 +8757,23 @@
"node": ">= 0.4"
}
},
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
@@ -6567,6 +8869,21 @@
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
}
},
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
@@ -6585,6 +8902,151 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -6595,6 +9057,42 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -6608,12 +9106,217 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT"
},
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -6621,10 +9324,29 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/jiti": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "devOptional": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
@@ -6649,6 +9371,19 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -6670,6 +9405,35 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -6680,6 +9444,26 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -6698,6 +9482,7 @@
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "devOptional": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -6730,6 +9515,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6750,6 +9536,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6770,6 +9557,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6790,6 +9578,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6810,6 +9599,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6830,6 +9620,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6850,6 +9641,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6870,6 +9662,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6890,6 +9683,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6910,6 +9704,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6930,6 +9725,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -6984,6 +9780,16 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
"node_modules/lucide-react": {
"version": "0.484.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.484.0.tgz",
@@ -6997,6 +9803,7 @@
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
@@ -7044,6 +9851,43 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/mime-db": {
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
@@ -7082,6 +9926,16 @@
"node": "*"
}
},
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/monaco-editor": {
"version": "0.55.1",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz",
@@ -7145,6 +9999,22 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -7161,6 +10031,59 @@
"node": ">= 0.6"
}
},
+ "node_modules/next": {
+ "version": "16.1.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.1.3.tgz",
+ "integrity": "sha512-gthG3TRD+E3/mA0uDQb9lqBmx1zVosq5kIwxNN6+MRNd085GzD+9VXMPUs+GGZCbZ+GDZdODUq4Pm7CTXK6ipw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "16.1.3",
+ "@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.8.3",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "16.1.3",
+ "@next/swc-darwin-x64": "16.1.3",
+ "@next/swc-linux-arm64-gnu": "16.1.3",
+ "@next/swc-linux-arm64-musl": "16.1.3",
+ "@next/swc-linux-x64-gnu": "16.1.3",
+ "@next/swc-linux-x64-musl": "16.1.3",
+ "@next/swc-win32-arm64-msvc": "16.1.3",
+ "@next/swc-win32-x64-msvc": "16.1.3",
+ "sharp": "^0.34.4"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
"node_modules/next-themes": {
"version": "0.4.6",
"resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
@@ -7171,6 +10094,50 @@
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
+ "node_modules/next/node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -7192,6 +10159,106 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/octokit": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/octokit/-/octokit-4.1.4.tgz",
@@ -7253,6 +10320,24 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -7327,6 +10412,13 @@
"node": ">=8"
}
},
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/path-to-regexp": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
@@ -7355,6 +10447,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -7383,6 +10485,13 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -7461,6 +10570,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -7802,12 +10932,77 @@
"redux": "^5.0.0"
}
},
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/reselect": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
"integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
"license": "MIT"
},
+ "node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -7818,6 +11013,27 @@
"node": ">=4"
}
},
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/robust-predicates": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
@@ -7829,6 +11045,7 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz",
"integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/estree": "1.0.8"
},
@@ -7904,12 +11121,91 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"node_modules/rw": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
"integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
"license": "BSD-3-Clause"
},
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -7926,7 +11222,7 @@
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "dev": true,
+ "devOptional": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -8001,12 +11297,106 @@
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"license": "ISC"
},
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -8121,10 +11511,11 @@
"node": ">=0.10.0"
}
},
- "node_modules/sql.js": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.13.0.tgz",
- "integrity": "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA==",
+ "node_modules/stable-hash": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/state-local": {
@@ -8142,6 +11533,143 @@
"node": ">= 0.8"
}
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -8155,6 +11683,29 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8168,6 +11719,19 @@
"node": ">=8"
}
},
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/tailwind-merge": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
@@ -8179,15 +11743,16 @@
}
},
"node_modules/tailwindcss": {
- "version": "4.1.17",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz",
- "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==",
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
+ "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -8225,6 +11790,19 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/toad-cache": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz",
@@ -8256,6 +11834,19 @@
"typescript": ">=4.8.4"
}
},
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -8318,6 +11909,84 @@
"node": ">= 0.6"
}
},
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
@@ -8356,6 +12025,25 @@
"typescript": ">=4.8.4 <6.0.0"
}
},
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -8383,6 +12071,72 @@
"node": ">= 0.8"
}
},
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -8507,6 +12261,7 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz",
"integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
@@ -8592,6 +12347,95 @@
"node": ">= 8"
}
},
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
@@ -8629,6 +12473,13 @@
}
}
},
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -8650,6 +12501,19 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index bf08b84..be224c9 100644
--- a/package.json
+++ b/package.json
@@ -2,14 +2,12 @@
"name": "spark-template",
"private": true,
"version": "0.0.0",
- "type": "module",
"scripts": {
- "dev": "vite",
- "kill": "fuser -k 5000/tcp",
- "build": "tsc -b --noCheck && vite build",
- "lint": "eslint .",
- "optimize": "vite optimize",
- "preview": "vite preview"
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "kill": "fuser -k 5000/tcp"
},
"dependencies": {
"@babel/standalone": "^7.28.6",
@@ -48,7 +46,6 @@
"@radix-ui/react-tooltip": "^1.1.8",
"@reduxjs/toolkit": "^2.11.2",
"@tailwindcss/container-queries": "^0.1.1",
- "@tailwindcss/vite": "^4.1.11",
"@tanstack/react-query": "^5.83.1",
"@types/sql.js": "^1.4.9",
"class-variance-authority": "^0.7.1",
@@ -61,6 +58,7 @@
"input-otp": "^1.4.2",
"lucide-react": "^0.484.0",
"marked": "^15.0.7",
+ "next": "16.1.3",
"next-themes": "^0.4.6",
"octokit": "^4.1.2",
"pyodide": "^0.29.1",
@@ -74,7 +72,6 @@
"react-router-dom": "^7.12.0",
"recharts": "^2.15.1",
"sonner": "^2.0.1",
- "sql.js": "^1.13.0",
"tailwind-merge": "^3.0.2",
"three": "^0.175.0",
"tw-animate-css": "^1.2.4",
@@ -84,18 +81,17 @@
},
"devDependencies": {
"@eslint/js": "^9.21.0",
- "@tailwindcss/postcss": "^4.1.8",
+ "@tailwindcss/postcss": "^4.1.18",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react-swc": "^4.2.2",
+ "autoprefixer": "^10.4.23",
"eslint": "^9.28.0",
+ "eslint-config-next": "^16.1.3",
"eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-react-refresh": "^0.4.19",
"globals": "^16.0.0",
"tailwindcss": "^4.1.11",
"typescript": "~5.7.2",
- "typescript-eslint": "^8.38.0",
- "vite": "^7.2.6"
+ "typescript-eslint": "^8.38.0"
},
"workspaces": {
"packages": [
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..52b9b4b
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: {
+ '@tailwindcss/postcss': {},
+ },
+}
diff --git a/src/App.tsx b/src/app/PageLayout.tsx
similarity index 68%
rename from src/App.tsx
rename to src/app/PageLayout.tsx
index f92ed60..e929b3e 100644
--- a/src/App.tsx
+++ b/src/app/PageLayout.tsx
@@ -1,21 +1,15 @@
-import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
-import { motion } from 'framer-motion'
-import { Code } from '@phosphor-icons/react'
-import { Navigation } from '@/components/layout/navigation/Navigation'
-import { NavigationProvider } from '@/components/layout/navigation/NavigationProvider'
-import { NavigationSidebar } from '@/components/layout/navigation/NavigationSidebar'
-import { useNavigation } from '@/components/layout/navigation/useNavigation'
-import { BackendIndicator } from '@/components/layout/BackendIndicator'
-import { HomePage } from '@/pages/HomePage'
-import { DemoPage } from '@/pages/DemoPage'
-import { AtomsPage } from '@/pages/AtomsPage'
-import { MoleculesPage } from '@/pages/MoleculesPage'
-import { OrganismsPage } from '@/pages/OrganismsPage'
-import { TemplatesPage } from '@/pages/TemplatesPage'
-import { SettingsPage } from '@/pages/SettingsPage'
+'use client';
-function AppContent() {
- const { menuOpen } = useNavigation()
+import { motion } from 'framer-motion';
+import { Code } from '@phosphor-icons/react';
+import { Navigation } from '@/components/layout/navigation/Navigation';
+import { NavigationSidebar } from '@/components/layout/navigation/NavigationSidebar';
+import { useNavigation } from '@/components/layout/navigation/useNavigation';
+import { BackendIndicator } from '@/components/layout/BackendIndicator';
+import { ReactNode } from 'react';
+
+export function PageLayout({ children }: { children: ReactNode }) {
+ const { menuOpen } = useNavigation();
return (
@@ -78,15 +72,7 @@ function AppContent() {
-
- } />
- } />
- } />
- } />
- } />
- } />
- } />
-
+ {children}
- )
+ );
}
-
-function App() {
- return (
-
-
-
-
-
- )
-}
-
-export default App
diff --git a/src/app/atoms/page.tsx b/src/app/atoms/page.tsx
new file mode 100644
index 0000000..418d9ba
--- /dev/null
+++ b/src/app/atoms/page.tsx
@@ -0,0 +1,43 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { AtomsSection } from '@/components/atoms/AtomsSection';
+import type { Snippet } from '@/lib/types';
+import { useCallback } from 'react';
+import { toast } from 'sonner';
+import { createSnippet } from '@/lib/db';
+import { PageLayout } from '../PageLayout';
+
+export default function AtomsPage() {
+ const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
+ try {
+ const newSnippet: Snippet = {
+ ...snippetData,
+ id: Date.now().toString(),
+ createdAt: Date.now(),
+ updatedAt: Date.now(),
+ };
+ await createSnippet(newSnippet);
+ toast.success('Component saved as snippet!');
+ } catch (error) {
+ console.error('Failed to save snippet:', error);
+ toast.error('Failed to save snippet');
+ }
+ }, []);
+
+ return (
+
+
+
+
Atoms
+
Fundamental building blocks - basic HTML elements styled as reusable components
+
+
+
+
+ );
+}
diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx
new file mode 100644
index 0000000..d6f4142
--- /dev/null
+++ b/src/app/demo/page.tsx
@@ -0,0 +1,60 @@
+'use client';
+
+import { useState } from 'react';
+import { motion } from 'framer-motion';
+import { SplitScreenEditor } from '@/components/features/snippet-editor/SplitScreenEditor';
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
+import { Sparkle } from '@phosphor-icons/react';
+import { DEMO_CODE } from '@/components/demo/demo-constants';
+import { DemoFeatureCards } from '@/components/demo/DemoFeatureCards';
+import { PageLayout } from '../PageLayout';
+
+export default function DemoPage() {
+ const [code, setCode] = useState(DEMO_CODE);
+
+ return (
+
+
+
+
+
+
+
+
Split-Screen Demo
+
+
+ Experience live React component editing with real-time preview. Edit the code on the left and watch it update instantly on the right.
+
+
+
+
+
+
+
+ Interactive Code Editor
+
+
+ This editor supports JSX, TSX, JavaScript, and TypeScript with live preview.
+ Try switching between Code, Split, and Preview modes using the buttons above the editor.
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..b59ced0
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,49 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --primary: 263 70% 50%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --accent: 195 100% 70%;
+ --accent-foreground: 222.2 84% 4.9%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 195 100% 70%;
+ --radius: 0.5rem;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: var(--font-inter), 'Inter', sans-serif;
+}
+
+body {
+ font-family: var(--font-inter), 'Inter', sans-serif;
+}
+
+code, pre {
+ font-family: var(--font-jetbrains-mono), 'JetBrains Mono', monospace;
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..932bca6
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,29 @@
+import type { Metadata } from 'next';
+import './globals.css';
+import { Providers } from './providers';
+
+export const metadata: Metadata = {
+ title: 'CodeSnippet - Share & Run Code (Python, React & More)',
+ description: 'Save, organize, and share your code snippets with beautiful syntax highlighting and live execution',
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/app/molecules/page.tsx b/src/app/molecules/page.tsx
new file mode 100644
index 0000000..27776b3
--- /dev/null
+++ b/src/app/molecules/page.tsx
@@ -0,0 +1,43 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { MoleculesSection } from '@/components/molecules/MoleculesSection';
+import type { Snippet } from '@/lib/types';
+import { useCallback } from 'react';
+import { toast } from 'sonner';
+import { createSnippet } from '@/lib/db';
+import { PageLayout } from '../PageLayout';
+
+export default function MoleculesPage() {
+ const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
+ try {
+ const newSnippet: Snippet = {
+ ...snippetData,
+ id: Date.now().toString(),
+ createdAt: Date.now(),
+ updatedAt: Date.now(),
+ };
+ await createSnippet(newSnippet);
+ toast.success('Component saved as snippet!');
+ } catch (error) {
+ console.error('Failed to save snippet:', error);
+ toast.error('Failed to save snippet');
+ }
+ }, []);
+
+ return (
+
+
+
+
Molecules
+
Simple combinations of atoms that work together as functional units
+
+
+
+
+ );
+}
diff --git a/src/app/organisms/page.tsx b/src/app/organisms/page.tsx
new file mode 100644
index 0000000..f5e4aa2
--- /dev/null
+++ b/src/app/organisms/page.tsx
@@ -0,0 +1,43 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { OrganismsSection } from '@/components/organisms/OrganismsSection';
+import type { Snippet } from '@/lib/types';
+import { useCallback } from 'react';
+import { toast } from 'sonner';
+import { createSnippet } from '@/lib/db';
+import { PageLayout } from '../PageLayout';
+
+export default function OrganismsPage() {
+ const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
+ try {
+ const newSnippet: Snippet = {
+ ...snippetData,
+ id: Date.now().toString(),
+ createdAt: Date.now(),
+ updatedAt: Date.now(),
+ };
+ await createSnippet(newSnippet);
+ toast.success('Component saved as snippet!');
+ } catch (error) {
+ console.error('Failed to save snippet:', error);
+ toast.error('Failed to save snippet');
+ }
+ }, []);
+
+ return (
+
+
+
+
Organisms
+
Complex UI components composed of molecules and atoms
+
+
+
+
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..fcb84a0
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,23 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { SnippetManagerRedux } from '@/components/SnippetManagerRedux';
+import { PageLayout } from './PageLayout';
+
+export default function HomePage() {
+ return (
+
+
+
+
My Snippets
+
Save, organize, and share your code snippets
+
+
+
+
+ );
+}
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
new file mode 100644
index 0000000..23b2730
--- /dev/null
+++ b/src/app/providers.tsx
@@ -0,0 +1,42 @@
+'use client';
+
+import '@github/spark/spark';
+import { ErrorBoundary } from 'react-error-boundary';
+import { Provider } from 'react-redux';
+import { Toaster } from '@/components/ui/sonner';
+import { store } from '@/store';
+import { ErrorFallback } from '@/components/error/ErrorFallback';
+import { NavigationProvider } from '@/components/layout/navigation/NavigationProvider';
+import { useEffect } from 'react';
+import { loadStorageConfig } from '@/lib/storage';
+
+const logErrorToConsole = (error: Error, info: { componentStack?: string }) => {
+ console.error('Application Error:', error);
+ if (info.componentStack) {
+ console.error('Component Stack:', info.componentStack);
+ }
+};
+
+function StorageInitializer() {
+ useEffect(() => {
+ loadStorageConfig();
+ }, []);
+ return null;
+}
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx
new file mode 100644
index 0000000..55d950e
--- /dev/null
+++ b/src/app/settings/page.tsx
@@ -0,0 +1,105 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { PersistenceSettings } from '@/components/demo/PersistenceSettings';
+import { SchemaHealthCard } from '@/components/settings/SchemaHealthCard';
+import { BackendAutoConfigCard } from '@/components/settings/BackendAutoConfigCard';
+import { StorageBackendCard } from '@/components/settings/StorageBackendCard';
+import { DatabaseStatsCard } from '@/components/settings/DatabaseStatsCard';
+import { StorageInfoCard } from '@/components/settings/StorageInfoCard';
+import { DatabaseActionsCard } from '@/components/settings/DatabaseActionsCard';
+import { useSettingsState } from '@/hooks/useSettingsState';
+import { PageLayout } from '../PageLayout';
+
+export default function SettingsPage() {
+ const {
+ stats,
+ loading,
+ storageBackend,
+ setStorageBackend,
+ flaskUrl,
+ setFlaskUrl,
+ flaskConnectionStatus,
+ setFlaskConnectionStatus,
+ testingConnection,
+ envVarSet,
+ schemaHealth,
+ checkingSchema,
+ handleExport,
+ handleImport,
+ handleClear,
+ handleSeed,
+ formatBytes,
+ handleTestConnection,
+ handleSaveStorageConfig,
+ handleMigrateToFlask,
+ handleMigrateToIndexedDB,
+ checkSchemaHealth,
+ } = useSettingsState();
+
+ return (
+
+
+
+
Settings
+
Manage your database and application settings
+
+
+
+
+
+
+
+
+
+
{
+ setFlaskUrl(url);
+ setFlaskConnectionStatus('unknown');
+ }}
+ onTestConnection={handleTestConnection}
+ onSaveConfig={handleSaveStorageConfig}
+ onMigrateToFlask={handleMigrateToFlask}
+ onMigrateToIndexedDB={handleMigrateToIndexedDB}
+ />
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/templates/page.tsx b/src/app/templates/page.tsx
new file mode 100644
index 0000000..3599edc
--- /dev/null
+++ b/src/app/templates/page.tsx
@@ -0,0 +1,43 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { TemplatesSection } from '@/components/templates/TemplatesSection';
+import type { Snippet } from '@/lib/types';
+import { useCallback } from 'react';
+import { toast } from 'sonner';
+import { createSnippet } from '@/lib/db';
+import { PageLayout } from '../PageLayout';
+
+export default function TemplatesPage() {
+ const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
+ try {
+ const newSnippet: Snippet = {
+ ...snippetData,
+ id: Date.now().toString(),
+ createdAt: Date.now(),
+ updatedAt: Date.now(),
+ };
+ await createSnippet(newSnippet);
+ toast.success('Component saved as snippet!');
+ } catch (error) {
+ console.error('Failed to save snippet:', error);
+ toast.error('Failed to save snippet');
+ }
+ }, []);
+
+ return (
+
+
+
+
Templates
+
Page-level layouts that combine organisms into complete interfaces
+
+
+
+
+ );
+}
diff --git a/src/app/theme.css b/src/app/theme.css
new file mode 100644
index 0000000..8da23f2
--- /dev/null
+++ b/src/app/theme.css
@@ -0,0 +1,262 @@
+@import "tailwindcss";
+
+@import '@radix-ui/colors/sage-dark.css' layer(base);
+@import '@radix-ui/colors/olive.css' layer(base);
+@import '@radix-ui/colors/olive-dark.css' layer(base);
+@import '@radix-ui/colors/sand.css' layer(base);
+@import '@radix-ui/colors/sand-dark.css' layer(base);
+@import '@radix-ui/colors/red.css' layer(base);
+@import '@radix-ui/colors/red-dark.css' layer(base);
+@import '@radix-ui/colors/ruby.css' layer(base);
+@import '@radix-ui/colors/ruby-dark.css' layer(base);
+@import '@radix-ui/colors/crimson.css' layer(base);
+@import '@radix-ui/colors/crimson-dark.css' layer(base);
+@import '@radix-ui/colors/pink.css' layer(base);
+@import '@radix-ui/colors/pink-dark.css' layer(base);
+@import '@radix-ui/colors/plum.css' layer(base);
+@import '@radix-ui/colors/plum-dark.css' layer(base);
+@import '@radix-ui/colors/purple.css' layer(base);
+@import '@radix-ui/colors/purple-dark.css' layer(base);
+@import '@radix-ui/colors/violet.css' layer(base);
+@import '@radix-ui/colors/violet-dark.css' layer(base);
+@import '@radix-ui/colors/iris.css' layer(base);
+@import '@radix-ui/colors/iris-dark.css' layer(base);
+@import '@radix-ui/colors/indigo.css' layer(base);
+@import '@radix-ui/colors/indigo-dark.css' layer(base);
+@import '@radix-ui/colors/blue.css' layer(base);
+@import '@radix-ui/colors/blue-dark.css' layer(base);
+@import '@radix-ui/colors/cyan.css' layer(base);
+@import '@radix-ui/colors/cyan-dark.css' layer(base);
+@import '@radix-ui/colors/teal.css' layer(base);
+@import '@radix-ui/colors/teal-dark.css' layer(base);
+@import '@radix-ui/colors/jade.css' layer(base);
+@import '@radix-ui/colors/jade-dark.css' layer(base);
+@import '@radix-ui/colors/green.css' layer(base);
+@import '@radix-ui/colors/green-dark.css' layer(base);
+@import '@radix-ui/colors/grass.css' layer(base);
+@import '@radix-ui/colors/grass-dark.css' layer(base);
+@import '@radix-ui/colors/bronze.css' layer(base);
+@import '@radix-ui/colors/bronze-dark.css' layer(base);
+@import '@radix-ui/colors/gold.css' layer(base);
+@import '@radix-ui/colors/gold-dark.css' layer(base);
+@import '@radix-ui/colors/brown.css' layer(base);
+@import '@radix-ui/colors/brown-dark.css' layer(base);
+@import '@radix-ui/colors/orange.css' layer(base);
+@import '@radix-ui/colors/orange-dark.css' layer(base);
+@import '@radix-ui/colors/amber.css' layer(base);
+@import '@radix-ui/colors/amber-dark.css' layer(base);
+@import '@radix-ui/colors/yellow.css' layer(base);
+@import '@radix-ui/colors/yellow-dark.css' layer(base);
+@import '@radix-ui/colors/lime.css' layer(base);
+@import '@radix-ui/colors/lime-dark.css' layer(base);
+@import '@radix-ui/colors/mint.css' layer(base);
+@import '@radix-ui/colors/mint-dark.css' layer(base);
+@import '@radix-ui/colors/sky.css' layer(base);
+@import '@radix-ui/colors/sky-dark.css' layer(base);
+@import '@radix-ui/colors/tomato.css' layer(base);
+@import '@radix-ui/colors/tomato-dark.css' layer(base);
+@import '@radix-ui/colors/gray.css' layer(base);
+@import '@radix-ui/colors/gray-dark.css' layer(base);
+@import '@radix-ui/colors/mauve.css' layer(base);
+@import '@radix-ui/colors/mauve-dark.css' layer(base);
+@import '@radix-ui/colors/slate.css' layer(base);
+@import '@radix-ui/colors/slate-dark.css' layer(base);
+@import '@radix-ui/colors/slate-alpha.css' layer(base);
+@import '@radix-ui/colors/slate-dark-alpha.css' layer(base);
+
+@import 'tailwindcss/theme' layer(theme);
+
+@import 'tailwindcss/preflight' layer(base);
+
+/*
+ The default border color has changed to `currentColor` in Tailwind CSS v4,
+ so we've added these compatibility styles to make sure everything still
+ looks the same as it did with Tailwind CSS v3.
+
+ If we ever want to remove these styles, we need to add an explicit border
+ color utility to any element that depends on these defaults.
+*/
+@layer base {
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ border-color: var(--color-gray-200, currentColor);
+ }
+}
+
+@layer base {
+ #spark-app {
+ --tomato-contrast: #fff;
+ --red-contrast: #fff;
+ --ruby-contrast: #fff;
+ --crimson-contrast: #fff;
+ --pink-contrast: #fff;
+ --plum-contrast: #fff;
+ --purple-contrast: #fff;
+ --violet-contrast: #fff;
+ --iris-contrast: #fff;
+ --indigo-contrast: #fff;
+ --blue-contrast: #fff;
+ --cyan-contrast: #fff;
+ --teal-contrast: #fff;
+ --jade-contrast: #fff;
+ --green-contrast: #fff;
+ --grass-contrast: #fff;
+ --bronze-contrast: #fff;
+ --gold-contrast: #fff;
+ --brown-contrast: #fff;
+ --orange-contrast: #fff;
+ --amber-contrast: #000;
+ --yellow-contrast: #000;
+ --lime-contrast: #000;
+ --mint-contrast: #000;
+ --sky-contrast: #000;
+ --gray-contrast: #fff;
+ --mauve-contrast: #fff;
+ --slate-contrast: #fff;
+ --sage-contrast: #fff;
+ --olive-contrast: #fff;
+ --sand-contrast: #fff;
+
+ /**
+ * Spacing scale
+ *
+ * These variables define a spacing scale based on Tailwind's default.
+ * We've introduced a --size-scale variable as a multiplier.
+ * By adjusting this single value, we can proportionally
+ * scale all spacing throughout the entire application.
+ *
+ * https://tailwindcss.com/docs/customizing-spacing#default-spacing-scale
+ */
+ --size-scale: 1;
+ --size-0: 0px;
+ --size-px: 1px;
+ --size-0-5: calc(0.125rem * var(--size-scale));
+ --size-1: calc(0.25rem * var(--size-scale));
+ --size-1-5: calc(0.375rem * var(--size-scale));
+ --size-2: calc(0.5rem * var(--size-scale));
+ --size-2-5: calc(0.625rem * var(--size-scale));
+ --size-3: calc(0.75rem * var(--size-scale));
+ --size-3-5: calc(0.875rem * var(--size-scale));
+ --size-4: calc(1rem * var(--size-scale));
+ --size-5: calc(1.25rem * var(--size-scale));
+ --size-6: calc(1.5rem * var(--size-scale));
+ --size-7: calc(1.75rem * var(--size-scale));
+ --size-8: calc(2rem * var(--size-scale));
+ --size-9: calc(2.25rem * var(--size-scale));
+ --size-10: calc(2.5rem * var(--size-scale));
+ --size-11: calc(2.75rem * var(--size-scale));
+ --size-12: calc(3rem * var(--size-scale));
+ --size-14: calc(3.5rem * var(--size-scale));
+ --size-16: calc(4rem * var(--size-scale));
+ --size-20: calc(5rem * var(--size-scale));
+ --size-24: calc(6rem * var(--size-scale));
+ --size-28: calc(7rem * var(--size-scale));
+ --size-32: calc(8rem * var(--size-scale));
+ --size-36: calc(9rem * var(--size-scale));
+ --size-40: calc(10rem * var(--size-scale));
+ --size-44: calc(11rem * var(--size-scale));
+ --size-48: calc(12rem * var(--size-scale));
+ --size-52: calc(13rem * var(--size-scale));
+ --size-56: calc(14rem * var(--size-scale));
+ --size-60: calc(15rem * var(--size-scale));
+ --size-64: calc(16rem * var(--size-scale));
+ --size-72: calc(18rem * var(--size-scale));
+ --size-80: calc(20rem * var(--size-scale));
+ --size-96: calc(24rem * var(--size-scale));
+
+ /* Border radii */
+ --radius-factor: 1;
+ --radius-sm: calc(2px * var(--radius-factor) * var(--size-scale));
+ --radius-md: calc(6px * var(--radius-factor) * var(--size-scale));
+ --radius-lg: calc(8px * var(--radius-factor) * var(--size-scale));
+ --radius-xl: calc(12px * var(--radius-factor) * var(--size-scale));
+ --radius-2xl: calc(16px * var(--radius-factor) * var(--size-scale));
+ --radius-full: 9999px;
+
+ /* Neutral colors */
+ --color-neutral-1: var(--slate-1);
+ --color-neutral-2: var(--slate-2);
+ --color-neutral-3: var(--slate-3);
+ --color-neutral-4: var(--slate-4);
+ --color-neutral-5: var(--slate-5);
+ --color-neutral-6: var(--slate-6);
+ --color-neutral-7: var(--slate-7);
+ --color-neutral-8: var(--slate-8);
+ --color-neutral-9: var(--slate-9);
+ --color-neutral-10: var(--slate-10);
+ --color-neutral-11: var(--slate-11);
+ --color-neutral-12: var(--slate-12);
+ --color-neutral-a1: var(--slate-a1);
+ --color-neutral-a2: var(--slate-a2);
+ --color-neutral-a3: var(--slate-a3);
+ --color-neutral-a4: var(--slate-a4);
+ --color-neutral-a5: var(--slate-a5);
+ --color-neutral-a6: var(--slate-a6);
+ --color-neutral-a7: var(--slate-a7);
+ --color-neutral-a8: var(--slate-a8);
+ --color-neutral-a9: var(--slate-a9);
+ --color-neutral-a10: var(--slate-a10);
+ --color-neutral-a11: var(--slate-a11);
+ --color-neutral-a12: var(--slate-a12);
+ --color-neutral-contrast: var(--slate-contrast);
+
+ /* Accent colors */
+ --color-accent-1: var(--blue-1);
+ --color-accent-2: var(--blue-2);
+ --color-accent-3: var(--blue-3);
+ --color-accent-4: var(--blue-4);
+ --color-accent-5: var(--blue-5);
+ --color-accent-6: var(--blue-6);
+ --color-accent-7: var(--blue-7);
+ --color-accent-8: var(--blue-8);
+ --color-accent-9: var(--blue-9);
+ --color-accent-10: var(--blue-10);
+ --color-accent-11: var(--blue-11);
+ --color-accent-12: var(--blue-12);
+ --color-accent-contrast: var(--blue-contrast);
+
+ /* Secondary accent colors */
+ --color-accent-secondary-1: var(--violet-1);
+ --color-accent-secondary-2: var(--violet-2);
+ --color-accent-secondary-3: var(--violet-3);
+ --color-accent-secondary-4: var(--violet-4);
+ --color-accent-secondary-5: var(--violet-5);
+ --color-accent-secondary-6: var(--violet-6);
+ --color-accent-secondary-7: var(--violet-7);
+ --color-accent-secondary-8: var(--violet-8);
+ --color-accent-secondary-9: var(--violet-9);
+ --color-accent-secondary-10: var(--violet-10);
+ --color-accent-secondary-11: var(--violet-11);
+ --color-accent-secondary-12: var(--violet-12);
+ --color-accent-secondary-contrast: var(--violet-contrast);
+
+ /* Foreground colors */
+ --color-fg: var(--color-neutral-12);
+ --color-fg-secondary: var(--color-neutral-a11);
+
+ /* Background colors */
+ --color-bg: #ffffff;
+ --color-bg-inset: var(--color-neutral-2);
+ --color-bg-overlay: #ffffff;
+
+ /* Focus ring */
+ --color-focus-ring: var(--color-accent-9);
+
+ /* Fonts */
+ --font-sans-serif: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
+ --font-monospace: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
+ "Liberation Mono", "Courier New", monospace;
+ --font-family: var(--font-sans-serif);
+ }
+
+ #spark-app.dark-theme {
+ --color-bg: var(--color-neutral-1);
+ --color-bg-inset: #000000;
+ --color-bg-overlay: var(--color-neutral-3);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/DemoFeatureCards.tsx b/src/components/demo/DemoFeatureCards.tsx
similarity index 100%
rename from src/pages/DemoFeatureCards.tsx
rename to src/components/demo/DemoFeatureCards.tsx
diff --git a/src/pages/demo-constants.ts b/src/components/demo/demo-constants.ts
similarity index 100%
rename from src/pages/demo-constants.ts
rename to src/components/demo/demo-constants.ts
diff --git a/src/components/features/namespace-manager/NamespaceSelector.tsx b/src/components/features/namespace-manager/NamespaceSelector.tsx
index 0d034c1..629ba05 100644
--- a/src/components/features/namespace-manager/NamespaceSelector.tsx
+++ b/src/components/features/namespace-manager/NamespaceSelector.tsx
@@ -59,7 +59,13 @@ export function NamespaceSelector({ selectedNamespaceId, onNamespaceChange }: Na
setLoading(true)
try {
- const newNamespace = await createNamespace(newNamespaceName.trim())
+ const newNamespace: Namespace = {
+ id: Date.now().toString(),
+ name: newNamespaceName.trim(),
+ createdAt: Date.now(),
+ isDefault: false,
+ }
+ await createNamespace(newNamespace)
setNamespaces(prev => [...prev, newNamespace])
setNewNamespaceName('')
setCreateDialogOpen(false)
diff --git a/src/components/features/snippet-viewer/SnippetViewer.tsx b/src/components/features/snippet-viewer/SnippetViewer.tsx
index 3815fe9..0ab2827 100644
--- a/src/components/features/snippet-viewer/SnippetViewer.tsx
+++ b/src/components/features/snippet-viewer/SnippetViewer.tsx
@@ -34,7 +34,7 @@ export function SnippetViewer({ snippet, open, onOpenChange, onEdit, onCopy }: S
onEdit(snippet)
}
- const canPreview = snippet.hasPreview && appConfig.previewEnabledLanguages.includes(snippet.language)
+ const canPreview = !!(snippet.hasPreview && appConfig.previewEnabledLanguages.includes(snippet.language))
const isPython = snippet.language === 'Python'
return (
diff --git a/src/components/layout/BackendIndicator.tsx b/src/components/layout/BackendIndicator.tsx
index c058a0a..c6918d2 100644
--- a/src/components/layout/BackendIndicator.tsx
+++ b/src/components/layout/BackendIndicator.tsx
@@ -10,7 +10,7 @@ export function BackendIndicator() {
useEffect(() => {
const config = getStorageConfig()
setBackend(config.backend)
- setIsEnvConfigured(Boolean(import.meta.env.VITE_FLASK_BACKEND_URL))
+ setIsEnvConfigured(Boolean(process.env.NEXT_PUBLIC_FLASK_BACKEND_URL))
}, [])
if (backend === 'indexeddb') {
diff --git a/src/components/layout/navigation/NavigationSidebar.tsx b/src/components/layout/navigation/NavigationSidebar.tsx
index 099c131..6246520 100644
--- a/src/components/layout/navigation/NavigationSidebar.tsx
+++ b/src/components/layout/navigation/NavigationSidebar.tsx
@@ -1,14 +1,17 @@
-import { motion } from 'framer-motion'
-import { Link, useLocation } from 'react-router-dom'
-import { X } from '@phosphor-icons/react'
-import { Button } from '@/components/ui/button'
-import { cn } from '@/lib/utils'
-import { navigationItems } from './navigation-items'
-import { useNavigation } from './useNavigation'
+'use client';
+
+import { motion } from 'framer-motion';
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+import { X } from '@phosphor-icons/react';
+import { Button } from '@/components/ui/button';
+import { cn } from '@/lib/utils';
+import { navigationItems } from './navigation-items';
+import { useNavigation } from './useNavigation';
export function NavigationSidebar() {
- const { menuOpen, setMenuOpen } = useNavigation()
- const location = useLocation()
+ const { menuOpen, setMenuOpen } = useNavigation();
+ const pathname = usePathname();
return (
{navigationItems.map((item) => {
- const Icon = item.icon
- const isActive = location.pathname === item.path
+ const Icon = item.icon;
+ const isActive = pathname === item.path;
return (
-
-
+
- )
+ );
})}
@@ -60,5 +63,5 @@ export function NavigationSidebar() {
- )
+ );
}
diff --git a/src/components/settings/BackendAutoConfigCard.tsx b/src/components/settings/BackendAutoConfigCard.tsx
index e932227..979a8cf 100644
--- a/src/components/settings/BackendAutoConfigCard.tsx
+++ b/src/components/settings/BackendAutoConfigCard.tsx
@@ -38,7 +38,7 @@ export function BackendAutoConfigCard({
Configuration Source
- VITE_FLASK_BACKEND_URL
+ NEXT_PUBLIC_FLASK_BACKEND_URL
Status
diff --git a/src/components/settings/StorageBackendCard.tsx b/src/components/settings/StorageBackendCard.tsx
index 80d8d1c..7058523 100644
--- a/src/components/settings/StorageBackendCard.tsx
+++ b/src/components/settings/StorageBackendCard.tsx
@@ -51,7 +51,7 @@ export function StorageBackendCard({
- Storage backend is configured via VITE_FLASK_BACKEND_URL environment variable and cannot be changed here.
+ Storage backend is configured via NEXT_PUBLIC_FLASK_BACKEND_URL environment variable and cannot be changed here.
diff --git a/src/hooks/useDatabaseOperations.ts b/src/hooks/useDatabaseOperations.ts
index ef74549..56cfc99 100644
--- a/src/hooks/useDatabaseOperations.ts
+++ b/src/hooks/useDatabaseOperations.ts
@@ -37,11 +37,7 @@ export function useDatabaseOperations() {
setCheckingSchema(true)
try {
const result = await validateDatabaseSchema()
- setSchemaHealth(result.valid ? 'healthy' : 'corrupted')
-
- if (!result.valid) {
- console.warn('Schema validation failed:', result.issues)
- }
+ setSchemaHealth(result ? 'healthy' : 'corrupted')
} catch (error) {
console.error('Schema check failed:', error)
setSchemaHealth('corrupted')
@@ -52,12 +48,12 @@ export function useDatabaseOperations() {
const handleExport = useCallback(async () => {
try {
- const data = await exportDatabase()
- const blob = new Blob([new Uint8Array(data)], { type: 'application/octet-stream' })
+ const jsonData = await exportDatabase()
+ const blob = new Blob([jsonData], { type: 'application/json' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
- a.download = `codesnippet-backup-${Date.now()}.db`
+ a.download = `codesnippet-backup-${Date.now()}.json`
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
@@ -74,9 +70,8 @@ export function useDatabaseOperations() {
if (!file) return
try {
- const arrayBuffer = await file.arrayBuffer()
- const data = new Uint8Array(arrayBuffer)
- await importDatabase(data)
+ const text = await file.text()
+ await importDatabase(text)
toast.success('Database imported successfully')
await loadStats()
} catch (error) {
diff --git a/src/hooks/useSettingsState.ts b/src/hooks/useSettingsState.ts
index cf99495..cc206c6 100644
--- a/src/hooks/useSettingsState.ts
+++ b/src/hooks/useSettingsState.ts
@@ -51,6 +51,10 @@ export function useSettingsState() {
await migrateToFlask(flaskUrl, loadStats)
}
+ const handleMigrateToIndexedDBWrapper = async () => {
+ await handleMigrateToIndexedDB(flaskUrl)
+ }
+
return {
stats,
loading,
@@ -72,7 +76,7 @@ export function useSettingsState() {
handleTestConnection,
handleSaveStorageConfig,
handleMigrateToFlask,
- handleMigrateToIndexedDB,
+ handleMigrateToIndexedDB: handleMigrateToIndexedDBWrapper,
checkSchemaHealth,
}
}
diff --git a/src/hooks/useStorageConfig.ts b/src/hooks/useStorageConfig.ts
index 0d66b7d..ef72c2e 100644
--- a/src/hooks/useStorageConfig.ts
+++ b/src/hooks/useStorageConfig.ts
@@ -32,7 +32,7 @@ export function useStorageConfig() {
const loadConfig = useCallback(() => {
const config = loadStorageConfig()
- const envFlaskUrl = import.meta.env.VITE_FLASK_BACKEND_URL
+ const envFlaskUrl = process.env.NEXT_PUBLIC_FLASK_BACKEND_URL
const isEnvSet = Boolean(envFlaskUrl)
setEnvVarSet(isEnvSet)
diff --git a/src/lib/db-constants.ts b/src/lib/db-constants.ts
deleted file mode 100644
index eff5427..0000000
--- a/src/lib/db-constants.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Database constants shared across modules
- */
-
-export const DB_KEY = 'codesnippet-db'
-export const IDB_NAME = 'CodeSnippetDB'
-export const IDB_STORE = 'database'
-export const IDB_VERSION = 1
diff --git a/src/lib/db-core/clearDatabase.ts b/src/lib/db-core/clearDatabase.ts
deleted file mode 100644
index 300fbca..0000000
--- a/src/lib/db-core/clearDatabase.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { deleteFromIndexedDB } from '../db-indexeddb'
-import { deleteFromLocalStorage } from '../db-localstorage'
-import { getFlaskAdapter } from './getFlaskAdapter'
-import { initDB } from './initDB'
-import { dbState } from './state'
-
-export async function clearDatabase(): Promise
{
- const adapter = getFlaskAdapter()
- if (adapter) {
- await adapter.wipeDatabase()
- return
- }
-
- await deleteFromIndexedDB()
- deleteFromLocalStorage()
-
- dbState.dbInstance = null
- await initDB()
-}
diff --git a/src/lib/db-core/exportDatabase.ts b/src/lib/db-core/exportDatabase.ts
deleted file mode 100644
index 94937d2..0000000
--- a/src/lib/db-core/exportDatabase.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { initDB } from './initDB'
-
-export async function exportDatabase(): Promise {
- const db = await initDB()
- return db.export()
-}
diff --git a/src/lib/db-core/getDatabaseStats.ts b/src/lib/db-core/getDatabaseStats.ts
deleted file mode 100644
index d545113..0000000
--- a/src/lib/db-core/getDatabaseStats.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { openIndexedDB } from '../db-indexeddb'
-import { DB_KEY } from '../db-constants'
-import { initDB } from './initDB'
-
-export async function getDatabaseStats(): Promise<{
- snippetCount: number
- templateCount: number
- storageType: 'indexeddb' | 'localstorage' | 'none'
- databaseSize: number
-}> {
- const db = await initDB()
-
- const snippetResult = db.exec('SELECT COUNT(*) as count FROM snippets')
- const templateResult = db.exec('SELECT COUNT(*) as count FROM snippet_templates')
-
- const snippetCount = snippetResult[0]?.values[0]?.[0] as number || 0
- const templateCount = templateResult[0]?.values[0]?.[0] as number || 0
-
- const data = db.export()
- const databaseSize = data.length
-
- const hasIDB = await openIndexedDB()
- const hasLocalStorage = typeof localStorage !== 'undefined' && localStorage.getItem(DB_KEY) !== null
- const storageType = hasIDB ? 'indexeddb' : (hasLocalStorage ? 'localstorage' : 'none')
-
- return {
- snippetCount,
- templateCount,
- storageType,
- databaseSize,
- }
-}
diff --git a/src/lib/db-core/getFlaskAdapter.ts b/src/lib/db-core/getFlaskAdapter.ts
deleted file mode 100644
index c2bd475..0000000
--- a/src/lib/db-core/getFlaskAdapter.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { FlaskStorageAdapter, getStorageConfig, loadStorageConfig } from '../storage'
-import { dbState } from './state'
-
-export function getFlaskAdapter(): FlaskStorageAdapter | null {
- if (!dbState.configLoaded) {
- loadStorageConfig()
- dbState.configLoaded = true
- }
-
- const config = getStorageConfig()
- if (config.backend === 'flask' && config.flaskUrl) {
- try {
- if (!dbState.flaskAdapter || dbState.flaskAdapter['baseUrl'] !== config.flaskUrl) {
- dbState.flaskAdapter = new FlaskStorageAdapter(config.flaskUrl)
- }
- return dbState.flaskAdapter
- } catch (error) {
- console.warn('Failed to create Flask adapter:', error)
- return null
- }
- }
- return null
-}
diff --git a/src/lib/db-core/importDatabase.ts b/src/lib/db-core/importDatabase.ts
deleted file mode 100644
index 32ddc0a..0000000
--- a/src/lib/db-core/importDatabase.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import initSqlJs from 'sql.js'
-import { saveDB } from './saveDB'
-import { dbState } from './state'
-
-export async function importDatabase(data: Uint8Array): Promise {
- if (!dbState.sqlInstance) {
- dbState.sqlInstance = await initSqlJs({
- locateFile: (file) => `https://sql.js.org/dist/${file}`,
- })
- }
-
- try {
- dbState.dbInstance = new dbState.sqlInstance.Database(data)
- await saveDB()
- } catch (error) {
- console.error('Failed to import database:', error)
- throw error
- }
-}
diff --git a/src/lib/db-core/initDB.ts b/src/lib/db-core/initDB.ts
deleted file mode 100644
index 62bd660..0000000
--- a/src/lib/db-core/initDB.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import initSqlJs, { Database } from 'sql.js'
-import { loadFromIndexedDB } from '../db-indexeddb'
-import { loadFromLocalStorage } from '../db-localstorage'
-import { createTables, validateSchema } from '../db-schema'
-import { saveDB } from './saveDB'
-import { dbState } from './state'
-import { wipeAndRecreateDB } from './wipeAndRecreateDB'
-
-export async function initDB(): Promise {
- if (dbState.dbInstance) return dbState.dbInstance
-
- if (!dbState.sqlInstance) {
- dbState.sqlInstance = await initSqlJs({
- locateFile: (file) => `https://sql.js.org/dist/${file}`,
- })
- }
-
- let loadedData: Uint8Array | null = null
- let schemaValid = false
-
- loadedData = await loadFromIndexedDB()
-
- if (!loadedData) {
- loadedData = loadFromLocalStorage()
- }
-
- if (loadedData && loadedData.length > 0) {
- try {
- const testDb = new dbState.sqlInstance.Database(loadedData)
- schemaValid = await validateSchema(testDb)
-
- if (schemaValid) {
- dbState.dbInstance = testDb
- } else {
- console.warn('Schema validation failed, wiping database')
- testDb.close()
- await wipeAndRecreateDB()
- dbState.dbInstance = new dbState.sqlInstance.Database()
- }
- } catch (error) {
- console.error('Failed to load saved database, creating new one:', error)
- await wipeAndRecreateDB()
- dbState.dbInstance = new dbState.sqlInstance.Database()
- }
- } else {
- dbState.dbInstance = new dbState.sqlInstance.Database()
- }
-
- if (!dbState.dbInstance) {
- throw new Error('Failed to initialize database')
- }
-
- createTables(dbState.dbInstance)
- await saveDB()
-
- return dbState.dbInstance
-}
diff --git a/src/lib/db-core/saveDB.ts b/src/lib/db-core/saveDB.ts
deleted file mode 100644
index 8584a4d..0000000
--- a/src/lib/db-core/saveDB.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { saveToIndexedDB } from '../db-indexeddb'
-import { saveToLocalStorage } from '../db-localstorage'
-import { dbState } from './state'
-
-export async function saveDB() {
- if (!dbState.dbInstance) return
-
- try {
- const data = dbState.dbInstance.export()
-
- const savedToIDB = await saveToIndexedDB(data)
-
- if (!savedToIDB) {
- saveToLocalStorage(data)
- }
- } catch (error) {
- console.error('Failed to save database:', error)
- }
-}
diff --git a/src/lib/db-core/state.ts b/src/lib/db-core/state.ts
deleted file mode 100644
index 3524251..0000000
--- a/src/lib/db-core/state.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { Database } from 'sql.js'
-import type { FlaskStorageAdapter } from '../storage'
-
-export const dbState = {
- dbInstance: null as Database | null,
- sqlInstance: null as any,
- flaskAdapter: null as FlaskStorageAdapter | null,
- configLoaded: false,
-}
diff --git a/src/lib/db-core/wipeAndRecreateDB.ts b/src/lib/db-core/wipeAndRecreateDB.ts
deleted file mode 100644
index 0765b00..0000000
--- a/src/lib/db-core/wipeAndRecreateDB.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { deleteFromIndexedDB, saveToIndexedDB } from '../db-indexeddb'
-import { deleteFromLocalStorage, saveToLocalStorage } from '../db-localstorage'
-import { dbState } from './state'
-
-export async function wipeAndRecreateDB(): Promise {
- console.warn('Wiping corrupted database and creating fresh schema...')
-
- await saveToIndexedDB(new Uint8Array())
- saveToLocalStorage(new Uint8Array())
-
- await deleteFromIndexedDB()
- deleteFromLocalStorage()
-
- dbState.dbInstance = null
-}
diff --git a/src/lib/db-indexeddb.ts b/src/lib/db-indexeddb.ts
deleted file mode 100644
index 197de78..0000000
--- a/src/lib/db-indexeddb.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * IndexedDB operations for database persistence
- */
-
-import { DB_KEY, IDB_NAME, IDB_STORE, IDB_VERSION } from './db-constants'
-
-export async function openIndexedDB(): Promise {
- if (typeof indexedDB === 'undefined') return null
-
- return new Promise((resolve) => {
- try {
- const request = indexedDB.open(IDB_NAME, IDB_VERSION)
-
- request.onerror = () => {
- console.warn('IndexedDB not available, falling back to localStorage')
- resolve(null)
- }
-
- request.onupgradeneeded = (event) => {
- const db = (event.target as IDBOpenDBRequest).result
- if (!db.objectStoreNames.contains(IDB_STORE)) {
- db.createObjectStore(IDB_STORE)
- }
- }
-
- request.onsuccess = (event) => {
- resolve((event.target as IDBOpenDBRequest).result)
- }
- } catch (error) {
- console.warn('IndexedDB error:', error)
- resolve(null)
- }
- })
-}
-
-export async function loadFromIndexedDB(): Promise {
- const db = await openIndexedDB()
- if (!db) return null
-
- return new Promise((resolve) => {
- try {
- const transaction = db.transaction([IDB_STORE], 'readonly')
- const store = transaction.objectStore(IDB_STORE)
- const request = store.get(DB_KEY)
-
- request.onsuccess = () => {
- const data = request.result
- resolve(data ? new Uint8Array(data) : null)
- }
-
- request.onerror = () => {
- console.warn('Failed to load from IndexedDB')
- resolve(null)
- }
- } catch (error) {
- console.warn('IndexedDB read error:', error)
- resolve(null)
- }
- })
-}
-
-export async function saveToIndexedDB(data: Uint8Array): Promise {
- const db = await openIndexedDB()
- if (!db) return false
-
- return new Promise((resolve) => {
- try {
- const transaction = db.transaction([IDB_STORE], 'readwrite')
- const store = transaction.objectStore(IDB_STORE)
- const request = store.put(data, DB_KEY)
-
- request.onsuccess = () => resolve(true)
- request.onerror = () => {
- console.warn('Failed to save to IndexedDB')
- resolve(false)
- }
- } catch (error) {
- console.warn('IndexedDB write error:', error)
- resolve(false)
- }
- })
-}
-
-export async function deleteFromIndexedDB(): Promise {
- const db = await openIndexedDB()
- if (!db) return
-
- return new Promise((resolve) => {
- try {
- const transaction = db.transaction([IDB_STORE], 'readwrite')
- const store = transaction.objectStore(IDB_STORE)
- const request = store.delete(DB_KEY)
- request.onsuccess = () => resolve()
- request.onerror = () => resolve()
- } catch (error) {
- console.warn('Error clearing IndexedDB:', error)
- resolve()
- }
- })
-}
diff --git a/src/lib/db-localstorage.ts b/src/lib/db-localstorage.ts
deleted file mode 100644
index 10d2020..0000000
--- a/src/lib/db-localstorage.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * LocalStorage operations for database persistence
- */
-
-import { DB_KEY } from './db-constants'
-
-export function loadFromLocalStorage(): Uint8Array | null {
- try {
- const savedData = localStorage.getItem(DB_KEY)
- if (savedData) {
- return new Uint8Array(JSON.parse(savedData))
- }
- } catch (error) {
- console.warn('Failed to load from localStorage:', error)
- }
- return null
-}
-
-export function saveToLocalStorage(data: Uint8Array): boolean {
- try {
- const dataArray = Array.from(data)
- localStorage.setItem(DB_KEY, JSON.stringify(dataArray))
- return true
- } catch (error) {
- console.warn('Failed to save to localStorage (quota exceeded?):', error)
- return false
- }
-}
-
-export function deleteFromLocalStorage(): void {
- try {
- localStorage.removeItem(DB_KEY)
- } catch (error) {
- console.warn('Error clearing localStorage:', error)
- }
-}
diff --git a/src/lib/db-mapper.ts b/src/lib/db-mapper.ts
deleted file mode 100644
index b561c27..0000000
--- a/src/lib/db-mapper.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Database row-to-object mapping utilities
- * Handles conversion of SQL query results to typed objects
- */
-
-/**
- * Maps a SQL query result row to a typed object
- * Handles special conversions for boolean and JSON fields
- */
-export function mapRowToObject(row: any[], columns: string[]): T {
- const obj: any = {}
-
- columns.forEach((col, idx) => {
- const value = row[idx]
-
- // Convert integer boolean fields to actual booleans
- if (col === 'hasPreview' || col === 'isDefault') {
- obj[col] = value === 1
- }
- // Parse JSON string fields with error handling
- else if (col === 'inputParameters') {
- if (value) {
- try {
- obj[col] = JSON.parse(value as string)
- } catch (error) {
- console.warn(`Failed to parse JSON for ${col}:`, error)
- obj[col] = undefined
- }
- } else {
- obj[col] = undefined
- }
- }
- // All other fields pass through as-is
- else {
- obj[col] = value
- }
- })
-
- return obj as T
-}
-
-/**
- * Maps multiple SQL result rows to an array of typed objects
- */
-export function mapRowsToObjects(results: any[]): T[] {
- if (results.length === 0) return []
-
- const columns = results[0].columns
- const values = results[0].values
-
- return values.map(row => mapRowToObject(row, columns))
-}
diff --git a/src/lib/db-namespaces/createNamespace.ts b/src/lib/db-namespaces/createNamespace.ts
deleted file mode 100644
index 5079e22..0000000
--- a/src/lib/db-namespaces/createNamespace.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { Namespace } from '../types'
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function createNamespace(name: string): Promise {
- const namespace: Namespace = {
- id: Date.now().toString(),
- name,
- createdAt: Date.now(),
- isDefault: false,
- }
-
- const adapter = getFlaskAdapter()
- if (adapter) {
- await adapter.createNamespace(namespace)
- return namespace
- }
-
- const db = await initDB()
-
- db.run(
- `INSERT INTO namespaces (id, name, createdAt, isDefault)
- VALUES (?, ?, ?, ?)`,
- [namespace.id, namespace.name, namespace.createdAt, namespace.isDefault ? 1 : 0]
- )
-
- await saveDB()
- return namespace
-}
diff --git a/src/lib/db-namespaces/deleteNamespace.ts b/src/lib/db-namespaces/deleteNamespace.ts
deleted file mode 100644
index 5435acc..0000000
--- a/src/lib/db-namespaces/deleteNamespace.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function deleteNamespace(id: string): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.deleteNamespace(id)
- }
-
- const db = await initDB()
-
- const defaultNamespace = db.exec('SELECT id FROM namespaces WHERE isDefault = 1')
- if (defaultNamespace.length === 0 || defaultNamespace[0].values.length === 0) {
- throw new Error('Default namespace not found')
- }
-
- const defaultId = defaultNamespace[0].values[0][0] as string
-
- const checkDefault = db.exec('SELECT isDefault FROM namespaces WHERE id = ?', [id])
- if (checkDefault.length > 0 && checkDefault[0].values[0]?.[0] === 1) {
- throw new Error('Cannot delete default namespace')
- }
-
- db.run('UPDATE snippets SET namespaceId = ? WHERE namespaceId = ?', [defaultId, id])
-
- db.run('DELETE FROM namespaces WHERE id = ?', [id])
-
- await saveDB()
-}
diff --git a/src/lib/db-namespaces/ensureDefaultNamespace.ts b/src/lib/db-namespaces/ensureDefaultNamespace.ts
deleted file mode 100644
index 5f8a78f..0000000
--- a/src/lib/db-namespaces/ensureDefaultNamespace.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { Namespace } from '../types'
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-
-export async function ensureDefaultNamespace(): Promise {
- const db = await initDB()
-
- const results = db.exec('SELECT COUNT(*) as count FROM namespaces WHERE isDefault = 1')
- const count = results[0]?.values[0]?.[0] as number || 0
-
- if (count === 0) {
- const defaultNamespace: Namespace = {
- id: 'default',
- name: 'Default',
- createdAt: Date.now(),
- isDefault: true,
- }
-
- db.run(
- `INSERT INTO namespaces (id, name, createdAt, isDefault)
- VALUES (?, ?, ?, ?)`,
- [defaultNamespace.id, defaultNamespace.name, defaultNamespace.createdAt, 1]
- )
-
- await saveDB()
- }
-}
diff --git a/src/lib/db-namespaces/getAllNamespaces.ts b/src/lib/db-namespaces/getAllNamespaces.ts
deleted file mode 100644
index 0001875..0000000
--- a/src/lib/db-namespaces/getAllNamespaces.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { Namespace } from '../types'
-import { initDB } from '../db-core/initDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-import { mapRowsToObjects } from '../db-mapper'
-
-export async function getAllNamespaces(): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.getAllNamespaces()
- }
-
- const db = await initDB()
- const results = db.exec('SELECT * FROM namespaces ORDER BY isDefault DESC, name ASC')
-
- return mapRowsToObjects(results)
-}
diff --git a/src/lib/db-namespaces/getNamespaceById.ts b/src/lib/db-namespaces/getNamespaceById.ts
deleted file mode 100644
index d05ca11..0000000
--- a/src/lib/db-namespaces/getNamespaceById.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import type { Namespace } from '../types'
-import { initDB } from '../db-core/initDB'
-import { mapRowToObject } from '../db-mapper'
-
-export async function getNamespaceById(id: string): Promise {
- const db = await initDB()
- const results = db.exec('SELECT * FROM namespaces WHERE id = ?', [id])
-
- if (results.length === 0 || results[0].values.length === 0) return null
-
- const columns = results[0].columns
- const row = results[0].values[0]
-
- return mapRowToObject(row, columns)
-}
diff --git a/src/lib/db-schema.ts b/src/lib/db-schema.ts
deleted file mode 100644
index 835d8f4..0000000
--- a/src/lib/db-schema.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Database schema management and validation
- */
-
-import type { Database } from 'sql.js'
-
-export async function validateSchema(db: Database): Promise {
- try {
- const snippetsCheck = db.exec("PRAGMA table_info(snippets)")
- if (snippetsCheck.length === 0) return true
-
- const columns = snippetsCheck[0].values.map(row => row[1] as string)
- const requiredColumns = ['id', 'title', 'code', 'language', 'category', 'namespaceId', 'createdAt', 'updatedAt']
-
- for (const col of requiredColumns) {
- if (!columns.includes(col)) {
- console.warn(`Schema validation failed: missing column '${col}'`)
- return false
- }
- }
-
- const namespacesCheck = db.exec("PRAGMA table_info(namespaces)")
- if (namespacesCheck.length === 0) {
- console.warn('Schema validation failed: namespaces table missing')
- return false
- }
-
- return true
- } catch (error) {
- console.error('Schema validation error:', error)
- return false
- }
-}
-
-export function createTables(db: Database): void {
- db.run(`
- CREATE TABLE IF NOT EXISTS namespaces (
- id TEXT PRIMARY KEY,
- name TEXT NOT NULL,
- createdAt INTEGER NOT NULL,
- isDefault INTEGER DEFAULT 0
- )
- `)
-
- db.run(`
- CREATE TABLE IF NOT EXISTS snippets (
- id TEXT PRIMARY KEY,
- title TEXT NOT NULL,
- description TEXT,
- code TEXT NOT NULL,
- language TEXT NOT NULL,
- category TEXT NOT NULL,
- namespaceId TEXT,
- hasPreview INTEGER DEFAULT 0,
- functionName TEXT,
- inputParameters TEXT,
- createdAt INTEGER NOT NULL,
- updatedAt INTEGER NOT NULL,
- FOREIGN KEY (namespaceId) REFERENCES namespaces(id)
- )
- `)
-
- db.run(`
- CREATE TABLE IF NOT EXISTS snippet_templates (
- id TEXT PRIMARY KEY,
- title TEXT NOT NULL,
- description TEXT,
- code TEXT NOT NULL,
- language TEXT NOT NULL,
- category TEXT NOT NULL,
- hasPreview INTEGER DEFAULT 0,
- functionName TEXT,
- inputParameters TEXT
- )
- `)
-}
-
-export async function validateDatabaseSchema(db: Database): Promise<{ valid: boolean; issues: string[] }> {
- try {
- const issues: string[] = []
-
- const snippetsCheck = db.exec("PRAGMA table_info(snippets)")
- if (snippetsCheck.length === 0) {
- issues.push('Snippets table missing')
- return { valid: false, issues }
- }
-
- const columns = snippetsCheck[0].values.map(row => row[1] as string)
- const requiredColumns = ['id', 'title', 'code', 'language', 'category', 'namespaceId', 'createdAt', 'updatedAt']
-
- for (const col of requiredColumns) {
- if (!columns.includes(col)) {
- issues.push(`Missing column '${col}' in snippets table`)
- }
- }
-
- const namespacesCheck = db.exec("SELECT name FROM sqlite_master WHERE type='table' AND name='namespaces'")
- if (namespacesCheck.length === 0) {
- issues.push('Namespaces table missing')
- }
-
- return { valid: issues.length === 0, issues }
- } catch (error) {
- return { valid: false, issues: ['Failed to validate schema: ' + (error as Error).message] }
- }
-}
diff --git a/src/lib/db-snippets/bulkMoveSnippets.ts b/src/lib/db-snippets/bulkMoveSnippets.ts
deleted file mode 100644
index 262701c..0000000
--- a/src/lib/db-snippets/bulkMoveSnippets.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function bulkMoveSnippets(snippetIds: string[], targetNamespaceId: string): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- await adapter.bulkMoveSnippets(snippetIds, targetNamespaceId)
- return
- }
-
- const db = await initDB()
- const now = Date.now()
-
- for (const snippetId of snippetIds) {
- db.run(
- 'UPDATE snippets SET namespaceId = ?, updatedAt = ? WHERE id = ?',
- [targetNamespaceId, now, snippetId]
- )
- }
-
- await saveDB()
-}
diff --git a/src/lib/db-snippets/createSnippet.ts b/src/lib/db-snippets/createSnippet.ts
deleted file mode 100644
index acc8c90..0000000
--- a/src/lib/db-snippets/createSnippet.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { Snippet } from '../types'
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function createSnippet(snippet: Snippet): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.createSnippet(snippet)
- }
-
- const db = await initDB()
-
- db.run(
- `INSERT INTO snippets (id, title, description, code, language, category, namespaceId, hasPreview, functionName, inputParameters, createdAt, updatedAt)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
- [
- snippet.id,
- snippet.title,
- snippet.description,
- snippet.code,
- snippet.language,
- snippet.category,
- snippet.namespaceId || null,
- snippet.hasPreview ? 1 : 0,
- snippet.functionName || null,
- snippet.inputParameters ? JSON.stringify(snippet.inputParameters) : null,
- snippet.createdAt,
- snippet.updatedAt,
- ]
- )
-
- await saveDB()
-}
diff --git a/src/lib/db-snippets/createTemplate.ts b/src/lib/db-snippets/createTemplate.ts
deleted file mode 100644
index 7014b4c..0000000
--- a/src/lib/db-snippets/createTemplate.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import type { SnippetTemplate } from '../types'
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-
-export async function createTemplate(template: SnippetTemplate): Promise {
- const db = await initDB()
-
- db.run(
- `INSERT INTO snippet_templates (id, title, description, code, language, category, hasPreview, functionName, inputParameters)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
- [
- template.id,
- template.title,
- template.description,
- template.code,
- template.language,
- template.category,
- template.hasPreview ? 1 : 0,
- template.functionName || null,
- template.inputParameters ? JSON.stringify(template.inputParameters) : null,
- ]
- )
-
- await saveDB()
-}
diff --git a/src/lib/db-snippets/deleteSnippet.ts b/src/lib/db-snippets/deleteSnippet.ts
deleted file mode 100644
index bb89acc..0000000
--- a/src/lib/db-snippets/deleteSnippet.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function deleteSnippet(id: string): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.deleteSnippet(id)
- }
-
- const db = await initDB()
-
- db.run('DELETE FROM snippets WHERE id = ?', [id])
-
- await saveDB()
-}
diff --git a/src/lib/db-snippets/getAllSnippets.ts b/src/lib/db-snippets/getAllSnippets.ts
deleted file mode 100644
index d924b4e..0000000
--- a/src/lib/db-snippets/getAllSnippets.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { Snippet } from '../types'
-import { initDB } from '../db-core/initDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-import { mapRowsToObjects } from '../db-mapper'
-
-export async function getAllSnippets(): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.getAllSnippets()
- }
-
- const db = await initDB()
- const results = db.exec('SELECT * FROM snippets ORDER BY updatedAt DESC')
-
- return mapRowsToObjects(results)
-}
diff --git a/src/lib/db-snippets/getAllTemplates.ts b/src/lib/db-snippets/getAllTemplates.ts
deleted file mode 100644
index 247af39..0000000
--- a/src/lib/db-snippets/getAllTemplates.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { SnippetTemplate } from '../types'
-import { initDB } from '../db-core/initDB'
-import { mapRowsToObjects } from '../db-mapper'
-
-export async function getAllTemplates(): Promise {
- const db = await initDB()
- const results = db.exec('SELECT * FROM snippet_templates')
-
- return mapRowsToObjects(results)
-}
diff --git a/src/lib/db-snippets/getSnippet.ts b/src/lib/db-snippets/getSnippet.ts
deleted file mode 100644
index 2943335..0000000
--- a/src/lib/db-snippets/getSnippet.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import type { Snippet } from '../types'
-import { initDB } from '../db-core/initDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-import { mapRowToObject } from '../db-mapper'
-
-export async function getSnippet(id: string): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.getSnippet(id)
- }
-
- const db = await initDB()
- const results = db.exec('SELECT * FROM snippets WHERE id = ?', [id])
-
- if (results.length === 0 || results[0].values.length === 0) return null
-
- const columns = results[0].columns
- const row = results[0].values[0]
-
- return mapRowToObject(row, columns)
-}
diff --git a/src/lib/db-snippets/getSnippetsByNamespace.ts b/src/lib/db-snippets/getSnippetsByNamespace.ts
deleted file mode 100644
index ffc2dff..0000000
--- a/src/lib/db-snippets/getSnippetsByNamespace.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import type { Snippet } from '../types'
-import { initDB } from '../db-core/initDB'
-import { mapRowsToObjects } from '../db-mapper'
-
-export async function getSnippetsByNamespace(namespaceId: string): Promise {
- const db = await initDB()
- const results = db.exec(
- 'SELECT * FROM snippets WHERE namespaceId = ? OR (namespaceId IS NULL AND ? = (SELECT id FROM namespaces WHERE isDefault = 1)) ORDER BY updatedAt DESC',
- [namespaceId, namespaceId]
- )
-
- return mapRowsToObjects(results)
-}
diff --git a/src/lib/db-snippets/moveSnippetToNamespace.ts b/src/lib/db-snippets/moveSnippetToNamespace.ts
deleted file mode 100644
index bf87927..0000000
--- a/src/lib/db-snippets/moveSnippetToNamespace.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function moveSnippetToNamespace(snippetId: string, targetNamespaceId: string): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- const snippet = await adapter.getSnippet(snippetId)
- if (snippet) {
- snippet.namespaceId = targetNamespaceId
- snippet.updatedAt = Date.now()
- await adapter.updateSnippet(snippet)
- }
- return
- }
-
- const db = await initDB()
-
- db.run(
- 'UPDATE snippets SET namespaceId = ?, updatedAt = ? WHERE id = ?',
- [targetNamespaceId, Date.now(), snippetId]
- )
-
- await saveDB()
-}
diff --git a/src/lib/db-snippets/seedDatabase.ts b/src/lib/db-snippets/seedDatabase.ts
deleted file mode 100644
index 5c2647a..0000000
--- a/src/lib/db-snippets/seedDatabase.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import type { Snippet, SnippetTemplate } from '../types'
-import { initDB } from '../db-core/initDB'
-import { createSnippet } from './createSnippet'
-import { createTemplate } from './createTemplate'
-import { ensureDefaultNamespace } from '../db-namespaces/ensureDefaultNamespace'
-import seedSnippetsData from '@/data/seed-snippets.json'
-import seedTemplatesData from '@/data/seed-templates.json'
-
-export async function seedDatabase(): Promise {
- const db = await initDB()
-
- await ensureDefaultNamespace()
-
- const checkSnippets = db.exec('SELECT COUNT(*) as count FROM snippets')
- const snippetCount = checkSnippets[0]?.values[0]?.[0] as number
-
- if (snippetCount > 0) {
- return
- }
-
- const now = Date.now()
-
- const seedSnippets: Snippet[] = seedSnippetsData.map((snippet, index) => {
- const timestamp = now - index * 1000
- return {
- ...snippet,
- createdAt: timestamp,
- updatedAt: timestamp,
- }
- })
-
- for (const snippet of seedSnippets) {
- await createSnippet(snippet)
- }
-
- const seedTemplates: SnippetTemplate[] = seedTemplatesData
-
- for (const template of seedTemplates) {
- await createTemplate(template)
- }
-}
diff --git a/src/lib/db-snippets/syncTemplatesFromJSON.ts b/src/lib/db-snippets/syncTemplatesFromJSON.ts
deleted file mode 100644
index cb31d95..0000000
--- a/src/lib/db-snippets/syncTemplatesFromJSON.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { SnippetTemplate } from '../types'
-import { initDB } from '../db-core/initDB'
-import { createTemplate } from './createTemplate'
-
-export async function syncTemplatesFromJSON(templates: SnippetTemplate[]): Promise {
- const db = await initDB()
-
- const existingTemplates = db.exec('SELECT id FROM snippet_templates')
- const existingIds = new Set(
- existingTemplates[0]?.values.map(row => row[0] as string) || []
- )
-
- let addedCount = 0
- for (const template of templates) {
- if (!existingIds.has(template.id)) {
- await createTemplate(template)
- addedCount++
- }
- }
-}
diff --git a/src/lib/db-snippets/updateSnippet.ts b/src/lib/db-snippets/updateSnippet.ts
deleted file mode 100644
index a8afcb3..0000000
--- a/src/lib/db-snippets/updateSnippet.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { Snippet } from '../types'
-import { initDB } from '../db-core/initDB'
-import { saveDB } from '../db-core/saveDB'
-import { getFlaskAdapter } from '../db-core/getFlaskAdapter'
-
-export async function updateSnippet(snippet: Snippet): Promise {
- const adapter = getFlaskAdapter()
- if (adapter) {
- return await adapter.updateSnippet(snippet)
- }
-
- const db = await initDB()
-
- db.run(
- `UPDATE snippets
- SET title = ?, description = ?, code = ?, language = ?, category = ?, namespaceId = ?, hasPreview = ?, functionName = ?, inputParameters = ?, updatedAt = ?
- WHERE id = ?`,
- [
- snippet.title,
- snippet.description,
- snippet.code,
- snippet.language,
- snippet.category,
- snippet.namespaceId || null,
- snippet.hasPreview ? 1 : 0,
- snippet.functionName || null,
- snippet.inputParameters ? JSON.stringify(snippet.inputParameters) : null,
- snippet.updatedAt,
- snippet.id,
- ]
- )
-
- await saveDB()
-}
diff --git a/src/lib/db.ts b/src/lib/db.ts
index eeab88e..d693302 100644
--- a/src/lib/db.ts
+++ b/src/lib/db.ts
@@ -1,38 +1,223 @@
/**
- * Main database module - Re-exports from focused modules
- * This file maintains backward compatibility while delegating to specialized modules
+ * Unified storage interface - routes to IndexedDB or Flask based on configuration
*/
-// Re-export core database functions
-export { initDB } from './db-core/initDB'
-export { saveDB } from './db-core/saveDB'
-export { exportDatabase } from './db-core/exportDatabase'
-export { importDatabase } from './db-core/importDatabase'
-export { getDatabaseStats } from './db-core/getDatabaseStats'
-export { clearDatabase } from './db-core/clearDatabase'
+import type { Snippet, Namespace } from './types';
+import { getStorageConfig, FlaskStorageAdapter } from './storage';
+import * as IndexedDBStorage from './indexeddb-storage';
-// Re-export snippet operations
-export { getAllSnippets } from './db-snippets/getAllSnippets'
-export { getSnippet } from './db-snippets/getSnippet'
-export { createSnippet } from './db-snippets/createSnippet'
-export { updateSnippet } from './db-snippets/updateSnippet'
-export { deleteSnippet } from './db-snippets/deleteSnippet'
-export { getSnippetsByNamespace } from './db-snippets/getSnippetsByNamespace'
-export { moveSnippetToNamespace } from './db-snippets/moveSnippetToNamespace'
-export { bulkMoveSnippets } from './db-snippets/bulkMoveSnippets'
-export { getAllTemplates } from './db-snippets/getAllTemplates'
-export { createTemplate } from './db-snippets/createTemplate'
-export { syncTemplatesFromJSON } from './db-snippets/syncTemplatesFromJSON'
-export { seedDatabase } from './db-snippets/seedDatabase'
+// Helper to get the active storage backend
+function getActiveStorage() {
+ const config = getStorageConfig();
+
+ if (config.backend === 'flask' && config.flaskUrl) {
+ return new FlaskStorageAdapter(config.flaskUrl);
+ }
+
+ return null; // Use IndexedDB
+}
-// Re-export namespace operations
-export { getAllNamespaces } from './db-namespaces/getAllNamespaces'
-export { createNamespace } from './db-namespaces/createNamespace'
-export { deleteNamespace } from './db-namespaces/deleteNamespace'
-export { ensureDefaultNamespace } from './db-namespaces/ensureDefaultNamespace'
-export { getNamespaceById } from './db-namespaces/getNamespaceById'
+// Snippet operations
+export async function getAllSnippets(): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getAllSnippets();
+ }
+ return await IndexedDBStorage.getAllSnippets();
+}
-// Re-export schema validation
-export { validateDatabaseSchema } from './db-schema'
+export async function getSnippet(id: string): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getSnippet(id);
+ }
+ return await IndexedDBStorage.getSnippet(id);
+}
-// Note: saveDB is intentionally not exported as it's used internally by the modules
+export async function createSnippet(snippet: Snippet): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.createSnippet(snippet);
+ }
+ return await IndexedDBStorage.createSnippet(snippet);
+}
+
+export async function updateSnippet(snippet: Snippet): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.updateSnippet(snippet);
+ }
+ return await IndexedDBStorage.updateSnippet(snippet);
+}
+
+export async function deleteSnippet(id: string): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.deleteSnippet(id);
+ }
+ return await IndexedDBStorage.deleteSnippet(id);
+}
+
+export async function getSnippetsByNamespace(namespaceId: string): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getSnippetsByNamespace(namespaceId);
+ }
+ return await IndexedDBStorage.getSnippetsByNamespace(namespaceId);
+}
+
+export async function moveSnippetToNamespace(snippetId: string, namespaceId: string): Promise {
+ const snippet = await getSnippet(snippetId);
+ if (!snippet) throw new Error('Snippet not found');
+
+ snippet.namespaceId = namespaceId;
+ snippet.updatedAt = Date.now();
+
+ await updateSnippet(snippet);
+}
+
+export async function bulkMoveSnippets(snippetIds: string[], namespaceId: string): Promise {
+ for (const id of snippetIds) {
+ await moveSnippetToNamespace(id, namespaceId);
+ }
+}
+
+export async function getAllTemplates(): Promise {
+ const snippets = await getAllSnippets();
+ return snippets.filter(s => s.isTemplate);
+}
+
+export async function createTemplate(snippet: Omit): Promise {
+ const template: Snippet = {
+ ...snippet,
+ id: Date.now().toString(),
+ createdAt: Date.now(),
+ updatedAt: Date.now(),
+ isTemplate: true,
+ };
+ await createSnippet(template);
+}
+
+export async function syncTemplatesFromJSON(templates: any[]): Promise {
+ // This would sync predefined templates - implement as needed
+ console.log('Syncing templates', templates.length);
+}
+
+export async function seedDatabase(): Promise {
+ // Seed with default namespace if needed
+ const namespaces = await getAllNamespaces();
+ if (namespaces.length === 0) {
+ await ensureDefaultNamespace();
+ }
+}
+
+// Namespace operations
+export async function getAllNamespaces(): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getAllNamespaces();
+ }
+ return await IndexedDBStorage.getAllNamespaces();
+}
+
+export async function getNamespaceById(id: string): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getNamespace(id);
+ }
+ return await IndexedDBStorage.getNamespace(id);
+}
+
+export async function createNamespace(namespace: Namespace): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.createNamespace(namespace);
+ }
+ return await IndexedDBStorage.createNamespace(namespace);
+}
+
+export async function deleteNamespace(id: string): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.deleteNamespace(id);
+ }
+ return await IndexedDBStorage.deleteNamespace(id);
+}
+
+export async function ensureDefaultNamespace(): Promise {
+ const namespaces = await getAllNamespaces();
+ let defaultNs = namespaces.find(ns => ns.isDefault);
+
+ if (!defaultNs) {
+ defaultNs = {
+ id: 'default',
+ name: 'Default',
+ createdAt: Date.now(),
+ isDefault: true,
+ };
+ await createNamespace(defaultNs);
+ }
+
+ return defaultNs;
+}
+
+// Database operations
+export async function initDB(): Promise {
+ // Initialize IndexedDB or verify Flask connection
+ const flask = getActiveStorage();
+ if (flask) {
+ const connected = await flask.testConnection();
+ if (!connected) {
+ throw new Error('Failed to connect to Flask backend');
+ }
+ } else {
+ // Initialize IndexedDB
+ await IndexedDBStorage.openDB();
+ }
+
+ // Ensure default namespace exists
+ await ensureDefaultNamespace();
+}
+
+export async function clearDatabase(): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.clearDatabase();
+ }
+ return await IndexedDBStorage.clearDatabase();
+}
+
+export async function getDatabaseStats() {
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.getStats();
+ }
+ return await IndexedDBStorage.getDatabaseStats();
+}
+
+export async function exportDatabase(): Promise {
+ const flask = getActiveStorage();
+ if (flask) {
+ const data = await flask.exportDatabase();
+ return JSON.stringify(data, null, 2);
+ }
+ const data = await IndexedDBStorage.exportDatabase();
+ return JSON.stringify(data, null, 2);
+}
+
+export async function importDatabase(jsonData: string): Promise {
+ const data = JSON.parse(jsonData);
+ const flask = getActiveStorage();
+ if (flask) {
+ return await flask.importDatabase(data);
+ }
+ await IndexedDBStorage.importDatabase(data);
+}
+
+export function validateDatabaseSchema(): Promise {
+ // With IndexedDB, schema is always valid
+ return Promise.resolve(true);
+}
+
+// For backward compatibility
+export const saveDB = async () => { /* No-op with IndexedDB */ };
diff --git a/src/lib/db.ts.old b/src/lib/db.ts.old
new file mode 100644
index 0000000..eeab88e
--- /dev/null
+++ b/src/lib/db.ts.old
@@ -0,0 +1,38 @@
+/**
+ * Main database module - Re-exports from focused modules
+ * This file maintains backward compatibility while delegating to specialized modules
+ */
+
+// Re-export core database functions
+export { initDB } from './db-core/initDB'
+export { saveDB } from './db-core/saveDB'
+export { exportDatabase } from './db-core/exportDatabase'
+export { importDatabase } from './db-core/importDatabase'
+export { getDatabaseStats } from './db-core/getDatabaseStats'
+export { clearDatabase } from './db-core/clearDatabase'
+
+// Re-export snippet operations
+export { getAllSnippets } from './db-snippets/getAllSnippets'
+export { getSnippet } from './db-snippets/getSnippet'
+export { createSnippet } from './db-snippets/createSnippet'
+export { updateSnippet } from './db-snippets/updateSnippet'
+export { deleteSnippet } from './db-snippets/deleteSnippet'
+export { getSnippetsByNamespace } from './db-snippets/getSnippetsByNamespace'
+export { moveSnippetToNamespace } from './db-snippets/moveSnippetToNamespace'
+export { bulkMoveSnippets } from './db-snippets/bulkMoveSnippets'
+export { getAllTemplates } from './db-snippets/getAllTemplates'
+export { createTemplate } from './db-snippets/createTemplate'
+export { syncTemplatesFromJSON } from './db-snippets/syncTemplatesFromJSON'
+export { seedDatabase } from './db-snippets/seedDatabase'
+
+// Re-export namespace operations
+export { getAllNamespaces } from './db-namespaces/getAllNamespaces'
+export { createNamespace } from './db-namespaces/createNamespace'
+export { deleteNamespace } from './db-namespaces/deleteNamespace'
+export { ensureDefaultNamespace } from './db-namespaces/ensureDefaultNamespace'
+export { getNamespaceById } from './db-namespaces/getNamespaceById'
+
+// Re-export schema validation
+export { validateDatabaseSchema } from './db-schema'
+
+// Note: saveDB is intentionally not exported as it's used internally by the modules
diff --git a/src/lib/indexeddb-storage.ts b/src/lib/indexeddb-storage.ts
new file mode 100644
index 0000000..561e8db
--- /dev/null
+++ b/src/lib/indexeddb-storage.ts
@@ -0,0 +1,241 @@
+/**
+ * IndexedDB Storage - Direct storage of snippets and namespaces
+ */
+
+import type { Snippet, Namespace } from './types';
+
+const DB_NAME = 'codesnippet-db';
+const DB_VERSION = 2;
+const SNIPPETS_STORE = 'snippets';
+const NAMESPACES_STORE = 'namespaces';
+
+let dbInstance: IDBDatabase | null = null;
+
+export async function openDB(): Promise {
+ if (dbInstance) return dbInstance;
+
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
+
+ request.onerror = () => reject(request.error);
+
+ request.onupgradeneeded = (event) => {
+ const db = (event.target as IDBOpenDBRequest).result;
+
+ // Create snippets store if it doesn't exist
+ if (!db.objectStoreNames.contains(SNIPPETS_STORE)) {
+ const snippetsStore = db.createObjectStore(SNIPPETS_STORE, { keyPath: 'id' });
+ snippetsStore.createIndex('namespaceId', 'namespaceId', { unique: false });
+ snippetsStore.createIndex('createdAt', 'createdAt', { unique: false });
+ }
+
+ // Create namespaces store if it doesn't exist
+ if (!db.objectStoreNames.contains(NAMESPACES_STORE)) {
+ db.createObjectStore(NAMESPACES_STORE, { keyPath: 'id' });
+ }
+ };
+
+ request.onsuccess = () => {
+ dbInstance = request.result;
+ resolve(dbInstance);
+ };
+ });
+}
+
+// Snippet operations
+export async function getAllSnippets(): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readonly');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const request = store.getAll();
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve(request.result);
+ });
+}
+
+export async function getSnippet(id: string): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readonly');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const request = store.get(id);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve(request.result || null);
+ });
+}
+
+export async function createSnippet(snippet: Snippet): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readwrite');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const request = store.add(snippet);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+export async function updateSnippet(snippet: Snippet): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readwrite');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const request = store.put(snippet);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+export async function deleteSnippet(id: string): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readwrite');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const request = store.delete(id);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+export async function getSnippetsByNamespace(namespaceId: string): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE], 'readonly');
+ const store = transaction.objectStore(SNIPPETS_STORE);
+ const index = store.index('namespaceId');
+ const request = index.getAll(namespaceId);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve(request.result);
+ });
+}
+
+// Namespace operations
+export async function getAllNamespaces(): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([NAMESPACES_STORE], 'readonly');
+ const store = transaction.objectStore(NAMESPACES_STORE);
+ const request = store.getAll();
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve(request.result);
+ });
+}
+
+export async function getNamespace(id: string): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([NAMESPACES_STORE], 'readonly');
+ const store = transaction.objectStore(NAMESPACES_STORE);
+ const request = store.get(id);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve(request.result || null);
+ });
+}
+
+export async function createNamespace(namespace: Namespace): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([NAMESPACES_STORE], 'readwrite');
+ const store = transaction.objectStore(NAMESPACES_STORE);
+ const request = store.add(namespace);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+export async function updateNamespace(namespace: Namespace): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([NAMESPACES_STORE], 'readwrite');
+ const store = transaction.objectStore(NAMESPACES_STORE);
+ const request = store.put(namespace);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+export async function deleteNamespace(id: string): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([NAMESPACES_STORE], 'readwrite');
+ const store = transaction.objectStore(NAMESPACES_STORE);
+ const request = store.delete(id);
+
+ request.onerror = () => reject(request.error);
+ request.onsuccess = () => resolve();
+ });
+}
+
+// Database operations
+export async function clearDatabase(): Promise {
+ const db = await openDB();
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE, NAMESPACES_STORE], 'readwrite');
+
+ const snippetsStore = transaction.objectStore(SNIPPETS_STORE);
+ const namespacesStore = transaction.objectStore(NAMESPACES_STORE);
+
+ snippetsStore.clear();
+ namespacesStore.clear();
+
+ transaction.onerror = () => reject(transaction.error);
+ transaction.oncomplete = () => resolve();
+ });
+}
+
+export async function getDatabaseStats() {
+ const snippets = await getAllSnippets();
+ const namespaces = await getAllNamespaces();
+ const templates = snippets.filter(s => s.isTemplate);
+
+ return {
+ snippetCount: snippets.length,
+ templateCount: templates.length,
+ namespaceCount: namespaces.length,
+ storageType: 'indexeddb' as const,
+ databaseSize: 0, // IndexedDB doesn't provide easy size calculation
+ };
+}
+
+// Export/Import
+export async function exportDatabase(): Promise<{ snippets: Snippet[]; namespaces: Namespace[] }> {
+ const snippets = await getAllSnippets();
+ const namespaces = await getAllNamespaces();
+ return { snippets, namespaces };
+}
+
+export async function importDatabase(data: { snippets: Snippet[]; namespaces: Namespace[] }): Promise {
+ await clearDatabase();
+
+ const db = await openDB();
+
+ return new Promise((resolve, reject) => {
+ const transaction = db.transaction([SNIPPETS_STORE, NAMESPACES_STORE], 'readwrite');
+ const snippetsStore = transaction.objectStore(SNIPPETS_STORE);
+ const namespacesStore = transaction.objectStore(NAMESPACES_STORE);
+
+ // Import namespaces
+ for (const namespace of data.namespaces) {
+ namespacesStore.add(namespace);
+ }
+
+ // Import snippets
+ for (const snippet of data.snippets) {
+ snippetsStore.add(snippet);
+ }
+
+ transaction.onerror = () => reject(transaction.error);
+ transaction.oncomplete = () => resolve();
+ });
+}
diff --git a/src/lib/storage.ts b/src/lib/storage.ts
index cde3ff4..dbce4b5 100644
--- a/src/lib/storage.ts
+++ b/src/lib/storage.ts
@@ -10,7 +10,7 @@ export interface StorageConfig {
const STORAGE_CONFIG_KEY = 'codesnippet-storage-config'
function getDefaultConfig(): StorageConfig {
- const flaskUrl = import.meta.env.VITE_FLASK_BACKEND_URL
+ const flaskUrl = process.env.NEXT_PUBLIC_FLASK_BACKEND_URL
if (flaskUrl) {
return {
@@ -249,4 +249,49 @@ export class FlaskStorageAdapter {
throw new Error(`Failed to bulk move snippets: ${response.statusText}`)
}
}
+
+ async getSnippetsByNamespace(namespaceId: string): Promise {
+ const snippets = await this.getAllSnippets();
+ return snippets.filter(s => s.namespaceId === namespaceId);
+ }
+
+ async getNamespace(id: string): Promise {
+ const namespaces = await this.getAllNamespaces();
+ return namespaces.find(ns => ns.id === id) || null;
+ }
+
+ async clearDatabase(): Promise {
+ return this.wipeDatabase();
+ }
+
+ async getStats() {
+ const snippets = await this.getAllSnippets();
+ const namespaces = await this.getAllNamespaces();
+ const templates = snippets.filter(s => s.isTemplate);
+ return {
+ snippetCount: snippets.length,
+ templateCount: templates.length,
+ namespaceCount: namespaces.length,
+ storageType: 'indexeddb' as const,
+ databaseSize: 0,
+ };
+ }
+
+ async exportDatabase(): Promise<{ snippets: Snippet[]; namespaces: import('./types').Namespace[] }> {
+ const snippets = await this.getAllSnippets();
+ const namespaces = await this.getAllNamespaces();
+ return { snippets, namespaces };
+ }
+
+ async importDatabase(data: { snippets: Snippet[]; namespaces: import('./types').Namespace[] }): Promise {
+ await this.wipeDatabase();
+
+ for (const namespace of data.namespaces) {
+ await this.createNamespace(namespace);
+ }
+
+ for (const snippet of data.snippets) {
+ await this.createSnippet(snippet);
+ }
+ }
}
diff --git a/src/lib/types.ts b/src/lib/types.ts
index db9d42e..973e955 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -16,6 +16,7 @@ export interface Snippet {
category: string
namespaceId?: string
hasPreview?: boolean
+ isTemplate?: boolean
functionName?: string
inputParameters?: InputParameter[]
createdAt: number
diff --git a/src/main.tsx b/src/main.tsx
deleted file mode 100644
index 0f43ff0..0000000
--- a/src/main.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { createRoot } from 'react-dom/client'
-import { ErrorBoundary } from "react-error-boundary";
-import { Provider } from 'react-redux'
-import "@github/spark/spark"
-import { Toaster } from '@/components/ui/sonner'
-import { loadStorageConfig } from '@/lib/storage'
-import { store } from '@/store'
-
-import App from './App.tsx'
-import { ErrorFallback } from './components/error/ErrorFallback.tsx'
-
-import "./main.css"
-import "./styles/theme.css"
-import "./index.css"
-
-loadStorageConfig()
-
-const logErrorToConsole = (error: Error, info: { componentStack?: string }) => {
- console.error('Application Error:', error);
- if (info.componentStack) {
- console.error('Component Stack:', info.componentStack);
- }
-};
-
-createRoot(document.getElementById('root')!).render(
-
-
-
-
-
-
-)
diff --git a/src/pages/AtomsPage.tsx b/src/pages/AtomsPage.tsx
deleted file mode 100644
index b3a1f19..0000000
--- a/src/pages/AtomsPage.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { motion } from 'framer-motion'
-import { AtomsSection } from '@/components/atoms/AtomsSection'
-import type { Snippet } from '@/lib/types'
-import { useCallback } from 'react'
-import { toast } from 'sonner'
-import { createSnippet } from '@/lib/db'
-
-export function AtomsPage() {
- const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
- try {
- const newSnippet: Snippet = {
- ...snippetData,
- id: Date.now().toString(),
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- await createSnippet(newSnippet)
- toast.success('Component saved as snippet!')
- } catch (error) {
- console.error('Failed to save snippet:', error)
- toast.error('Failed to save snippet')
- }
- }, [])
-
- return (
-
-
-
Atoms
-
Fundamental building blocks - basic HTML elements styled as reusable components
-
-
-
- )
-}
diff --git a/src/pages/DemoPage.tsx b/src/pages/DemoPage.tsx
deleted file mode 100644
index ce0a9da..0000000
--- a/src/pages/DemoPage.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { useState } from 'react'
-import { motion } from 'framer-motion'
-import { SplitScreenEditor } from '@/components/features/snippet-editor/SplitScreenEditor'
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
-import { Sparkle } from '@phosphor-icons/react'
-import { DEMO_CODE } from './demo-constants'
-import { DemoFeatureCards } from './DemoFeatureCards'
-
-export function DemoPage() {
- const [code, setCode] = useState(DEMO_CODE)
-
- return (
-
-
-
-
-
-
-
Split-Screen Demo
-
-
- Experience live React component editing with real-time preview. Edit the code on the left and watch it update instantly on the right.
-
-
-
-
-
-
-
- Interactive Code Editor
-
-
- This editor supports JSX, TSX, JavaScript, and TypeScript with live preview.
- Try switching between Code, Split, and Preview modes using the buttons above the editor.
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx
deleted file mode 100644
index 1d2df8e..0000000
--- a/src/pages/HomePage.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { motion } from 'framer-motion'
-import { SnippetManagerRedux } from '@/components/SnippetManagerRedux'
-
-export function HomePage() {
- return (
-
-
-
My Snippets
-
Save, organize, and share your code snippets
-
-
-
- )
-}
diff --git a/src/pages/MoleculesPage.tsx b/src/pages/MoleculesPage.tsx
deleted file mode 100644
index 54bb3ba..0000000
--- a/src/pages/MoleculesPage.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { motion } from 'framer-motion'
-import { MoleculesSection } from '@/components/molecules/MoleculesSection'
-import type { Snippet } from '@/lib/types'
-import { useCallback } from 'react'
-import { toast } from 'sonner'
-import { createSnippet } from '@/lib/db'
-
-export function MoleculesPage() {
- const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
- try {
- const newSnippet: Snippet = {
- ...snippetData,
- id: Date.now().toString(),
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- await createSnippet(newSnippet)
- toast.success('Component saved as snippet!')
- } catch (error) {
- console.error('Failed to save snippet:', error)
- toast.error('Failed to save snippet')
- }
- }, [])
-
- return (
-
-
-
Molecules
-
Simple combinations of atoms that work together as functional units
-
-
-
- )
-}
diff --git a/src/pages/OrganismsPage.tsx b/src/pages/OrganismsPage.tsx
deleted file mode 100644
index 5787c19..0000000
--- a/src/pages/OrganismsPage.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { motion } from 'framer-motion'
-import { OrganismsSection } from '@/components/organisms/OrganismsSection'
-import type { Snippet } from '@/lib/types'
-import { useCallback } from 'react'
-import { toast } from 'sonner'
-import { createSnippet } from '@/lib/db'
-
-export function OrganismsPage() {
- const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
- try {
- const newSnippet: Snippet = {
- ...snippetData,
- id: Date.now().toString(),
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- await createSnippet(newSnippet)
- toast.success('Component saved as snippet!')
- } catch (error) {
- console.error('Failed to save snippet:', error)
- toast.error('Failed to save snippet')
- }
- }, [])
-
- return (
-
-
-
Organisms
-
Complex UI components composed of molecules and atoms
-
-
-
- )
-}
diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx
deleted file mode 100644
index 50142c8..0000000
--- a/src/pages/SettingsPage.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import { motion } from 'framer-motion'
-import { PersistenceSettings } from '@/components/demo/PersistenceSettings'
-import { SchemaHealthCard } from '@/components/settings/SchemaHealthCard'
-import { BackendAutoConfigCard } from '@/components/settings/BackendAutoConfigCard'
-import { StorageBackendCard } from '@/components/settings/StorageBackendCard'
-import { DatabaseStatsCard } from '@/components/settings/DatabaseStatsCard'
-import { StorageInfoCard } from '@/components/settings/StorageInfoCard'
-import { DatabaseActionsCard } from '@/components/settings/DatabaseActionsCard'
-import { useSettingsState } from '@/hooks/useSettingsState'
-
-export function SettingsPage() {
- const {
- stats,
- loading,
- storageBackend,
- setStorageBackend,
- flaskUrl,
- setFlaskUrl,
- flaskConnectionStatus,
- setFlaskConnectionStatus,
- testingConnection,
- envVarSet,
- schemaHealth,
- checkingSchema,
- handleExport,
- handleImport,
- handleClear,
- handleSeed,
- formatBytes,
- handleTestConnection,
- handleSaveStorageConfig,
- handleMigrateToFlask,
- handleMigrateToIndexedDB,
- checkSchemaHealth,
- } = useSettingsState()
-
- return (
-
-
-
Settings
-
Manage your database and application settings
-
-
-
-
-
-
-
-
-
-
{
- setFlaskUrl(url)
- setFlaskConnectionStatus('unknown')
- }}
- onTestConnection={handleTestConnection}
- onSaveConfig={handleSaveStorageConfig}
- onMigrateToFlask={handleMigrateToFlask}
- onMigrateToIndexedDB={handleMigrateToIndexedDB}
- />
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/pages/TemplatesPage.tsx b/src/pages/TemplatesPage.tsx
deleted file mode 100644
index 784e779..0000000
--- a/src/pages/TemplatesPage.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { motion } from 'framer-motion'
-import { TemplatesSection } from '@/components/templates/TemplatesSection'
-import type { Snippet } from '@/lib/types'
-import { useCallback } from 'react'
-import { toast } from 'sonner'
-import { createSnippet } from '@/lib/db'
-
-export function TemplatesPage() {
- const handleSaveSnippet = useCallback(async (snippetData: Omit) => {
- try {
- const newSnippet: Snippet = {
- ...snippetData,
- id: Date.now().toString(),
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- await createSnippet(newSnippet)
- toast.success('Component saved as snippet!')
- } catch (error) {
- console.error('Failed to save snippet:', error)
- toast.error('Failed to save snippet')
- }
- }, [])
-
- return (
-
-
-
Templates
-
Page-level layouts that combine organisms into complete interfaces
-
-
-
- )
-}
diff --git a/src/store/slices/namespacesSlice.ts b/src/store/slices/namespacesSlice.ts
index 36f1f4c..b440d08 100644
--- a/src/store/slices/namespacesSlice.ts
+++ b/src/store/slices/namespacesSlice.ts
@@ -32,7 +32,14 @@ export const fetchNamespaces = createAsyncThunk(
export const createNamespace = createAsyncThunk(
'namespaces/create',
async (name: string) => {
- return await createNamespaceDB(name)
+ const namespace: Namespace = {
+ id: Date.now().toString(),
+ name,
+ createdAt: Date.now(),
+ isDefault: false,
+ }
+ await createNamespaceDB(namespace)
+ return namespace
}
)
diff --git a/tailwind.config.js b/tailwind.config.js
index 8f44d5e..f2d44a8 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,147 +1,62 @@
-import fs from "fs";
-
/** @type {import('tailwindcss').Config} */
-
-let theme = {};
-try {
- const themePath = "./theme.json";
-
- if (fs.existsSync(themePath)) {
- theme = JSON.parse(fs.readFileSync(themePath, "utf-8"));
- }
-} catch (err) {
- console.error('failed to parse custom styles', err)
+module.exports = {
+ darkMode: ["class"],
+ content: [
+ './src/pages/**/*.{ts,tsx}',
+ './src/components/**/*.{ts,tsx}',
+ './src/app/**/*.{ts,tsx}',
+ './src/**/*.{ts,tsx}',
+ ],
+ theme: {
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ },
+ },
+ plugins: [],
}
-const defaultTheme = {
- container: {
- center: true,
- padding: "2rem",
- },
- extend: {
- screens: {
- coarse: { raw: "(pointer: coarse)" },
- fine: { raw: "(pointer: fine)" },
- pwa: { raw: "(display-mode: standalone)" },
- },
- colors: {
- neutral: {
- 1: "var(--color-neutral-1)",
- 2: "var(--color-neutral-2)",
- 3: "var(--color-neutral-3)",
- 4: "var(--color-neutral-4)",
- 5: "var(--color-neutral-5)",
- 6: "var(--color-neutral-6)",
- 7: "var(--color-neutral-7)",
- 8: "var(--color-neutral-8)",
- 9: "var(--color-neutral-9)",
- 10: "var(--color-neutral-10)",
- 11: "var(--color-neutral-11)",
- 12: "var(--color-neutral-12)",
- a1: "var(--color-neutral-a1)",
- a2: "var(--color-neutral-a2)",
- a3: "var(--color-neutral-a3)",
- a4: "var(--color-neutral-a4)",
- a5: "var(--color-neutral-a5)",
- a6: "var(--color-neutral-a6)",
- a7: "var(--color-neutral-a7)",
- a8: "var(--color-neutral-a8)",
- a9: "var(--color-neutral-a9)",
- a10: "var(--color-neutral-a10)",
- a11: "var(--color-neutral-a11)",
- a12: "var(--color-neutral-a12)",
- contrast: "var(--color-neutral-contrast)",
- },
- accent: {
- 1: "var(--color-accent-1)",
- 2: "var(--color-accent-2)",
- 3: "var(--color-accent-3)",
- 4: "var(--color-accent-4)",
- 5: "var(--color-accent-5)",
- 6: "var(--color-accent-6)",
- 7: "var(--color-accent-7)",
- 8: "var(--color-accent-8)",
- 9: "var(--color-accent-9)",
- 10: "var(--color-accent-10)",
- 11: "var(--color-accent-11)",
- 12: "var(--color-accent-12)",
- contrast: "var(--color-accent-contrast)",
- },
- "accent-secondary": {
- 1: "var(--color-accent-secondary-1)",
- 2: "var(--color-accent-secondary-2)",
- 3: "var(--color-accent-secondary-3)",
- 4: "var(--color-accent-secondary-4)",
- 5: "var(--color-accent-secondary-5)",
- 6: "var(--color-accent-secondary-6)",
- 7: "var(--color-accent-secondary-7)",
- 8: "var(--color-accent-secondary-8)",
- 9: "var(--color-accent-secondary-9)",
- 10: "var(--color-accent-secondary-10)",
- 11: "var(--color-accent-secondary-11)",
- 12: "var(--color-accent-secondary-12)",
- contrast: "var(--color-accent-secondary-contrast)",
- },
- fg: {
- DEFAULT: "var(--color-fg)",
- secondary: "var(--color-fg-secondary)",
- },
- bg: {
- DEFAULT: "var(--color-bg)",
- inset: "var(--color-bg-inset)",
- overlay: "var(--color-bg-overlay)",
- },
- "focus-ring": "var(--color-focus-ring)",
- },
- borderRadius: {
- sm: "var(--radius-sm)",
- md: "var(--radius-md)",
- lg: "var(--radius-lg)",
- xl: "var(--radius-xl)",
- "2xl": "var(--radius-2xl)",
- full: "var(--radius-full)",
- },
- },
- spacing: {
- px: "var(--size-px)",
- 0: "var(--size-0)",
- 0.5: "var(--size-0-5)",
- 1: "var(--size-1)",
- 1.5: "var(--size-1-5)",
- 2: "var(--size-2)",
- 2.5: "var(--size-2-5)",
- 3: "var(--size-3)",
- 3.5: "var(--size-3-5)",
- 4: "var(--size-4)",
- 5: "var(--size-5)",
- 6: "var(--size-6)",
- 7: "var(--size-7)",
- 8: "var(--size-8)",
- 9: "var(--size-9)",
- 10: "var(--size-10)",
- 11: "var(--size-11)",
- 12: "var(--size-12)",
- 14: "var(--size-14)",
- 16: "var(--size-16)",
- 20: "var(--size-20)",
- 24: "var(--size-24)",
- 28: "var(--size-28)",
- 32: "var(--size-32)",
- 36: "var(--size-36)",
- 40: "var(--size-40)",
- 44: "var(--size-44)",
- 48: "var(--size-48)",
- 52: "var(--size-52)",
- 56: "var(--size-56)",
- 60: "var(--size-60)",
- 64: "var(--size-64)",
- 72: "var(--size-72)",
- 80: "var(--size-80)",
- 96: "var(--size-96)",
- },
- darkMode: ["selector", '[data-appearance="dark"]'],
-}
-
-export default {
- content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
- theme: { ...defaultTheme, ...theme },
-};
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 6cc0f0e..30346b7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,34 +1,45 @@
{
"compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
- "useDefineForClassFields": true,
"lib": [
"ES2020",
"DOM",
"DOM.Iterable"
],
- "module": "ESNext",
- "skipLibCheck": true,
- "strictNullChecks": true,
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- "moduleDetection": "force",
- "noEmit": true,
"jsx": "react-jsx",
- /* Linting */
- "noFallthroughCasesInSwitch": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "strictNullChecks": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "isolatedModules": true,
+ "incremental": true,
"noUncheckedSideEffectImports": true,
+ "noFallthroughCasesInSwitch": true,
+ "allowImportingTsExtensions": false,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
"paths": {
"@/*": [
"./src/*"
]
- },
+ }
},
"include": [
- "src"
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
]
}
diff --git a/vite.config.ts b/vite.config.ts
deleted file mode 100644
index a73d354..0000000
--- a/vite.config.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import tailwindcss from "@tailwindcss/vite";
-import react from "@vitejs/plugin-react-swc";
-import { defineConfig, PluginOption } from "vite";
-
-import sparkPlugin from "@github/spark/spark-vite-plugin";
-import createIconImportProxy from "@github/spark/vitePhosphorIconProxyPlugin";
-import { resolve } from 'path'
-
-const projectRoot = process.env.PROJECT_ROOT || import.meta.dirname
-
-// https://vite.dev/config/
-export default defineConfig({
- // Base path for GitHub Pages deployment
- // Set to '/' for custom domain or root deployment
- // Set to '/repo-name/' for GitHub Pages at username.github.io/repo-name/
- base: process.env.VITE_BASE_PATH || '/',
- plugins: [
- react(),
- tailwindcss(),
- // DO NOT REMOVE
- createIconImportProxy() as PluginOption,
- sparkPlugin() as PluginOption,
- ],
- resolve: {
- alias: {
- '@': resolve(projectRoot, 'src')
- }
- },
-});