From 4de6e72c9c8f950759ad86dc71685cd3e3b08fc7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:46:09 +0000 Subject: [PATCH 1/4] Initial plan From 345e73b813e0ac766f5d98eed25c833fefb3ab78 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:49:16 +0000 Subject: [PATCH 2/4] Initial exploration - planning Next.js conversion Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8501272..44734eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4756,7 +4756,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" From 8e93467317ff8bf3023e29c90848977c9e480f48 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:57:36 +0000 Subject: [PATCH 3/4] Convert to Next.js - core setup complete Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- .env.example | 10 +- .eslintrc.json | 3 + .github/workflows/deploy-pages.yml | 9 +- .github/workflows/docker-publish.yml | 4 +- .gitignore | 8 + Dockerfile | 29 +- app/PageLayout.tsx | 89 + app/atoms/page.tsx | 43 + app/demo/page.tsx | 60 + app/globals.css | 92 + app/layout.tsx | 40 + app/molecules/page.tsx | 43 + app/organisms/page.tsx | 43 + app/page.tsx | 23 + app/providers.tsx | 42 + app/settings/page.tsx | 105 + app/templates/page.tsx | 43 + docker-compose.production.yml | 2 +- docker-compose.yml | 2 +- next.config.ts | 49 + package-lock.json | 4454 +++++++++++++++-- package.json | 20 +- src/components/layout/BackendIndicator.tsx | 2 +- .../layout/navigation/NavigationSidebar.tsx | 31 +- .../settings/BackendAutoConfigCard.tsx | 2 +- .../settings/StorageBackendCard.tsx | 2 +- src/hooks/useStorageConfig.ts | 2 +- src/lib/storage.ts | 2 +- tsconfig.json | 36 +- 29 files changed, 4935 insertions(+), 355 deletions(-) create mode 100644 .eslintrc.json create mode 100644 app/PageLayout.tsx create mode 100644 app/atoms/page.tsx create mode 100644 app/demo/page.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/molecules/page.tsx create mode 100644 app/organisms/page.tsx create mode 100644 app/page.tsx create mode 100644 app/providers.tsx create mode 100644 app/settings/page.tsx create mode 100644 app/templates/page.tsx create mode 100644 next.config.ts 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/app/PageLayout.tsx b/app/PageLayout.tsx new file mode 100644 index 0000000..e929b3e --- /dev/null +++ b/app/PageLayout.tsx @@ -0,0 +1,89 @@ +'use client'; + +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 ( +
+
+ + + + +
+
+
+ + +
+ +
+

+ CodeSnippet +

+
+ + + +
+
+
+ +
+ {children} +
+ +
+
+
+

Save, organize, and share your code snippets with beautiful syntax highlighting and live execution

+

Supports React preview and Python execution via Pyodide

+
+
+
+
+
+ ); +} diff --git a/app/atoms/page.tsx b/app/atoms/page.tsx new file mode 100644 index 0000000..418d9ba --- /dev/null +++ b/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/app/demo/page.tsx b/app/demo/page.tsx new file mode 100644 index 0000000..7c34d05 --- /dev/null +++ b/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 '@/pages/demo-constants'; +import { DemoFeatureCards } from '@/pages/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/app/globals.css b/app/globals.css new file mode 100644 index 0000000..c871d07 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,92 @@ +@import 'tailwindcss'; +@import "tw-animate-css"; + +@import '../src/styles/theme.css'; + +/* + 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. +*/ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentColor); + } + + * { + @apply border-border + } +} + +:root { + --radius: 0.5rem; + --background: oklch(0.08 0.01 265); + --foreground: oklch(0.95 0.01 265); + --card: oklch(0.15 0.01 265); + --card-foreground: oklch(0.98 0 0); + --popover: oklch(0.15 0.01 265); + --popover-foreground: oklch(0.98 0 0); + --primary: oklch(0.35 0.15 265); + --primary-foreground: oklch(0.98 0 0); + --secondary: oklch(0.25 0.01 265); + --secondary-foreground: oklch(0.95 0.01 265); + --muted: oklch(0.20 0.01 265); + --muted-foreground: oklch(0.65 0.01 265); + --accent: oklch(0.75 0.15 195); + --accent-foreground: oklch(0.15 0.01 265); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.98 0 0); + --border: oklch(0.25 0.01 265); + --input: oklch(0.28 0.02 265); + --ring: oklch(0.75 0.15 195); + --chart-1: oklch(0.70 0.20 10); + --chart-2: oklch(0.70 0.20 160); + --chart-3: oklch(0.70 0.20 200); + --chart-4: oklch(0.70 0.20 240); + --chart-5: oklch(0.70 0.20 280); +} + +@theme { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + + --radius-sm: calc(var(--radius) * 0.5); + --radius-md: var(--radius); + --radius-lg: calc(var(--radius) * 1.5); + --radius-xl: calc(var(--radius) * 2); + --radius-2xl: calc(var(--radius) * 3); + --radius-full: 9999px; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-inter), sans-serif; +} + +body { + font-family: var(--font-inter), sans-serif; +} + +code, pre { + font-family: var(--font-jetbrains-mono), monospace; +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..49d9aea --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,40 @@ +import type { Metadata } from 'next'; +import { Inter, JetBrains_Mono, Bricolage_Grotesque } from 'next/font/google'; +import './globals.css'; +import { Providers } from './providers'; + +const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter', +}); + +const jetbrainsMono = JetBrains_Mono({ + subsets: ['latin'], + variable: '--font-jetbrains-mono', +}); + +const bricolageGrotesque = Bricolage_Grotesque({ + subsets: ['latin'], + variable: '--font-bricolage-grotesque', +}); + +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/app/molecules/page.tsx b/app/molecules/page.tsx new file mode 100644 index 0000000..27776b3 --- /dev/null +++ b/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/app/organisms/page.tsx b/app/organisms/page.tsx new file mode 100644 index 0000000..f5e4aa2 --- /dev/null +++ b/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/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..fcb84a0 --- /dev/null +++ b/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/app/providers.tsx b/app/providers.tsx new file mode 100644 index 0000000..23b2730 --- /dev/null +++ b/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/app/settings/page.tsx b/app/settings/page.tsx new file mode 100644 index 0000000..55d950e --- /dev/null +++ b/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/app/templates/page.tsx b/app/templates/page.tsx new file mode 100644 index 0000000..3599edc --- /dev/null +++ b/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/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/next.config.ts b/next.config.ts new file mode 100644 index 0000000..f5e033c --- /dev/null +++ b/next.config.ts @@ -0,0 +1,49 @@ +import type { NextConfig } from 'next'; + +const nextConfig: NextConfig = { + // Output as static HTML for GitHub Pages, or standalone for Docker + output: process.env.BUILD_STATIC ? 'export' : 'standalone', + + // 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/ + basePath: process.env.NEXT_PUBLIC_BASE_PATH || '', + + // Configure webpack for browser-only modules + webpack: (config, { isServer }) => { + if (!isServer) { + // Externalize node modules for browser + config.resolve.fallback = { + ...config.resolve.fallback, + fs: false, + path: false, + crypto: false, + 'node:url': false, + 'node:fs': false, + 'node:fs/promises': false, + 'node:vm': false, + 'node:path': false, + 'node:crypto': false, + 'node:child_process': false, + }; + } + return config; + }, + + // Environment variables that should be available on the client + env: { + NEXT_PUBLIC_FLASK_BACKEND_URL: process.env.NEXT_PUBLIC_FLASK_BACKEND_URL || '', + }, + + // Image optimization + images: { + unoptimized: true, // Required for static export + }, + + // Experimental features + experimental: { + optimizePackageImports: ['@radix-ui/react-icons', '@phosphor-icons/react'], + }, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 44734eb..ab12fe3 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", @@ -83,15 +83,13 @@ "@tailwindcss/postcss": "^4.1.8", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react-swc": "^4.2.2", "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", @@ -3877,6 +4729,7 @@ "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -3892,6 +4745,7 @@ "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -3918,6 +4772,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3934,6 +4789,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3950,6 +4806,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3966,6 +4823,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3982,6 +4840,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3998,6 +4857,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4014,6 +4874,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4030,6 +4891,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4046,6 +4908,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4070,6 +4933,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4086,6 +4950,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { "version": "1.6.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -4096,6 +4961,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.6.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -4105,6 +4971,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { "version": "1.1.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -4114,6 +4981,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { "version": "1.0.7", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -4125,6 +4993,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { "version": "0.10.1", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -4134,6 +5003,7 @@ }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { "version": "2.8.1", + "dev": true, "inBundle": true, "license": "0BSD", "optional": true @@ -4145,6 +5015,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4161,6 +5032,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4184,20 +5056,6 @@ "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" - } - }, "node_modules/@tanstack/query-core": { "version": "5.90.11", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", @@ -4224,6 +5082,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 +5181,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 +5598,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", @@ -4827,6 +5955,229 @@ "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/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 +6185,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 +6241,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 +6297,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 +6355,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 +6404,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 +6493,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 +6952,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 +7051,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 +7119,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 +7131,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 +7184,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 +7219,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", @@ -5655,6 +7239,7 @@ "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -5664,6 +7249,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 +7336,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 +7376,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 +7465,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 +7554,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 +7875,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 +8213,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 +8257,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 +8297,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 +8392,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", @@ -6328,6 +8463,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -6341,6 +8477,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 +8574,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 +8631,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 +8664,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 +8674,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 +8697,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 +8738,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 +8766,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 +8878,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 +8911,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 +9066,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 +9115,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 +9333,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 +9380,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 +9414,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 +9453,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 +9491,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 +9524,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6750,6 +9545,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6770,6 +9566,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6790,6 +9587,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6810,6 +9608,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6830,6 +9629,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6850,6 +9650,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6870,6 +9671,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6890,6 +9692,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6910,6 +9713,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6930,6 +9734,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -6984,6 +9789,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 +9812,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 +9860,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 +9935,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 +10008,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 +10040,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 +10103,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 +10168,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 +10329,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 +10421,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 +10456,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", @@ -7461,6 +10572,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 +10934,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 +11015,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 +11047,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 +11123,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 +11224,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 +11299,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", @@ -8127,6 +11519,13 @@ "integrity": "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA==", "license": "MIT" }, + "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": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", @@ -8142,6 +11541,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 +11691,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 +11727,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", @@ -8188,6 +11760,7 @@ "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 +11798,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 +11842,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 +11917,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 +12033,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 +12079,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 +12269,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 +12355,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 +12481,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 +12509,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..8765625 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", @@ -87,15 +85,13 @@ "@tailwindcss/postcss": "^4.1.8", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react-swc": "^4.2.2", "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/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/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/storage.ts b/src/lib/storage.ts index cde3ff4..65cd56d 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 { diff --git a/tsconfig.json b/tsconfig.json index 6cc0f0e..70a33cc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,34 +1,44 @@ { "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "target": "ES2020", - "useDefineForClassFields": true, "lib": [ "ES2020", "DOM", "DOM.Iterable" ], + "jsx": "preserve", "module": "ESNext", - "skipLibCheck": true, - "strictNullChecks": true, - /* Bundler mode */ "moduleResolution": "bundler", - "allowImportingTsExtensions": true, "resolveJsonModule": true, - "isolatedModules": true, - "moduleDetection": "force", + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "strictNullChecks": true, "noEmit": true, - "jsx": "react-jsx", - /* Linting */ - "noFallthroughCasesInSwitch": 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" + ], + "exclude": [ + "node_modules" ] } From ea79d908bbe8cb9ee8883aa551e964fa81cb2d39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 13:36:35 +0000 Subject: [PATCH 4/4] Complete Next.js conversion - removed sql.js, updated routing, fixed Tailwind Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- app/globals.css | 92 ------ index.html | 19 -- next.config.js | 14 + next.config.ts | 49 ---- nginx.conf | 29 -- package-lock.json | 268 +++++++++--------- package.json | 4 +- postcss.config.js | 5 + src/App.tsx | 115 -------- {app => src/app}/PageLayout.tsx | 0 {app => src/app}/atoms/page.tsx | 0 {app => src/app}/demo/page.tsx | 4 +- src/app/globals.css | 49 ++++ {app => src/app}/layout.tsx | 23 +- {app => src/app}/molecules/page.tsx | 0 {app => src/app}/organisms/page.tsx | 0 {app => src/app}/page.tsx | 0 {app => src/app}/providers.tsx | 0 {app => src/app}/settings/page.tsx | 0 {app => src/app}/templates/page.tsx | 0 src/app/theme.css | 262 +++++++++++++++++ .../demo}/DemoFeatureCards.tsx | 0 .../demo}/demo-constants.ts | 0 .../namespace-manager/NamespaceSelector.tsx | 8 +- .../features/snippet-viewer/SnippetViewer.tsx | 2 +- src/hooks/useDatabaseOperations.ts | 17 +- src/hooks/useSettingsState.ts | 6 +- src/lib/db-constants.ts | 8 - src/lib/db-core/clearDatabase.ts | 19 -- src/lib/db-core/exportDatabase.ts | 6 - src/lib/db-core/getDatabaseStats.ts | 32 --- src/lib/db-core/getFlaskAdapter.ts | 23 -- src/lib/db-core/importDatabase.ts | 19 -- src/lib/db-core/initDB.ts | 57 ---- src/lib/db-core/saveDB.ts | 19 -- src/lib/db-core/state.ts | 9 - src/lib/db-core/wipeAndRecreateDB.ts | 15 - src/lib/db-indexeddb.ts | 100 ------- src/lib/db-localstorage.ts | 36 --- src/lib/db-mapper.ts | 52 ---- src/lib/db-namespaces/createNamespace.ts | 30 -- src/lib/db-namespaces/deleteNamespace.ts | 30 -- .../db-namespaces/ensureDefaultNamespace.ts | 27 -- src/lib/db-namespaces/getAllNamespaces.ts | 16 -- src/lib/db-namespaces/getNamespaceById.ts | 15 - src/lib/db-schema.ts | 106 ------- src/lib/db-snippets/bulkMoveSnippets.ts | 23 -- src/lib/db-snippets/createSnippet.ts | 34 --- src/lib/db-snippets/createTemplate.ts | 25 -- src/lib/db-snippets/deleteSnippet.ts | 16 -- src/lib/db-snippets/getAllSnippets.ts | 16 -- src/lib/db-snippets/getAllTemplates.ts | 10 - src/lib/db-snippets/getSnippet.ts | 21 -- src/lib/db-snippets/getSnippetsByNamespace.ts | 13 - src/lib/db-snippets/moveSnippetToNamespace.ts | 25 -- src/lib/db-snippets/seedDatabase.ts | 41 --- src/lib/db-snippets/syncTemplatesFromJSON.ts | 20 -- src/lib/db-snippets/updateSnippet.ts | 34 --- src/lib/db.ts | 247 ++++++++++++++-- src/lib/db.ts.old | 38 +++ src/lib/indexeddb-storage.ts | 241 ++++++++++++++++ src/lib/storage.ts | 45 +++ src/lib/types.ts | 1 + src/main.tsx | 35 --- src/pages/AtomsPage.tsx | 38 --- src/pages/DemoPage.tsx | 55 ---- src/pages/HomePage.tsx | 18 -- src/pages/MoleculesPage.tsx | 38 --- src/pages/OrganismsPage.tsx | 38 --- src/pages/SettingsPage.tsx | 100 ------- src/pages/TemplatesPage.tsx | 38 --- src/store/slices/namespacesSlice.ts | 9 +- tailwind.config.js | 205 ++++---------- tsconfig.json | 5 +- vite.config.ts | 29 -- 75 files changed, 1101 insertions(+), 1942 deletions(-) delete mode 100644 app/globals.css delete mode 100644 index.html create mode 100644 next.config.js delete mode 100644 next.config.ts delete mode 100644 nginx.conf create mode 100644 postcss.config.js delete mode 100644 src/App.tsx rename {app => src/app}/PageLayout.tsx (100%) rename {app => src/app}/atoms/page.tsx (100%) rename {app => src/app}/demo/page.tsx (94%) create mode 100644 src/app/globals.css rename {app => src/app}/layout.tsx (54%) rename {app => src/app}/molecules/page.tsx (100%) rename {app => src/app}/organisms/page.tsx (100%) rename {app => src/app}/page.tsx (100%) rename {app => src/app}/providers.tsx (100%) rename {app => src/app}/settings/page.tsx (100%) rename {app => src/app}/templates/page.tsx (100%) create mode 100644 src/app/theme.css rename src/{pages => components/demo}/DemoFeatureCards.tsx (100%) rename src/{pages => components/demo}/demo-constants.ts (100%) delete mode 100644 src/lib/db-constants.ts delete mode 100644 src/lib/db-core/clearDatabase.ts delete mode 100644 src/lib/db-core/exportDatabase.ts delete mode 100644 src/lib/db-core/getDatabaseStats.ts delete mode 100644 src/lib/db-core/getFlaskAdapter.ts delete mode 100644 src/lib/db-core/importDatabase.ts delete mode 100644 src/lib/db-core/initDB.ts delete mode 100644 src/lib/db-core/saveDB.ts delete mode 100644 src/lib/db-core/state.ts delete mode 100644 src/lib/db-core/wipeAndRecreateDB.ts delete mode 100644 src/lib/db-indexeddb.ts delete mode 100644 src/lib/db-localstorage.ts delete mode 100644 src/lib/db-mapper.ts delete mode 100644 src/lib/db-namespaces/createNamespace.ts delete mode 100644 src/lib/db-namespaces/deleteNamespace.ts delete mode 100644 src/lib/db-namespaces/ensureDefaultNamespace.ts delete mode 100644 src/lib/db-namespaces/getAllNamespaces.ts delete mode 100644 src/lib/db-namespaces/getNamespaceById.ts delete mode 100644 src/lib/db-schema.ts delete mode 100644 src/lib/db-snippets/bulkMoveSnippets.ts delete mode 100644 src/lib/db-snippets/createSnippet.ts delete mode 100644 src/lib/db-snippets/createTemplate.ts delete mode 100644 src/lib/db-snippets/deleteSnippet.ts delete mode 100644 src/lib/db-snippets/getAllSnippets.ts delete mode 100644 src/lib/db-snippets/getAllTemplates.ts delete mode 100644 src/lib/db-snippets/getSnippet.ts delete mode 100644 src/lib/db-snippets/getSnippetsByNamespace.ts delete mode 100644 src/lib/db-snippets/moveSnippetToNamespace.ts delete mode 100644 src/lib/db-snippets/seedDatabase.ts delete mode 100644 src/lib/db-snippets/syncTemplatesFromJSON.ts delete mode 100644 src/lib/db-snippets/updateSnippet.ts create mode 100644 src/lib/db.ts.old create mode 100644 src/lib/indexeddb-storage.ts delete mode 100644 src/main.tsx delete mode 100644 src/pages/AtomsPage.tsx delete mode 100644 src/pages/DemoPage.tsx delete mode 100644 src/pages/HomePage.tsx delete mode 100644 src/pages/MoleculesPage.tsx delete mode 100644 src/pages/OrganismsPage.tsx delete mode 100644 src/pages/SettingsPage.tsx delete mode 100644 src/pages/TemplatesPage.tsx delete mode 100644 vite.config.ts diff --git a/app/globals.css b/app/globals.css deleted file mode 100644 index c871d07..0000000 --- a/app/globals.css +++ /dev/null @@ -1,92 +0,0 @@ -@import 'tailwindcss'; -@import "tw-animate-css"; - -@import '../src/styles/theme.css'; - -/* - 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. -*/ -@layer base { - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentColor); - } - - * { - @apply border-border - } -} - -:root { - --radius: 0.5rem; - --background: oklch(0.08 0.01 265); - --foreground: oklch(0.95 0.01 265); - --card: oklch(0.15 0.01 265); - --card-foreground: oklch(0.98 0 0); - --popover: oklch(0.15 0.01 265); - --popover-foreground: oklch(0.98 0 0); - --primary: oklch(0.35 0.15 265); - --primary-foreground: oklch(0.98 0 0); - --secondary: oklch(0.25 0.01 265); - --secondary-foreground: oklch(0.95 0.01 265); - --muted: oklch(0.20 0.01 265); - --muted-foreground: oklch(0.65 0.01 265); - --accent: oklch(0.75 0.15 195); - --accent-foreground: oklch(0.15 0.01 265); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(0.98 0 0); - --border: oklch(0.25 0.01 265); - --input: oklch(0.28 0.02 265); - --ring: oklch(0.75 0.15 195); - --chart-1: oklch(0.70 0.20 10); - --chart-2: oklch(0.70 0.20 160); - --chart-3: oklch(0.70 0.20 200); - --chart-4: oklch(0.70 0.20 240); - --chart-5: oklch(0.70 0.20 280); -} - -@theme { - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - - --radius-sm: calc(var(--radius) * 0.5); - --radius-md: var(--radius); - --radius-lg: calc(var(--radius) * 1.5); - --radius-xl: calc(var(--radius) * 2); - --radius-2xl: calc(var(--radius) * 3); - --radius-full: 9999px; -} - -h1, h2, h3, h4, h5, h6 { - font-family: var(--font-inter), sans-serif; -} - -body { - font-family: var(--font-inter), sans-serif; -} - -code, pre { - font-family: var(--font-jetbrains-mono), monospace; -} 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/next.config.ts b/next.config.ts deleted file mode 100644 index f5e033c..0000000 --- a/next.config.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { NextConfig } from 'next'; - -const nextConfig: NextConfig = { - // Output as static HTML for GitHub Pages, or standalone for Docker - output: process.env.BUILD_STATIC ? 'export' : 'standalone', - - // 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/ - basePath: process.env.NEXT_PUBLIC_BASE_PATH || '', - - // Configure webpack for browser-only modules - webpack: (config, { isServer }) => { - if (!isServer) { - // Externalize node modules for browser - config.resolve.fallback = { - ...config.resolve.fallback, - fs: false, - path: false, - crypto: false, - 'node:url': false, - 'node:fs': false, - 'node:fs/promises': false, - 'node:vm': false, - 'node:path': false, - 'node:crypto': false, - 'node:child_process': false, - }; - } - return config; - }, - - // Environment variables that should be available on the client - env: { - NEXT_PUBLIC_FLASK_BACKEND_URL: process.env.NEXT_PUBLIC_FLASK_BACKEND_URL || '', - }, - - // Image optimization - images: { - unoptimized: true, // Required for static export - }, - - // Experimental features - 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 ab12fe3..2dbf27b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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,9 +79,10 @@ }, "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", + "autoprefixer": "^10.4.23", "eslint": "^9.28.0", "eslint-config-next": "^16.1.3", "eslint-plugin-react-hooks": "^5.2.0", @@ -4726,9 +4726,9 @@ } }, "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": { @@ -4738,37 +4738,37 @@ "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" ], @@ -4783,9 +4783,9 @@ } }, "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" ], @@ -4800,9 +4800,9 @@ } }, "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" ], @@ -4817,9 +4817,9 @@ } }, "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" ], @@ -4834,9 +4834,9 @@ } }, "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" ], @@ -4851,9 +4851,9 @@ } }, "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" ], @@ -4868,9 +4868,9 @@ } }, "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" ], @@ -4885,9 +4885,9 @@ } }, "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" ], @@ -4902,9 +4902,9 @@ } }, "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" ], @@ -4919,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", @@ -4937,10 +4937,10 @@ "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" }, @@ -4948,70 +4948,10 @@ "node": ">=14.0.0" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.6.0", - "dev": true, - "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", - "dev": true, - "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", - "dev": true, - "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", - "dev": true, - "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", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "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" ], @@ -5026,9 +4966,9 @@ } }, "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" ], @@ -5043,17 +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" + "tailwindcss": "4.1.18" } }, "node_modules/@tanstack/query-core": { @@ -6142,6 +6082,43 @@ "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", @@ -7236,9 +7213,9 @@ } }, "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": { @@ -8417,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", @@ -10494,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", @@ -11513,12 +11511,6 @@ "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==", - "license": "MIT" - }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -11751,9 +11743,9 @@ } }, "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": { diff --git a/package.json b/package.json index 8765625..be224c9 100644 --- a/package.json +++ b/package.json @@ -72,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", @@ -82,9 +81,10 @@ }, "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", + "autoprefixer": "^10.4.23", "eslint": "^9.28.0", "eslint-config-next": "^16.1.3", "eslint-plugin-react-hooks": "^5.2.0", 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.tsx deleted file mode 100644 index f92ed60..0000000 --- a/src/App.tsx +++ /dev/null @@ -1,115 +0,0 @@ -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' - -function AppContent() { - const { menuOpen } = useNavigation() - - return ( -
-
- - - - -
-
-
- - -
- -
-

- CodeSnippet -

-
- - - -
-
-
- -
- - } /> - } /> - } /> - } /> - } /> - } /> - } /> - -
- -
-
-
-

Save, organize, and share your code snippets with beautiful syntax highlighting and live execution

-

Supports React preview and Python execution via Pyodide

-
-
-
-
-
- ) -} - -function App() { - return ( - - - - - - ) -} - -export default App diff --git a/app/PageLayout.tsx b/src/app/PageLayout.tsx similarity index 100% rename from app/PageLayout.tsx rename to src/app/PageLayout.tsx diff --git a/app/atoms/page.tsx b/src/app/atoms/page.tsx similarity index 100% rename from app/atoms/page.tsx rename to src/app/atoms/page.tsx diff --git a/app/demo/page.tsx b/src/app/demo/page.tsx similarity index 94% rename from app/demo/page.tsx rename to src/app/demo/page.tsx index 7c34d05..d6f4142 100644 --- a/app/demo/page.tsx +++ b/src/app/demo/page.tsx @@ -5,8 +5,8 @@ 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 '@/pages/demo-constants'; -import { DemoFeatureCards } from '@/pages/DemoFeatureCards'; +import { DEMO_CODE } from '@/components/demo/demo-constants'; +import { DemoFeatureCards } from '@/components/demo/DemoFeatureCards'; import { PageLayout } from '../PageLayout'; export default function DemoPage() { 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/app/layout.tsx b/src/app/layout.tsx similarity index 54% rename from app/layout.tsx rename to src/app/layout.tsx index 49d9aea..932bca6 100644 --- a/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,23 +1,7 @@ import type { Metadata } from 'next'; -import { Inter, JetBrains_Mono, Bricolage_Grotesque } from 'next/font/google'; import './globals.css'; import { Providers } from './providers'; -const inter = Inter({ - subsets: ['latin'], - variable: '--font-inter', -}); - -const jetbrainsMono = JetBrains_Mono({ - subsets: ['latin'], - variable: '--font-jetbrains-mono', -}); - -const bricolageGrotesque = Bricolage_Grotesque({ - subsets: ['latin'], - variable: '--font-bricolage-grotesque', -}); - 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', @@ -30,7 +14,12 @@ export default function RootLayout({ }>) { return ( - + + + + + + {children} diff --git a/app/molecules/page.tsx b/src/app/molecules/page.tsx similarity index 100% rename from app/molecules/page.tsx rename to src/app/molecules/page.tsx diff --git a/app/organisms/page.tsx b/src/app/organisms/page.tsx similarity index 100% rename from app/organisms/page.tsx rename to src/app/organisms/page.tsx diff --git a/app/page.tsx b/src/app/page.tsx similarity index 100% rename from app/page.tsx rename to src/app/page.tsx diff --git a/app/providers.tsx b/src/app/providers.tsx similarity index 100% rename from app/providers.tsx rename to src/app/providers.tsx diff --git a/app/settings/page.tsx b/src/app/settings/page.tsx similarity index 100% rename from app/settings/page.tsx rename to src/app/settings/page.tsx diff --git a/app/templates/page.tsx b/src/app/templates/page.tsx similarity index 100% rename from app/templates/page.tsx rename to src/app/templates/page.tsx 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/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/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 65cd56d..dbce4b5 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -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 70a33cc..30346b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "DOM", "DOM.Iterable" ], - "jsx": "preserve", + "jsx": "react-jsx", "module": "ESNext", "moduleResolution": "bundler", "resolveJsonModule": true, @@ -36,7 +36,8 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + ".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') - } - }, -});