Index: nv.example
===================================================================
--- .env.example	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,3 +1,0 @@
-DATABASE_URL="postgres://app:app@db:5432/postgres"
-AUTH_SECRET="your_secret_key_here"
-PORT=8080
Index: itattributes
===================================================================
--- .gitattributes	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,20 +1,0 @@
-* text=auto
-
-*.txt text eol=lf
-*.html text eol=lf
-*.md text eol=lf
-*.css text eol=lf
-*.scss text eol=lf
-*.map text eol=lf
-*.js text eol=lf
-*.jsx text eol=lf
-*.ts text eol=lf
-*.tsx text eol=lf
-*.json text eol=lf
-*.yml text eol=lf
-*.yaml text eol=lf
-*.xml text eol=lf
-*.svg text eol=lf
-*.sh text eol=lf
-*.sql text eol=lf
-database/migrations/** text eol=lf
Index: ckerfile
===================================================================
--- Dockerfile	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,30 +1,0 @@
-FROM node:20-alpine AS builder
-
-WORKDIR /app
-
-COPY package.json package-lock.json* ./
-RUN npm ci
-
-COPY . .
-RUN npm run build
-
-FROM node:20-alpine
-
-WORKDIR /app
-
-RUN apk add --no-cache postgresql-client
-
-COPY --from=builder /app/dist ./dist
-COPY --from=builder /app/node_modules ./node_modules
-
-COPY database ./database
-
-COPY package.json ./
-COPY drizzle.config.ts ./
-COPY docker-entrypoint.sh ./
-
-RUN chmod +x ./docker-entrypoint.sh
-
-EXPOSE 8080
-
-ENTRYPOINT ["./docker-entrypoint.sh"]
Index: README.md
===================================================================
--- README.md	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ README.md	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,161 +1,53 @@
-# PC Forge
+Generated with [vike.dev/new](https://vike.dev/new) ([version 544](https://www.npmjs.com/package/create-vike/v/0.0.544)) using this command:
 
-**Forge your own PC build.** A web application for crafting, sharing, and rating custom PC builds. A project for the **Databases 2025/26** course.
-
-## ✨ Features
-
-- 🔨 Forge custom PC builds from a comprehensive component database
-- 💾 Browse CPUs, GPUs, motherboards, storage, and more
-- ⭐ Rate and review community builds
-- 💬 Suggest new components for the database
-- 👤 User authentication and admin management
-
-## 🛠️ Tech Stack
-
-- **Frontend**: React 19, Material-UI, Emotion
-- **Backend**: Hono, Node.js
-- **Database**: PostgreSQL 16
-- **ORM**: Drizzle ORM
-- **Build Tool**: Vite
-- **Containerization**: Docker & Docker Compose
-
-## 📋 Prerequisites
-
-- [Docker Desktop](https://www.docker.com/products/docker-desktop) (latest version)
-- Docker Compose V2 (included with Docker Desktop)
-- [Node.js 20+](https://nodejs.org/) (optional, for local development)
-- [npm](https://www.npmjs.com/)
-
-## 🚀 Quick Start
-
-### 1. Clone the Repository
-```agsl
-git clone https://github.com/nkvtd/pc-forge.git
-cd pc-forge
+```sh
+npm create vike@latest --- --react --authjs --telefunc --hono --drizzle --biome
 ```
 
-### 2. Configure Environment
+## Contents
 
-**Copy the example environment file:**
-```agsl
-cp .env.example .env
-```
-**Update only the AUTH_SECRET in `.env`:**
-```agsl
-DATABASE_URL="postgresql://app:app@db:5432/postgres"
-AUTH_SECRET="YOUR_GENERATED_SECRET_KEY_HERE"
-PORT=8080
-```
-> **Important**: The `DATABASE_URL` and `PORT` are pre-configured for Docker. Only change the `AUTH_SECRET` to a random, secure value (you can generate one using `openssl rand -base64 32`).
+- [Vike](#vike)
+  - [Plus files](#plus-files)
+  - [Routing](#routing)
+  - [SSR](#ssr)
+  - [HTML Streaming](#html-streaming)
+- [Photon](#photon)
 
-### 3. Start with Docker
-```agsl
-docker compose up --build
-```
+## Vike
 
-The application will automatically:
-- ✅ Start PostgreSQL database on port **5432**
-- ✅ Run database migrations
-- ✅ Seed initial data (users, components, builds)
-- ✅ Start the web server on port **8080**
+This app is ready to start. It's powered by [Vike](https://vike.dev) and [React](https://react.dev/learn).
 
-**Access the application at: http://localhost:8080**
+### Plus files
 
-## ⚙️ Pre-configured Settings
+[The + files are the interface](https://vike.dev/config) between Vike and your code.
 
-The following settings are pre-configured for Docker and should **not** be changed unless you know what you're doing:
+- [`+config.ts`](https://vike.dev/settings) — Settings (e.g. `<title>`)
+- [`+Page.tsx`](https://vike.dev/Page) — The `<Page>` component
+- [`+data.ts`](https://vike.dev/data) — Fetching data (for your `<Page>` component)
+- [`+Layout.tsx`](https://vike.dev/Layout) — The `<Layout>` component (wraps your `<Page>` components)
+- [`+Head.tsx`](https://vike.dev/Head) - Sets `<head>` tags
+- [`/pages/_error/+Page.tsx`](https://vike.dev/error-page) — The error page (rendered when an error occurs)
+- [`+onPageTransitionStart.ts`](https://vike.dev/onPageTransitionStart) and `+onPageTransitionEnd.ts` — For page transition animations
 
-- **Database Host**: `db` (Docker service name)
-- **Database Port**: `5432`
-- **Database Name**: `postgres`
-- **Database User**: `app`
-- **Database Password**: `app`
-- **Application Port**: `8080`
+### Routing
 
-## 💻 Development
+[Vike's built-in router](https://vike.dev/routing) lets you choose between:
 
-### Local Development (Without Docker)
-**Install dependencies**
-```agsl
-npm install
-```
-**Update DATABASE_URL in .env to use localhost**
-```agsl
-DATABASE_URL="postgresql://app:app@localhost:5432/postgres"
-```
-**Run database migrations**
-```agsl
-npm run drizzle:migrate
-```
+- [Filesystem Routing](https://vike.dev/filesystem-routing) (the URL of a page is determined based on where its `+Page.jsx` file is located on the filesystem)
+- [Route Strings](https://vike.dev/route-string)
+- [Route Functions](https://vike.dev/route-function)
 
-**Seed database**
-```agsl
-npm run drizzle:seed
-```
+### SSR
 
-**Start development server**
-```agsl
-npm run dev
-```
+SSR is enabled by default. You can [disable it](https://vike.dev/ssr) for all or specific pages.
 
-## 📁 Project Structure
-```agsl
-pc-forge/
-├── database/
-│ └── drizzle/
-│ ├── schema/ # Database schema definitions
-│ ├── queries/ # Database queries
-│ └── util/
-│ └── seed.ts # Database seeding script
-├── dist/ # Built application
-├── migrations/ # Generated database migrations
-├── pages/ # Vike pages
-├── server/ # Backend server code
-├── Dockerfile # Docker image configuration
-├── docker-compose.yml # Docker services orchestration
-├── docker-entrypoint.sh # Container startup script
-├── drizzle.config.ts # Drizzle ORM configuration
-├── .env.example # Example environment variables
-└── package.json
-```
+### HTML Streaming
 
+You can [enable/disable HTML streaming](https://vike.dev/stream) for all or specific pages.
 
-## 👥 Default Users
+## Photon
 
-After the database is seeded, you can log in with these accounts:
+[Photon](https://photonjs.dev) is a next-generation infrastructure for deploying JavaScript servers.
 
-| Username | Password | Role |
-|----------|----------|------|
-| admin | admin | Admin |
-| tome | tg | User |
-| mihail | mn | User |
-| stefan | sv | User |
-| pc_wizard | pw | User |
-| budget_king | bk | User |
-| rgb_lover | rgb | User |
-| streamer_pro | sp | User |
-| office_guy | og | User |
-| linux_fan | lf | User |
-| first_timer | ft | User |
+See [Introducing Photon](https://vike.dev/blog/photon) and [Why Photon](https://photonjs.dev/why) to learn more.
 
-## 🔧 Environment Variables
-
-| Variable | Description | Default | Should Change? |
-|----------|-------------|---------|----------------|
-| `DATABASE_URL` | PostgreSQL connection string | `postgresql://app:app@db:5432/postgres` | ❌ No (pre-configured) |
-| `AUTH_SECRET` | Authentication secret key | - | ✅ **Yes (required)** |
-| `PORT` | Application port | `8080` | ❌ No (pre-configured) |
-
-# 📚 Course Information
-
-This project was developed for the Databases 2025/26 course. It demonstrates:
-
-- Complex relational database design with PostgreSQL
-- Database migrations and seeding
-- ORM usage (Drizzle ORM)
-- Full-stack web application development
-- Containerization with Docker
-
-# 📄 License
-
-MIT License
Index: TODO.md
===================================================================
--- TODO.md	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ TODO.md	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,18 @@
+Follow the steps below to finish setting up your application.
+
+## Drizzle
+
+First, ensure that `DATABASE_URL` is configured in `.env` file, then create the database:
+
+```bash
+npm run drizzle:generate # a script that executes drizzle-kit generate.
+npm run drizzle:migrate # a script that executes drizzle-kit migrate.
+```
+
+> \[!NOTE]
+> The `drizzle-kit generate` command is used to generate SQL migration files based on your Drizzle schema.
+>
+> The `drizzle-kit migrate` command is used to apply the generated migrations to your database.
+
+Read more on [Drizzle ORM documentation](https://orm.drizzle.team/docs/overview)
+
Index: th.d.ts
===================================================================
--- auth.d.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,15 +1,0 @@
-import type { DefaultSession } from "@auth/core/types";
-
-declare module "@auth/core/types" {
-    interface User {
-        id: string;
-        isAdmin?: boolean;
-    }
-
-    interface Session {
-        user?: {
-            id: string;
-            isAdmin?: boolean;
-        } & DefaultSession["user"];
-    }
-}
Index: mponents/AddComponentDialog.tsx
===================================================================
--- components/AddComponentDialog.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,361 +1,0 @@
-import React, { useState, useEffect } from 'react';
-import {
-    Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField,
-    Grid, Box, Typography, MenuItem, IconButton, Avatar, Alert
-} from '@mui/material';
-import AddIcon from '@mui/icons-material/Add';
-import DeleteIcon from '@mui/icons-material/Delete';
-import CloseIcon from '@mui/icons-material/Close';
-import { onCreateNewComponent, onGetDetailsForNewComponent } from '../pages/dashboard/admin/adminDashboard.telefunc';
-
-const COMPONENT_TYPES = [
-    { value: 'cpu', label: 'CPU' },
-    { value: 'gpu', label: 'Graphics Card' },
-    { value: 'motherboard', label: 'Motherboard' },
-    { value: 'memory', label: 'Memory' },
-    { value: 'storage', label: 'Storage' },
-    { value: 'power_supply', label: 'Power Supply' },
-    { value: 'case', label: 'Case' },
-    { value: 'cooler', label: 'CPU Cooler' },
-];
-
-export default function AddComponentDialog({ open, onClose, onSuccess, prefillData }: {
-    open: boolean;
-    onClose: () => void;
-    onSuccess: () => void;
-    prefillData?: {
-        type?: string;
-        suggestionLink?: string;
-        suggestionDescription?: string;
-    };
-}) {
-    const [name, setName] = useState('');
-    const [brand, setBrand] = useState('');
-    const [price, setPrice] = useState('');
-    const [imgUrl, setImgUrl] = useState('');
-    const [type, setType] = useState('');
-
-    const [requiredFields, setRequiredFields] = useState<any[]>([]);
-    const [multiTables, setMultiTables] = useState<any>({});
-    const [specificData, setSpecificData] = useState<any>({});
-
-    const [loading, setLoading] = useState(false);
-    const [error, setError] = useState('');
-
-    useEffect(() => {
-        if (type) {
-            setLoading(true);
-            onGetDetailsForNewComponent({ type })
-                .then((details) => {
-                    console.log('Component details:', details);
-
-                    setRequiredFields(details.requiredFields || []);
-                    setMultiTables(details.multiTables || {});
-
-                    const initialData: any = {};
-
-                    (details.requiredFields || []).forEach((field: any) => {
-                        const fieldName = typeof field === 'string' ? field : field.name;
-                        initialData[fieldName] = '';
-                    });
-
-                    Object.keys(details.multiTables || {}).forEach((tableName) => {
-                        initialData[tableName] = [];
-                    });
-
-                    setSpecificData(initialData);
-                })
-                .catch((err) => {
-                    console.error('Field load error:', err);
-                    setError('Failed to load component fields');
-                })
-                .finally(() => setLoading(false));
-        }
-    }, [type]);
-
-    useEffect(() => {
-        if (open && prefillData) {
-            if (prefillData.type) setType(prefillData.type);
-        }
-    }, [open, prefillData]);
-
-    const handleFieldChange = (fieldName: string, value: any) => {
-        setSpecificData((prev: any) => ({
-            ...prev,
-            [fieldName]: value
-        }));
-    };
-
-    const handleAddMultiTableRow = (tableName: string) => {
-        const tableConfig = multiTables[tableName];
-        const newRow: any = {};
-
-        tableConfig.forEach((field: string) => {
-            newRow[field] = '';
-        });
-
-        setSpecificData((prev: any) => ({
-            ...prev,
-            [tableName]: [...(prev[tableName] || []), newRow]
-        }));
-    };
-
-    const handleRemoveMultiTableRow = (tableName: string, index: number) => {
-        setSpecificData((prev: any) => ({
-            ...prev,
-            [tableName]: prev[tableName].filter((_: any, i: number) => i !== index)
-        }));
-    };
-
-    const handleMultiTableFieldChange = (tableName: string, index: number, fieldName: string, value: any) => {
-        setSpecificData((prev: any) => {
-            const updated = [...prev[tableName]];
-            updated[index] = { ...updated[index], [fieldName]: value };
-            return { ...prev, [tableName]: updated };
-        });
-    };
-
-    const handleSubmit = async () => {
-        setError('');
-
-        if (!name.trim()) return setError('Name is required');
-        if (!brand.trim()) return setError('Brand is required');
-        if (!price || isNaN(Number(price)) || Number(price) <= 0) return setError('Valid price is required');
-        if (!imgUrl.trim()) return setError('Image URL is required');
-        if (!type) return setError('Component type is required');
-
-        setLoading(true);
-        try {
-            await onCreateNewComponent({
-                name: name.trim(),
-                brand: brand.trim(),
-                price: Number(price),
-                imgUrl: imgUrl.trim(),
-                type,
-                specificData
-            });
-
-            onSuccess();
-            handleClose();
-        } catch (err) {
-            setError('Failed to create component. Please check all fields.');
-        } finally {
-            setLoading(false);
-        }
-    };
-
-    const handleClose = () => {
-        setName('');
-        setBrand('');
-        setPrice('');
-        setImgUrl('');
-        setType('');
-        setSpecificData({});
-        setRequiredFields([]);
-        setMultiTables({});
-        setError('');
-        onClose();
-    };
-
-    const formatFieldLabel = (fieldName: string): string => {
-        return fieldName
-            .replace(/([A-Z])/g, ' $1')
-            .replace(/^./, (str: string) => str.toUpperCase());
-    };
-
-    const renderAllFields = () => {
-        const allFields = [...(requiredFields || []), ...(Object.values(multiTables).flat() || [])];
-
-        return (
-            <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
-                {allFields.map((field: any, index: number) => {
-                    const fieldName = typeof field === 'string' ? field : field.name;
-
-                    const isNumber = fieldName.includes('height') || fieldName.includes('length') ||
-                        fieldName.includes('wattage') || fieldName.includes('capacity') ||
-                        fieldName.includes('speed') || fieldName.includes('cores') ||
-                        fieldName.includes('threads') || fieldName.includes('vram') ||
-                        fieldName.includes('slots') || fieldName.includes('numSlots');
-
-                    return (
-                        <TextField
-                            key={`${fieldName}-${index}`}
-                            fullWidth
-                            label={formatFieldLabel(fieldName)}
-                            value={specificData[fieldName] || ''}
-                            onChange={(e) => handleFieldChange(fieldName, isNumber ? Number(e.target.value) : e.target.value)}
-                            type={isNumber ? 'number' : 'text'}
-                            required
-                            sx={{ mb: 2 }}
-                        />
-                    );
-                })}
-            </Box>
-        );
-    };
-
-    return (
-        <Dialog open={open} onClose={handleClose} maxWidth="md" fullWidth scroll="paper">
-            <DialogTitle sx={{ bgcolor: '#ff8201', color: 'white', display: 'flex', justifyContent: 'space-between', alignItems: 'column' }}>
-                <Typography variant="h6" fontWeight="bold">Add New Component</Typography>
-                <IconButton onClick={handleClose} sx={{ color: 'white' }}>
-                    <CloseIcon />
-                </IconButton>
-            </DialogTitle>
-
-            <DialogContent sx={{ p: 3 }}>
-                {error && <Alert severity="error" sx={{ mb: 2 }}>{error}</Alert>}
-
-                <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
-                    <Box>
-                        <Typography variant="subtitle1" fontWeight="bold" gutterBottom sx={{ mb: 2 }}>
-                            Basic Information
-                        </Typography>
-
-                        <TextField
-                            fullWidth
-                            select
-                            label="Component Type"
-                            value={type}
-                            onChange={(e) => setType(e.target.value)}
-                            required
-                            sx={{ mb: 2 }}
-                        >
-                            {COMPONENT_TYPES.map((option) => (
-                                <MenuItem key={option.value} value={option.value}>
-                                    {option.label}
-                                </MenuItem>
-                            ))}
-                        </TextField>
-
-                        <Grid container spacing={2} sx={{ mb: 2 }}>
-                            <Grid item xs={12} md={6}>
-                                <TextField
-                                    fullWidth
-                                    label="Brand"
-                                    value={brand}
-                                    onChange={(e) => setBrand(e.target.value)}
-                                    required
-                                />
-                            </Grid>
-                            <Grid item xs={12} md={6}>
-                                <TextField
-                                    fullWidth
-                                    label="Name"
-                                    value={name}
-                                    onChange={(e) => setName(e.target.value)}
-                                    required
-                                />
-                            </Grid>
-                        </Grid>
-
-                        <Grid container spacing={2}>
-                            <Grid item xs={12} md={6}>
-                                <TextField
-                                    fullWidth
-                                    label="Price (EUR)"
-                                    type="number"
-                                    value={price}
-                                    onChange={(e) => setPrice(e.target.value)}
-                                    required
-                                    inputProps={{ step: '0.01', min: '0' }}
-                                />
-                            </Grid>
-                            <Grid item xs={12} md={6}>
-                                <TextField
-                                    fullWidth
-                                    label="Image URL"
-                                    value={imgUrl}
-                                    onChange={(e) => setImgUrl(e.target.value)}
-                                    required
-                                />
-                            </Grid>
-                        </Grid>
-                    </Box>
-
-                    {imgUrl && (
-                        <Box sx={{ display: 'flex', justifyContent: 'center', mt: 1 }}>
-                            <Avatar
-                                src={imgUrl}
-                                variant="rounded"
-                                sx={{ width: 120, height: 120, bgcolor: '#f5f5f5' }}
-                            />
-                        </Box>
-                    )}
-
-                    {type && (requiredFields.length > 0 || Object.keys(multiTables).length > 0) && (
-                        <Box>
-                            <Typography variant="subtitle1" fontWeight="bold" gutterBottom sx={{ mb: 2 }}>
-                                {COMPONENT_TYPES.find(ct => ct.value === type)?.label} Specifications
-                            </Typography>
-                            {renderAllFields()}
-                        </Box>
-                    )}
-
-                    {Object.keys(multiTables).map((tableName) => (
-                        <Box key={tableName}>
-                            <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 }}>
-                                <Typography variant="subtitle1" fontWeight="bold">
-                                    {tableName.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())}
-                                </Typography>
-                                <Button
-                                    size="small"
-                                    startIcon={<AddIcon />}
-                                    onClick={() => handleAddMultiTableRow(tableName)}
-                                    variant="outlined"
-                                >
-                                    Add Row
-                                </Button>
-                            </Box>
-
-                            {(specificData[tableName] || []).map((row: any, index: number) => (
-                                <Box key={index} sx={{ p: 3, mb: 2, border: '1px solid #e0e0e0', borderRadius: 2, bgcolor: '#fafafa' }}>
-                                    <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 }}>
-                                        <Typography variant="subtitle2" fontWeight="medium">
-                                            Row {index + 1}
-                                        </Typography>
-                                        <IconButton
-                                            size="small"
-                                            color="error"
-                                            onClick={() => handleRemoveMultiTableRow(tableName, index)}
-                                        >
-                                            <DeleteIcon />
-                                        </IconButton>
-                                    </Box>
-
-                                    <Grid container spacing={2}>
-                                        {multiTables[tableName].map((fieldName: string) => (
-                                            <Grid item xs={12} sm={6} md={4} key={fieldName}>
-                                                <TextField
-                                                    fullWidth
-                                                    size="small"
-                                                    label={fieldName.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase())}
-                                                    value={row[fieldName] || ''}
-                                                    onChange={(e) => handleMultiTableFieldChange(tableName, index, fieldName, e.target.value)}
-                                                />
-                                            </Grid>
-                                        ))}
-                                    </Grid>
-                                </Box>
-                            ))}
-                        </Box>
-                    ))}
-                </Box>
-            </DialogContent>
-
-            <DialogActions sx={{ p: 3 }}>
-                <Button onClick={handleClose} disabled={loading}>
-                    Cancel
-                </Button>
-                <Button
-                    variant="contained"
-                    color="primary"
-                    onClick={handleSubmit}
-                    disabled={loading || !type}
-                >
-                    {loading ? 'Creating...' : 'Create Component'}
-                </Button>
-            </DialogActions>
-        </Dialog>
-    );
-}
Index: mponents/BuildCard.tsx
===================================================================
--- components/BuildCard.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,115 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {Card, CardContent, CardMedia, Typography, Box, Chip, CircularProgress} from '@mui/material';
-import StarIcon from '@mui/icons-material/Star';
-import {onGetBuildDetails} from "../pages/+Layout.telefunc";
-
-export default function BuildCard({build, onClick}: { build: any, onClick?: () => void }) {
-    const [caseImage, setCaseImage] = useState<string>("https://placehold.co/600x400?text=PC+Build");
-    const [imageLoading, setImageLoading] = useState(true);
-    const [details, setDetails] = useState<any>(null);
-
-    const formattedPrice = new Intl.NumberFormat('en-US', {
-        style: 'currency',
-        currency: 'EUR'
-    }).format(build.total_price || 0);
-
-    useEffect(() => {
-        setImageLoading(true);
-        onGetBuildDetails({buildId: build.id})
-            .then(fullDetails => {
-                setDetails(fullDetails);
-
-                const caseComponent = fullDetails.components?.find((c: any) => c.type === 'case');
-                setCaseImage(
-                    caseComponent?.imgUrl ||
-                    "https://placehold.co/600x400?text=PC+Build"
-                );
-            })
-            .catch((error) => {
-                console.error("Failed to load build details:", error);
-                setDetails(null);
-            })
-            .finally(() => {
-                setImageLoading(false);
-            });
-    }, [build.id]);
-
-    if (imageLoading) {
-        return (
-            <Card sx={{width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center'}}>
-                <CircularProgress />
-            </Card>
-        );
-    }
-
-    return (
-        <Card
-            onClick={onClick}
-            sx={{
-                width: '100%',
-                height: '100%',
-                display: 'flex',
-                flexDirection: 'column',
-                cursor: onClick ? 'pointer' : 'default',
-                transition: 'transform 0.2s, box-shadow 0.2s',
-                '&:hover': onClick ? {
-                    transform: 'translateY(-4px)',
-                    boxShadow: 6
-                } : {},
-                position: 'relative'
-            }}
-        >
-            <Box sx={{position: 'relative', paddingTop: '75%'}}>
-                <CardMedia
-                    component="img"
-                    image={caseImage}
-                    alt={build.name}
-                    sx={{
-                        position: 'absolute',
-                        top: 0,
-                        left: 0,
-                        width: '100%',
-                        height: '100%',
-                        objectFit: 'contain',
-                        p: 2,
-                        bgcolor: '#f5f5f5'
-                    }}
-                />
-            </Box>
-
-            <CardContent sx={{flexGrow: 1, display: 'flex', flexDirection: 'column', justifyContent: 'space-between'}}>
-                <Box sx={{mb: 1}}>
-                    <Typography variant="h6" component="div" fontWeight="bold">
-                        {build.name}
-                    </Typography>
-                </Box>
-
-                <Box sx={{mb: 2}}>
-                    <Typography
-                        variant="body2"
-                        color="text.secondary"
-                        sx={{fontStyle: 'italic', fontSize: '0.875rem'}}
-                    >
-                        {details?.description || "No description provided."}
-                    </Typography>
-                </Box>
-
-                <Box sx={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', mt: 'auto'}}>
-                    <Chip
-                        label={formattedPrice}
-                        color="primary"
-                        variant="outlined"
-                        size="small"
-                        sx={{fontWeight: 'bold'}}
-                    />
-                    <Box sx={{display: 'flex', alignItems: 'center'}}>
-                        <StarIcon sx={{color: '#faaf00', fontSize: 20, ml: 1}}/>
-                        <Typography variant="body2" fontWeight="bold">
-                            {Number(build.avgRating || 0).toFixed(1)}
-                        </Typography>
-                    </Box>
-                </Box>
-            </CardContent>
-        </Card>
-    );
-}
Index: mponents/BuildDetailsDialog.tsx
===================================================================
--- components/BuildDetailsDialog.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,405 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Dialog, DialogTitle, DialogContent, DialogActions, Button, Box, Typography,
-    IconButton, Tab, Tabs, Table, TableBody, TableCell, TableRow, Rating, TextField, Avatar, Chip, Alert, Snackbar
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh';
-import FavoriteIcon from '@mui/icons-material/Favorite';
-import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
-import PersonIcon from "@mui/icons-material/Person";
-import {onGetBuildDetails, onSetReview, onToggleFavorite, onCloneBuild, onSetRating} from '../pages/+Layout.telefunc';
-import {onGetBuildState} from '../pages/forge/forge.telefunc';
-
-const formatPrice = (price: any) => new Intl.NumberFormat('en-US', {
-    style: 'currency',
-    currency: 'USD'
-}).format(Number(price) || 0);
-
-export default function BuildDetailsDialog({open, buildId, onClose, currentUser, isDashboardView = false}: {
-    open: boolean;
-    buildId: number | null;
-    onClose: () => void;
-    currentUser: any;
-    isDashboardView?: boolean;
-}) {
-    const [details, setDetails] = useState<any>(null);
-    const [loading, setLoading] = useState(false);
-    const [tabIndex, setTabIndex] = useState(0);
-    const [cloneDialogOpen, setCloneDialogOpen] = useState(false);
-    const [cloningBuildId, setCloningBuildId] = useState<number | null>(null);
-    const [isOwner, setIsOwner] = useState(false);
-
-    const [reviewText, setReviewText] = useState("");
-    const [ratingVal, setRatingVal] = useState(5);
-
-    const [snackbar, setSnackbar] = useState<{
-        open: boolean;
-        message: string;
-        severity: 'error' | 'warning' | 'info' | 'success';
-    }>({
-        open: false,
-        message: '',
-        severity: 'warning'
-    });
-
-    useEffect(() => {
-        if (open && buildId !== null) {
-            setLoading(true);
-            setReviewText("");
-            setRatingVal(5);
-
-            onGetBuildDetails({buildId})
-                .then(data => {
-                    setDetails(data);
-                    if (data.userRating) setRatingVal(data.userRating);
-                    if (data.userReview) setReviewText(data.userReview);
-                })
-                .finally(() => setLoading(false));
-        }
-    }, [open, buildId]);
-
-    useEffect(() => {
-        if (open && buildId !== null) {
-            onGetBuildState({buildId})
-                .then(state => {
-                    setIsOwner(!!state);
-                })
-                .catch(() => setIsOwner(false));
-        } else {
-            setIsOwner(false);
-        }
-    }, [open, buildId]);
-
-    useEffect(() => {
-        if (open) {
-            setTabIndex(0);
-        }
-    }, [open, buildId]);
-
-    const handleFavorite = async () => {
-        if (!currentUser || buildId === null) return alert("Please login to favorite builds.");
-        const res = await onToggleFavorite({buildId});
-        setDetails((prev: any) => ({...prev, isFavorite: res}));
-    };
-
-    const handleSubmitReview = async () => {
-        if (!currentUser || buildId === null) return alert("Please login to review.");
-
-        await onSetReview({
-            buildId,
-            content: reviewText,
-        });
-
-        await onSetRating({
-            buildId,
-            value: ratingVal
-        });
-
-        const refreshed = await onGetBuildDetails({buildId});
-        setDetails(refreshed);
-    };
-
-    const handleCloneConfirm = async () => {
-        if (!cloningBuildId) return;
-
-        if(!currentUser){
-            window.location.href="/auth/login";
-            return;
-        }
-
-        try {
-            const newBuildId = await onCloneBuild({buildId: cloningBuildId});
-            window.location.href = `/forge?buildId=${newBuildId}`;
-            setCloneDialogOpen(false);
-            setCloningBuildId(null);
-        } catch (e) {
-            // alert("Failed to clone build. Please try again.");
-            setCloneDialogOpen(false);
-            setSnackbar({
-                open: true,
-                message: 'Failed to clone build. Please try again!',
-                severity: 'error'
-            })
-        }
-    };
-
-    const isCreator = currentUser && details && details.userId === currentUser;
-
-    if (!open) return null;
-
-    return (
-        <>
-            <Dialog open={open} onClose={onClose} maxWidth="md" fullWidth scroll="body">
-                {loading || !details ? (
-                    <Box sx={{p: 5, textAlign: 'center'}}>Loading Forge Schematics...</Box>
-                ) : (
-                    <>
-                        <DialogTitle sx={{
-                            display: 'flex',
-                            justifyContent: 'space-between',
-                            alignItems: 'center',
-                            bgcolor: '#ff8201'
-                        }}>
-                            <Box>
-                                <Typography variant="h5" fontWeight="bold">{details.name}</Typography>
-                                <Box sx={{display: 'flex', alignItems: 'center', gap: 1}}>
-                                    <PersonIcon sx={{fontSize: 16}}/>
-                                    <Typography variant="subtitle2" color="text.secondary" fontWeight="bold">
-                                        by {details.creator}
-                                    </Typography>
-                                    <Chip label={formatPrice(details.totalPrice)} size="small" color="primary"
-                                          variant="outlined"/>
-                                </Box>
-                            </Box>
-                            <IconButton onClick={onClose}><CloseIcon/></IconButton>
-                        </DialogTitle>
-
-                        <DialogContent sx={{p: 0}}>
-                            <Box sx={{
-                                borderBottom: 1,
-                                borderColor: 'divider',
-                                px: 2,
-                                bgcolor: 'primary',
-                                position: 'sticky',
-                                top: 0,
-                                zIndex: 1
-                            }}>
-                                <Tabs value={tabIndex} onChange={(_, v) => setTabIndex(v)}>
-                                    <Tab label="Specs"/>
-                                    <Tab label={`Reviews (${details.ratingStatistics.ratingCount})`}/>
-                                </Tabs>
-                            </Box>
-
-                            <Box sx={{p: 3}}>
-                                {tabIndex === 0 && (
-                                    <Box
-                                        sx={{
-                                            display: 'grid',
-                                            gridTemplateColumns: {
-                                                xs: '1fr',
-                                                md: '2fr 1fr'
-                                            },
-                                            gap: 2,
-                                            width: '100%'
-                                        }}
-                                    >
-                                        <Box>
-                                            <Table size="small">
-                                                <TableBody>
-                                                    {details.components.map((comp: any) => (
-                                                        <TableRow key={comp.id}>
-                                                            <TableCell sx={{width: 50}}>
-                                                                <Avatar
-                                                                    src={comp.imgUrl || undefined}
-                                                                    variant="rounded"
-                                                                    sx={{width: 50, height: 50, bgcolor: '#ff8201'}}
-                                                                >
-                                                                    {comp.type?.substring(0, 3)?.toUpperCase()}
-                                                                </Avatar>
-                                                            </TableCell>
-                                                            <TableCell>
-                                                                <Typography variant="body2" color="text.secondary" sx={{
-                                                                    fontSize: '0.75rem',
-                                                                    textTransform: 'uppercase'
-                                                                }}>
-                                                                    {comp.type}
-                                                                </Typography>
-                                                                <Typography variant="body1" fontWeight="500">
-                                                                    {comp.brand} {comp.name}
-                                                                </Typography>
-                                                            </TableCell>
-                                                            <TableCell align="right"
-                                                                       sx={{fontWeight: 'bold', color: '#ff8201'}}>
-                                                                {formatPrice(comp.price)}
-                                                            </TableCell>
-                                                        </TableRow>
-                                                    ))}
-                                                    <TableRow sx={{bgcolor: '#424343'}}>
-                                                        <TableCell colSpan={2} sx={{
-                                                            fontWeight: 'bold',
-                                                            color: '#ff8201'
-                                                        }}>TOTAL</TableCell>
-                                                        <TableCell align="right" sx={{
-                                                            fontWeight: 'bold',
-                                                            fontSize: '1.1rem',
-                                                            color: 'primary.main'
-                                                        }}>
-                                                            {formatPrice(details.totalPrice)}
-                                                        </TableCell>
-                                                    </TableRow>
-                                                </TableBody>
-                                            </Table>
-                                        </Box>
-
-                                        <Box>
-                                            <Box sx={{bgcolor: '#424343', p: 2, borderRadius: 2, mb: 2}}>
-                                                <Typography color="primary.main" gutterBottom fontWeight="bold">
-                                                    Builder's Notes
-                                                </Typography>
-                                                <Typography color="primary.main" variant="body2"
-                                                            sx={{fontStyle: 'italic'}}>
-                                                    "{details.description || "No notes provided."}"
-                                                </Typography>
-                                            </Box>
-
-                                            {currentUser && (
-                                                <Box sx={{display: 'flex', flexDirection: 'column', gap: 1}}>
-                                                    {isDashboardView && isOwner ? (
-                                                        <Button
-                                                            variant="contained"
-                                                            color="primary"
-                                                            size="large"
-                                                            startIcon={<AutoFixHighIcon/>}
-                                                            onClick={() => {
-                                                                window.location.href = `/forge?buildId=${details.id}`;
-                                                                onClose();
-                                                            }}
-                                                        >
-                                                            Edit Build
-                                                        </Button>
-                                                    ) : (
-                                                        <Button
-                                                            variant="contained"
-                                                            color="primary"
-                                                            size="large"
-                                                            startIcon={<AutoFixHighIcon/>}
-                                                            onClick={() => {
-                                                                setCloningBuildId(details.id);
-                                                                setCloneDialogOpen(true);
-                                                            }}
-                                                        >
-                                                            Clone & Edit
-                                                        </Button>
-                                                    )}
-                                                    <Button
-                                                        variant={details.isFavorite ? "contained" : "outlined"}
-                                                        color={details.isFavorite ? "error" : "primary"}
-                                                        startIcon={details.isFavorite ? <FavoriteIcon/> : <FavoriteBorderIcon/>}
-                                                        onClick={handleFavorite}
-                                                    >
-                                                        {details.isFavorite ? "Favorited" : "Add to Favorites"}
-                                                    </Button>
-                                                </Box>
-                                            )}
-
-                                        </Box>
-                                    </Box>
-                                )}
-
-                                {tabIndex === 1 && (
-                                    <Box>
-                                        <Box sx={{
-                                            display: 'flex',
-                                            alignItems: 'center',
-                                            gap: 2,
-                                            mb: 4,
-                                            p: 2,
-                                            bgcolor: '#5e5e5e',
-                                            borderRadius: 2
-                                        }}>
-                                            <Typography variant="h3"
-                                                        fontWeight="bold">{details.ratingStatistics.averageRating.toFixed(1)}</Typography>
-                                            <Box>
-                                                <Rating value={details.ratingStatistics.averageRating} readOnly
-                                                        precision={0.5}/>
-                                                <Typography variant="body2"
-                                                            color="text.secondary">{details.ratingStatistics.ratingCount} ratings</Typography>
-                                            </Box>
-                                        </Box>
-
-                                        {currentUser && !isCreator && (
-                                            <Box sx={{mb: 4, p: 2, border: '1px solid #ddd', borderRadius: 2}}>
-                                                <Typography variant="subtitle2" gutterBottom>Your Review</Typography>
-                                                <Box sx={{display: 'flex', alignItems: 'center', mb: 1}}>
-                                                    <Rating value={ratingVal}
-                                                            onChange={(_, v) => setRatingVal(v || 5)}/>
-                                                </Box>
-                                                <TextField
-                                                    fullWidth
-                                                    multiline
-                                                    rows={2}
-                                                    placeholder="Share your thoughts on this build..."
-                                                    value={reviewText}
-                                                    onChange={(e) => setReviewText(e.target.value)}
-                                                    sx={{mb: 1}}
-                                                />
-                                                <Button size="small" variant="contained" onClick={handleSubmitReview}>
-                                                    Submit Review
-                                                </Button>
-                                            </Box>
-                                        )}
-
-                                        {currentUser && isCreator && (
-                                            <Alert severity="error" sx={{mb: 4}}>
-                                                You cannot rate your own builds.
-                                            </Alert>
-                                        )}
-
-                                        <Box sx={{display: 'flex', flexDirection: 'column', gap: 2}}>
-                                            {details.reviews.map((rev: any, i: number) => (
-                                                <Box key={i} sx={{pb: 2, borderBottom: '1px solid #eee'}}>
-                                                    <Box sx={{
-                                                        display: 'flex',
-                                                        justifyContent: 'space-between',
-                                                        mb: 0.5
-                                                    }}>
-                                                        <Typography fontWeight="bold"
-                                                                    variant="body2">{rev.username}</Typography>
-                                                        <Typography variant="caption"
-                                                                    color="text.secondary">{rev.createdAt}</Typography>
-                                                    </Box>
-                                                    <Typography variant="body2">{rev.content}</Typography>
-                                                </Box>
-                                            ))}
-                                            {details.reviews.length === 0 && (
-                                                <Typography color="text.secondary" align="center">
-                                                    No reviews yet. Be the first!
-                                                </Typography>
-                                            )}
-                                        </Box>
-                                    </Box>
-                                )}
-                            </Box>
-                        </DialogContent>
-                    </>
-                )}
-            </Dialog>
-
-            <Dialog open={cloneDialogOpen} onClose={() => setCloneDialogOpen(false)}>
-                <DialogTitle>Clone Build</DialogTitle>
-                <DialogContent>
-                    <Typography>
-                        This will create a copy of "{details?.name}" in your Forge so you can edit it.
-                        All components will be copied over.
-                    </Typography>
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setCloneDialogOpen(false)}>Cancel</Button>
-                    <Button
-                        variant="contained"
-                        onClick={handleCloneConfirm}
-                        disabled={!cloningBuildId}
-                    >
-                        Clone Build
-                    </Button>
-                </DialogActions>
-            </Dialog>
-            <Snackbar
-                open={snackbar.open}
-                autoHideDuration={5000}
-                onClose={() => setSnackbar(prev => ({...prev, open: false}))}
-                anchorOrigin={{vertical: 'bottom', horizontal: 'center'}}
-            >
-                <Alert
-                    onClose={() => setSnackbar(prev => ({...prev, open: false}))}
-                    severity={snackbar.severity}
-                    variant="filled"
-                    sx={{width: '100%'}}
-                >
-                    {snackbar.message}
-                </Alert>
-            </Snackbar>
-        </>
-    );
-}
Index: mponents/ComponentDetailsDialog.tsx
===================================================================
--- components/ComponentDetailsDialog.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,276 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Dialog, DialogTitle, DialogContent, DialogActions, Button,
-    Typography, Box, Chip, CircularProgress, IconButton,
-    Table, TableBody, TableCell, TableContainer, TableRow, Paper
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import {onGetComponentDetails} from '../pages/+Layout.telefunc';
-
-export default function ComponentDetailsDialog({open, component, onClose}: any) {
-    const [fullData, setFullData] = useState<any>(null);
-    const [loading, setLoading] = useState(false);
-
-    useEffect(() => {
-        if (open && component) {
-            setLoading(true);
-            onGetComponentDetails({componentId: component.id})
-                .then(data => setFullData(data))
-                .catch(console.error)
-                .finally(() => setLoading(false));
-        } else {
-            setFullData(null);
-        }
-    }, [open, component]);
-
-    if (!open || !component) return null;
-
-    const displayData = fullData || component;
-    const specs = fullData?.details || {};
-
-    const formatMoney = (amount: number) => `$${Number(amount).toFixed(2)}`;
-
-    const renderValue = (key: string, val: any) => {
-        if (Array.isArray(val)) {
-            if (val.length === 0) return 'None';
-
-            if (typeof val[0] === 'string') {
-                return val.join(', ');
-            }
-
-            if (typeof val[0] === 'object') {
-                const parts = val
-                    .map((v: any) =>
-                        v.socket ||
-                        v.formFactor ||
-                        v.name ||
-                        v.type ||
-                        Object.values(v)[0]
-                    )
-                    .filter(Boolean);
-                return parts.length > 0 ? parts.join(', ') : 'None';
-            }
-
-            return val.join(', ');
-        }
-
-        const strVal = String(val);
-        const lowerKey = key.toLowerCase();
-
-        if (lowerKey.includes('capacity') || lowerKey.includes('vram') || lowerKey === 'memory') {
-            return `${strVal} GB`;
-        }
-
-        if (lowerKey.includes('tdp') || lowerKey.includes('wattage')) {
-            return `${strVal} W`;
-        }
-
-        if (lowerKey.includes('length') || lowerKey.includes('height') || lowerKey.includes('width')) {
-            return `${strVal} mm`;
-        }
-
-        if (lowerKey.includes('clock')) {
-            return `${strVal} GHz`;
-        }
-
-        if (lowerKey.includes('speed')) {
-            return `${strVal} MHz`;
-        }
-
-        return strVal;
-    };
-
-    const formatKey = (key: string) => {
-        return key
-            .replace(/([A-Z])/g, ' $1')
-            .replace(/_/g, ' ')
-            .replace(/\b\w/g, c => c.toUpperCase());
-    };
-
-    return (
-        <Dialog
-            open={open}
-            onClose={onClose}
-            maxWidth="md"
-            fullWidth
-            scroll="body"
-            sx={{zIndex: 1400}}
-        >
-            <DialogTitle sx={{
-                display: 'flex',
-                justifyContent: 'space-between',
-                alignItems: 'center',
-                bgcolor: '#333',
-                color: 'white'
-            }}>
-                <Box>
-                    <Typography variant="caption" sx={{textTransform: 'uppercase', opacity: 0.7}}>
-                        {displayData.brand}
-                    </Typography>
-                    <Typography variant="h6" fontWeight="bold">
-                        {displayData.name}
-                    </Typography>
-                </Box>
-                <IconButton onClick={onClose} sx={{color: 'white'}}>
-                    <CloseIcon/>
-                </IconButton>
-            </DialogTitle>
-
-            <DialogContent
-                sx={{
-                    p: 1,
-                    overflow: 'visible'
-                }}
-            >
-                {loading ? (
-                    <Box sx={{display: 'flex', justifyContent: 'center', p: 5}}>
-                        <CircularProgress/>
-                    </Box>
-                ) : (
-                    <Box
-                        sx={{
-                            display: 'grid',
-                            gridTemplateColumns: {
-                                xs: '1fr',
-                                md: '1fr 1fr'
-                            },
-                            gap: 4,
-                            width: '100%'
-                        }}
-                    >
-                        <Box sx={{display: 'flex', flexDirection: 'column', alignItems: 'center'}}>
-                            <Box
-                                component="img"
-                                src={displayData.imgUrl}
-                                alt={displayData.name}
-                                sx={{
-                                    width: '100%',
-                                    maxHeight: 300,
-                                    objectFit: 'contain',
-                                    mb: 1,
-                                    mt: 7,
-                                    p: 1
-                                }}
-                            />
-                            <Chip
-                                label={displayData.type?.toUpperCase()}
-                                color="primary"
-                                sx={{fontWeight: 'bold'}}
-                            />
-                        </Box>
-
-                        <Box sx={{
-                            display: 'flex',
-                            flexDirection: 'column',
-                            alignItems: 'center',
-                            width: '70%'
-                        }}>
-                            <Typography
-                                variant="subtitle1"
-                                fontWeight="bold"
-                                gutterBottom
-                                sx={{
-                                    borderBottom: '2px solid #ff8201',
-                                    mb: 1,
-                                    mt: 1,
-                                    textAlign: 'center',
-                                    width: '100%'
-                                }}
-                            >
-                                Technical Specifications
-                            </Typography>
-
-                            <TableContainer
-                                component={Paper}
-                                variant="outlined"
-                                sx={{
-                                    maxWidth: '100%',
-                                    width: '100%'
-                                }}
-                            >
-                                <Table size="medium">
-                                    <TableBody>
-                                        <TableRow>
-                                            <TableCell
-                                                component="th"
-                                                scope="row"
-                                                sx={{
-                                                    fontWeight: 'bold',
-                                                    width: '50%',
-                                                    bgcolor: '#1e1e1e',
-                                                    textAlign: 'center',
-                                                    px: 2
-                                                }}
-                                            >
-                                                Brand
-                                            </TableCell>
-                                            <TableCell sx={{
-                                                textAlign: 'center',
-                                                px: 2,
-                                                width: '50%'
-                                            }}>
-                                                {displayData.brand}
-                                            </TableCell>
-                                        </TableRow>
-
-                                        {Object.entries(specs).map(([key, val]) => {
-                                            if (key === 'componentId' || key === 'id') return null;
-
-                                            return (
-                                                <TableRow key={key}>
-                                                    <TableCell
-                                                        component="th"
-                                                        scope="row"
-                                                        sx={{
-                                                            fontWeight: 'bold',
-                                                            width: '50%',
-                                                            bgcolor: '#1e1e1e',
-                                                            textAlign: 'center',
-                                                            px: 2
-                                                        }}
-                                                    >
-                                                        {formatKey(key)}
-                                                    </TableCell>
-                                                    <TableCell sx={{
-                                                        textAlign: 'center',
-                                                        px: 2,
-                                                        width: '50%'
-                                                    }}>
-                                                        {renderValue(key, val)}
-                                                    </TableCell>
-                                                </TableRow>
-                                            );
-                                        })}
-                                    </TableBody>
-                                </Table>
-                            </TableContainer>
-
-                            <Box sx={{
-                                display: 'flex',
-                                justifyContent: 'center',
-                                alignItems: 'center',
-                                mt: 1,
-                                width: '100%'
-                            }}>
-                                <Typography variant="h4" color="primary.main" fontWeight="bold">
-                                    {formatMoney(displayData.price)}
-                                </Typography>
-                            </Box>
-                        </Box>
-                    </Box>
-                )}
-            </DialogContent>
-
-            <DialogActions sx={{p: 2}}>
-                <Button onClick={onClose} variant="contained"
-                        sx={{
-                            backgroundColor: '#ff8201',
-                            color: 'white',
-                            borderColor: '#ff8201',
-                            '&:hover': {backgroundColor: '#ba5d02', borderColor: '#ba5d02'}
-                        }}
-                >Close</Button>
-            </DialogActions>
-        </Dialog>
-    );
-}
Index: mponents/ComponentDialog.tsx
===================================================================
--- components/ComponentDialog.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,600 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Dialog, DialogContent, IconButton, Box, Typography,
-    Slider, FormControl, InputLabel, Select, MenuItem, Checkbox, ListItemText,
-    Card, CardContent, CardMedia, Button, CircularProgress, AppBar, Toolbar, InputAdornment, TextField,
-    TextField as MuiTextField, DialogTitle, DialogActions, Snackbar, Alert, Drawer, Badge
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import AddCircleIcon from '@mui/icons-material/AddCircle';
-import FilterListIcon from '@mui/icons-material/FilterList';
-import SearchIcon from "@mui/icons-material/Search";
-
-import {onGetAllComponents, onGetAuthState, onSuggestComponent} from '../pages/+Layout.telefunc'
-import {onGetCompatibleComponents} from '../pages/forge/forge.telefunc';
-import ComponentDetailsDialog from "./ComponentDetailsDialog";
-
-const formatMoney = (amount: number) => `$${Number(amount).toFixed(2)}`;
-
-export default function ComponentDialog({open, category, onClose, mode, onSelect, currentBuildId}: any) {
-    const [components, setComponents] = useState<any[]>([]);
-    const [loading, setLoading] = useState(false);
-    const [selectedComponent, setSelectedComponent] = useState<any>(null);
-    const [priceRange, setPriceRange] = useState<number[]>([0, 2000]);
-    const [selectedBrands, setSelectedBrands] = useState<string[]>([]);
-    const [availableBrands, setAvailableBrands] = useState<string[]>([]);
-    const [sortOrder, setSortOrder] = useState<string>('default');
-
-    const [tempSearchQuery, setTempSearchQuery] = useState("");
-    const [searchQuery, setSearchQuery] = useState("");
-
-    const [suggestOpen, setSuggestOpen] = useState(false);
-    const [suggestForm, setSuggestForm] = useState({
-        link: '',
-        description: '',
-        componentType: category || ''
-    });
-    const [suggestLoading, setSuggestLoading] = useState(false);
-    const [snackbarOpen, setSnackbarOpen] = useState(false);
-    const [snackbarMessage, setSnackbarMessage] = useState("");
-    const [userId, setUserId] = useState<number | null>(null);
-    const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false);
-
-    useEffect(() => {
-        if (open && category) {
-            setSuggestForm({
-                link: '',
-                description: '',
-                componentType: category
-            });
-        }
-    }, [open, category]);
-
-    useEffect(() => {
-        const timeoutId = setTimeout(() => {
-            setSearchQuery(tempSearchQuery);
-        }, 300);
-        return () => clearTimeout(timeoutId);
-    }, [tempSearchQuery]);
-
-    useEffect(() => {
-        if (open && category) {
-            setSelectedBrands([]);
-            setSortOrder('price_desc');
-            setTempSearchQuery('');
-            setSearchQuery('');
-            setPriceRange([0, 2000]);
-        }
-    }, [open, category]);
-
-
-    useEffect(() => {
-        if (open) {
-            onGetAuthState().then(userData => {
-                setUserId(userData.userId);
-            });
-        }
-    }, [open]);
-
-    useEffect(() => {
-        if (open && category) {
-            setLoading(true);
-            setSortOrder('price_desc');
-
-            const shouldUseCompatibility = mode === 'forge' && currentBuildId;
-            const fetcher = shouldUseCompatibility
-                ? onGetCompatibleComponents({
-                    buildId: currentBuildId,
-                    componentType: category,
-                    limit: 100,
-                    sort: 'price_desc'
-                })
-                : onGetAllComponents({
-                    componentType: category,
-                    limit: 100,
-                    sort: 'price_desc'
-                });
-
-            fetcher
-                .then((data) => {
-                    const comps = data || [];
-                    setComponents(comps);
-
-                    const brands = Array.from(new Set(comps.map((c: any) => c.brand)));
-                    setAvailableBrands(brands as string[]);
-                    const maxPrice = comps.length > 0 ? Math.max(...comps.map((c: any) => Number(c.price))) : 2000;
-                    setPriceRange([0, Math.ceil(maxPrice)]);
-                })
-                .catch((err) => {
-                    console.error('[Dialog] fetch error:', err);
-                    setComponents([]);
-                })
-                .finally(() => setLoading(false));
-        }
-    }, [open, category, mode, currentBuildId]);
-
-    const handleSuggestChange = (e: React.ChangeEvent<HTMLInputElement>) => {
-        setSuggestForm({
-            ...suggestForm,
-            [e.target.name]: e.target.value
-        });
-    }
-
-    const submitSuggestion = async () => {
-        if (!userId) {
-            setSnackbarMessage("Please login to submit suggestions!");
-            setSnackbarOpen(true);
-            return;
-        }
-
-        if (!suggestForm.link || !suggestForm.description) {
-            setSnackbarMessage("Please fill in all fields!");
-            setSnackbarOpen(true);
-            return;
-        }
-
-        setSuggestLoading(true);
-        try {
-            const suggestionId = await onSuggestComponent({
-                link: suggestForm.link,
-                description: suggestForm.description,
-                componentType: suggestForm.componentType
-            });
-
-            setSnackbarMessage("Suggestion submitted! Admin will review it.");
-            setSnackbarOpen(true);
-            setSuggestOpen(false);
-            setSuggestForm({link: '', description: '', componentType: category || ''});
-        } catch (error) {
-            console.error('Suggestion error:', error);
-            setSnackbarMessage("Failed to submit suggestion. Try again.");
-            setSnackbarOpen(true);
-        } finally {
-            setSuggestLoading(false);
-        }
-    };
-
-    let processedComponents = components.filter(comp => {
-        const matchesBrand = selectedBrands.length === 0 || selectedBrands.includes(comp.brand);
-        const matchesPrice = Number(comp.price) >= priceRange[0] && Number(comp.price) <= priceRange[1];
-        const matchesSearch = searchQuery === "" ||
-            comp.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
-            comp.brand.toLowerCase().includes(searchQuery.toLowerCase());
-
-        return matchesBrand && matchesPrice && matchesSearch;
-    });
-
-    if (sortOrder === 'price_asc') {
-        processedComponents.sort((a, b) => Number(a.price) - Number(b.price));
-    } else if (sortOrder === 'price_desc') {
-        processedComponents.sort((a, b) => Number(b.price) - Number(a.price));
-    }
-
-    const handleBrandChange = (event: any) => {
-        const value = event.target.value;
-        setSelectedBrands(typeof value === 'string' ? value.split(',') : value);
-    };
-
-    const activeFiltersCount = selectedBrands.length + (sortOrder !== 'default' ? 1 : 0);
-
-    const FilterContent = React.useMemo(() => (
-        <Box sx={{width: {xs: 280, md: 300}, p: 3, bgcolor: 'transparent'}}>
-            <TextField
-                fullWidth
-                size="small"
-                placeholder="Search components..."
-                value={tempSearchQuery}
-                onChange={(e) => setTempSearchQuery(e.target.value)}
-                sx={{mb: 2}}
-                InputProps={{
-                    startAdornment: <InputAdornment position="start"><SearchIcon/></InputAdornment>,
-                }}
-            />
-
-            <FormControl fullWidth size="small" sx={{mb: 2}}>
-                <InputLabel>Sort By</InputLabel>
-                <Select
-                    value={sortOrder}
-                    label="Sort By"
-                    onChange={(e) => setSortOrder(e.target.value)}
-                    MenuProps={{
-                        container: typeof window !== 'undefined' ? document.body : undefined,
-                        disablePortal: false,
-                        sx: {
-                            zIndex: 1500
-                        }
-                    }}
-                >
-                    <MenuItem value="price_asc">Price: Low to High</MenuItem>
-                    <MenuItem value="price_desc">Price: High to Low</MenuItem>
-                </Select>
-            </FormControl>
-
-            <FormControl fullWidth size="small" sx={{mb: 2}}>
-                <InputLabel>Brands</InputLabel>
-                <Select
-                    multiple
-                    value={selectedBrands}
-                    onChange={handleBrandChange}
-                    label="Brands"
-                    renderValue={(s) => s.join(', ')}
-                    MenuProps={{
-                        container: typeof window !== 'undefined' ? document.body : undefined,
-                        disablePortal: false,
-                        sx: {
-                            zIndex: 1500
-                        },
-                        PaperProps: {
-                            sx: {
-                                maxHeight: 300
-                            }
-                        }
-                    }}
-                >
-                    {availableBrands.map((brand) => (
-                        <MenuItem key={brand} value={brand}>
-                            <Checkbox checked={selectedBrands.indexOf(brand) > -1}/>
-                            <ListItemText primary={brand}/>
-                        </MenuItem>
-                    ))}
-                </Select>
-            </FormControl>
-
-            <Typography gutterBottom fontWeight="bold">Price Range</Typography>
-            <Slider value={priceRange} onChange={(_, v) => setPriceRange(v as number[])} min={0} max={2000}
-                    sx={{color: '#ff8201'}}/>
-            <Box sx={{display: 'flex', justifyContent: 'space-between', mt: 1}}>
-                <Typography variant="caption">${priceRange[0]}</Typography>
-                <Typography variant="caption">${priceRange[1]}+</Typography>
-            </Box>
-
-            {userId && (
-                <Button
-                    fullWidth
-                    variant="contained"
-                    startIcon={<AddCircleIcon/>}
-                    onClick={() => setSuggestOpen(true)}
-                    sx={{
-                        mt: 2,
-                        bgcolor: '#ff8201',
-                        fontWeight: 'bold',
-                        fontSize: '0.875rem',
-                        '&:hover': {bgcolor: '#e67300'}
-                    }}
-                >
-                    Suggest Component
-                </Button>
-            )}
-        </Box>
-    ), [tempSearchQuery, sortOrder, selectedBrands, availableBrands, priceRange, userId]);
-
-    if (!open) return null;
-
-    return (
-        <>
-            <Dialog
-                open={open}
-                onClose={onClose}
-                maxWidth="xl"
-                fullWidth
-                fullScreen
-                sx={{
-                    '& .MuiDialog-paper': {
-                        height: {xs: '100%', md: '90vh'},
-                        m: {xs: 0, md: 2}
-                    }
-                }}
-            >
-                <AppBar position="relative" sx={{bgcolor: '#ff8201'}}>
-                    <Toolbar>
-                        <IconButton
-                            edge="start"
-                            color="inherit"
-                            onClick={() => setMobileFiltersOpen(true)}
-                            sx={{
-                                display: {xs: 'flex', md: 'none'},
-                                mr: 2
-                            }}
-                        >
-                            <Badge badgeContent={activeFiltersCount} color="error">
-                                <FilterListIcon/>
-                            </Badge>
-                        </IconButton>
-
-                        <Typography
-                            sx={{ml: {xs: 0, md: 2}, flex: 1, fontSize: {xs: '1rem', sm: '1.25rem'}}}
-                            variant="h6"
-                            component="div"
-                        >
-                            <Box component="span" sx={{display: {xs: 'none', sm: 'inline'}}}>
-                                Browsing:
-                            </Box>
-                            <b> {
-                                category === 'gpu' ? 'GRAPHICS CARDS'
-                                    : category === 'memory_card' ? 'STORAGE EXPANSION CARDS'
-                                        : category === 'power_supply' ? 'POWER SUPPLIES'
-                                            : category === 'network_card' ? 'NETWORK CARDS'
-                                                : category === 'network_adapters' ? 'NETWORK ADAPTERS'
-                                                    : category === 'sound_card' ? 'SOUND CARDS'
-                                                        : category === 'optical_drive' ? 'OPTICAL DRIVES'
-                                                            : category?.toUpperCase()}</b>
-                            {mode === 'forge' && currentBuildId && (
-                                <Typography
-                                    variant="caption"
-                                    sx={{
-                                        ml: {xs: 1, sm: 2},
-                                        bgcolor: 'rgba(0,0,0,0.2)',
-                                        px: 1,
-                                        py: 0.5,
-                                        borderRadius: 1,
-                                        display: {xs: 'none', sm: 'inline-block'}
-                                    }}
-                                >
-                                    COMPATIBILITY MODE
-                                </Typography>
-                            )}
-                        </Typography>
-                        <IconButton edge="end" color="inherit" onClick={onClose}>
-                            <CloseIcon/>
-                        </IconButton>
-                    </Toolbar>
-                </AppBar>
-
-                <DialogContent sx={{p: 0, display: 'flex', height: '100%', overflow: 'hidden'}}>
-                    <Box sx={{
-                        display: {xs: 'none', md: 'block'},
-                        borderRight: '1px solid #ddd',
-                        overflowY: 'auto',
-                        bgcolor: '#1e1e1e'
-                    }}>
-                        {FilterContent}
-                    </Box>
-                    <Box sx={{flex: 1, p: {xs: 1.5, sm: 2, md: 3}, overflowY: 'auto', bgcolor: '#121212'}}>
-                        {loading ? (
-                            <Box sx={{display: 'flex', justifyContent: 'center', mt: 10}}>
-                                <CircularProgress sx={{color: '#ff8201'}}/>
-                            </Box>
-                        ) : (
-                            <Box sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    md: 'repeat(2, 1fr)',
-                                    lg: 'repeat(3, 1fr)',
-                                    xl: 'repeat(4, 1fr)'
-                                },
-                                gap: {xs: 1.5, sm: 2, md: 3},
-                                width: '100%'
-                            }}>
-                                {processedComponents.map((comp) => (
-                                    <Box key={comp.id} sx={{width: '100%'}}>
-                                        <Card
-                                            elevation={3}
-                                            sx={{
-                                                width: '100%',
-                                                height: '100%',
-                                                display: 'flex',
-                                                flexDirection: 'column',
-                                                transition: 'transform 0.2s, box-shadow 0.2s',
-                                                '&:hover': {
-                                                    transform: 'translateY(-4px)',
-                                                    boxShadow: 6
-                                                }
-                                            }}
-                                        >
-                                            <Box sx={{position: 'relative', paddingTop: '75%', bgcolor: '#1e1e1e'}}>
-                                                <CardMedia
-                                                    component="img"
-                                                    image={comp.imgUrl || comp.img_url || `https://placehold.co/400x400?text=${comp.name}`}
-                                                    alt={comp.name}
-                                                    sx={{
-                                                        position: 'absolute',
-                                                        top: 0,
-                                                        left: 0,
-                                                        width: '100%',
-                                                        height: '100%',
-                                                        objectFit: 'contain',
-                                                        p: {xs: 1, sm: 2}
-                                                    }}
-                                                />
-                                            </Box>
-
-                                            <CardContent sx={{
-                                                flexGrow: 1,
-                                                display: 'flex',
-                                                flexDirection: 'column',
-                                                justifyContent: 'space-between',
-                                                p: {xs: 1.5, sm: 2}
-                                            }}>
-                                                <Box>
-                                                    <Typography
-                                                        variant="caption"
-                                                        color="text.secondary"
-                                                        sx={{
-                                                            textTransform: 'uppercase',
-                                                            letterSpacing: 0.5,
-                                                            fontSize: {xs: '0.65rem', sm: '0.75rem'}
-                                                        }}
-                                                    >
-                                                        {comp.brand}
-                                                    </Typography>
-                                                    <Typography
-                                                        variant="subtitle1"
-                                                        fontWeight="bold"
-                                                        sx={{
-                                                            lineHeight: 1.2,
-                                                            mt: 0.5,
-                                                            mb: 1,
-                                                            overflow: 'hidden',
-                                                            textOverflow: 'ellipsis',
-                                                            display: '-webkit-box',
-                                                            WebkitLineClamp: 2,
-                                                            WebkitBoxOrient: 'vertical',
-                                                            minHeight: '2.4em',
-                                                            fontSize: {xs: '0.875rem', sm: '1rem'}
-                                                        }}
-                                                    >
-                                                        {comp.name}
-                                                    </Typography>
-                                                </Box>
-                                                <Typography
-                                                    variant="h6"
-                                                    color="primary.main"
-                                                    fontWeight="bold"
-                                                    sx={{fontSize: {xs: '1rem', sm: '1.25rem'}}}
-                                                >
-                                                    {formatMoney(comp.price)}
-                                                </Typography>
-                                            </CardContent>
-
-                                            <Box sx={{
-                                                p: {xs: 1.5, sm: 2},
-                                                pt: 0,
-                                                display: 'flex',
-                                                flexDirection: 'column',
-                                                gap: 1
-                                            }}>
-                                                <Button
-                                                    fullWidth
-                                                    variant="contained"
-                                                    onClick={() => setSelectedComponent(comp)}
-                                                    size="small"
-                                                    sx={{
-                                                        bgcolor: '#ff8201',
-                                                        fontWeight: 'bold',
-                                                        fontSize: {xs: '0.75rem', sm: '0.875rem'},
-                                                        '&:hover': {bgcolor: '#e67300'}
-                                                    }}
-                                                >
-                                                    Details
-                                                </Button>
-                                                {mode === 'forge' && onSelect && (
-                                                    <Button
-                                                        fullWidth
-                                                        variant="contained"
-                                                        onClick={() => onSelect(comp)}
-                                                        size="small"
-                                                        sx={{
-                                                            bgcolor: '#4caf50',
-                                                            fontWeight: 'bold',
-                                                            fontSize: {xs: '0.75rem', sm: '0.875rem'},
-                                                            '&:hover': {bgcolor: '#388e3c'}
-                                                        }}
-                                                    >
-                                                        Add
-                                                    </Button>
-                                                )}
-                                            </Box>
-                                        </Card>
-                                    </Box>
-                                ))}
-                                {processedComponents.length === 0 && (
-                                    <Box sx={{gridColumn: '1 / -1', width: '100%', textAlign: 'center', mt: 5}}>
-                                        <Typography variant="h6" color="text.secondary"
-                                                    sx={{fontSize: {xs: '1rem', sm: '1.25rem'}}}>
-                                            No compatible components found.
-                                        </Typography>
-                                        {mode === 'forge' && (
-                                            <Typography variant="body2" color="error">
-                                                (Try removing incompatible parts)
-                                            </Typography>
-                                        )}
-                                    </Box>
-                                )}
-                            </Box>
-                        )}
-                    </Box>
-                </DialogContent>
-
-                <ComponentDetailsDialog
-                    open={!!selectedComponent}
-                    component={selectedComponent}
-                    onClose={() => setSelectedComponent(null)}
-                />
-            </Dialog>
-
-            <Drawer
-                anchor="left"
-                open={mobileFiltersOpen && open}
-                onClose={() => setMobileFiltersOpen(false)}
-                sx={{zIndex: 1400}}
-                PaperProps={{
-                    sx: {
-                        bgcolor: '#1e1e1e'
-                    }
-                }}
-                disableScrollLock={true}
-            >
-                <Box sx={{pt: 2, width: 280}}>
-                    <Box sx={{
-                        display: 'flex',
-                        justifyContent: 'space-between',
-                        alignItems: 'center',
-                        px: 3,
-                        pb: 2
-                    }}>
-                        <Typography variant="h6" fontWeight="bold">Filters</Typography>
-                        <IconButton onClick={() => setMobileFiltersOpen(false)}>
-                            <CloseIcon/>
-                        </IconButton>
-                    </Box>
-                    {FilterContent}
-                </Box>
-            </Drawer>
-
-            <Dialog open={suggestOpen} onClose={() => setSuggestOpen(false)} maxWidth="sm" fullWidth>
-                <DialogTitle>Suggest a New Component</DialogTitle>
-                <DialogContent>
-                    <MuiTextField
-                        fullWidth
-                        label="Product Link *"
-                        name="link"
-                        value={suggestForm.link}
-                        onChange={handleSuggestChange}
-                        placeholder="https://example.com/product"
-                        sx={{mt: 1}}
-                        size="small"
-                    />
-                    <MuiTextField
-                        fullWidth
-                        label="Description *"
-                        name="description"
-                        value={suggestForm.description}
-                        onChange={handleSuggestChange}
-                        multiline
-                        rows={3}
-                        placeholder="Why should we add this component? Any specs/details?"
-                        sx={{mt: 2}}
-                        size="small"
-                    />
-                    <Typography variant="caption" color="text.secondary" sx={{mt: 1, display: 'block'}}>
-                        Category: <b>{category?.toUpperCase()}</b>
-                    </Typography>
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setSuggestOpen(false)}>Cancel</Button>
-                    <Button
-                        onClick={submitSuggestion}
-                        disabled={suggestLoading || !userId}
-                        variant="contained"
-                        startIcon={suggestLoading ? <CircularProgress size={20}/> : null}
-                    >
-                        {suggestLoading ? 'Submitting...' : 'Submit Suggestion'}
-                    </Button>
-                </DialogActions>
-            </Dialog>
-
-            <Snackbar
-                open={snackbarOpen}
-                autoHideDuration={4000}
-                onClose={() => setSnackbarOpen(false)}
-                anchorOrigin={{vertical: 'bottom', horizontal: 'right'}}
-            >
-                <Alert onClose={() => setSnackbarOpen(false)} sx={{width: '100%'}}>
-                    {snackbarMessage}
-                </Alert>
-            </Snackbar>
-        </>
-    );
-}
Index: mponents/Footer.tsx
===================================================================
--- components/Footer.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,41 +1,0 @@
-import React from 'react';
-import Box from '@mui/material/Box';
-import Typography from '@mui/material/Typography';
-import footerLogoUrl from '../assets/projectlogo.png';
-
-export default function Footer() {
-    return (
-        <Box
-            component="footer"
-            sx={{
-                py: 3,
-                px: 2,
-                mt: 'auto',
-                backgroundColor: (theme) =>
-                    theme.palette.mode === 'light'
-                        ? theme.palette.grey[200]
-                        : theme.palette.grey[800],
-            }}
-        >
-            <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-start' }}>
-
-                <Box
-                    component="img"
-                    src={footerLogoUrl}
-                    alt="Footer Logo"
-                    sx={{
-                        height: 30,
-                        mr: 2
-                    }}
-                />
-
-                <Typography variant="body2" color="text.secondary">
-                    {'© '}
-                    {new Date().getFullYear()}
-                    {' PC Forge. All rights reserved.'}
-                </Typography>
-
-            </Box>
-        </Box>
-    );
-}
Index: mponents/Navbar.tsx
===================================================================
--- components/Navbar.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,325 +1,0 @@
-import React, { useEffect, useState } from "react";
-import AppBar from "@mui/material/AppBar";
-import Toolbar from "@mui/material/Toolbar";
-import Typography from "@mui/material/Typography";
-import Button from "@mui/material/Button";
-import Box from "@mui/material/Box";
-import Menu from "@mui/material/Menu";
-import MenuItem from "@mui/material/MenuItem";
-import IconButton from "@mui/material/IconButton";
-import Drawer from "@mui/material/Drawer";
-import List from "@mui/material/List";
-import ListItem from "@mui/material/ListItem";
-import ListItemButton from "@mui/material/ListItemButton";
-import ListItemIcon from "@mui/material/ListItemIcon";
-import ListItemText from "@mui/material/ListItemText";
-import Divider from "@mui/material/Divider";
-import Collapse from "@mui/material/Collapse";
-
-import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
-import MenuIcon from '@mui/icons-material/Menu';
-import CloseIcon from '@mui/icons-material/Close';
-import BuildIcon from '@mui/icons-material/Build';
-import ViewListIcon from '@mui/icons-material/ViewList';
-import ExpandLess from '@mui/icons-material/ExpandLess';
-import ExpandMore from '@mui/icons-material/ExpandMore';
-import PersonIcon from '@mui/icons-material/Person';
-import LogoutIcon from '@mui/icons-material/Logout';
-import LoginIcon from '@mui/icons-material/Login';
-import PersonAddIcon from '@mui/icons-material/PersonAdd';
-
-import {
-    Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions
-} from "@mui/material";
-
-import MemoryIcon from '@mui/icons-material/Memory';
-import DeveloperBoardIcon from '@mui/icons-material/DeveloperBoard';
-import StorageIcon from '@mui/icons-material/Storage';
-import SdStorageIcon from '@mui/icons-material/SdStorage';
-import RouterIcon from '@mui/icons-material/Router';
-import LanIcon from '@mui/icons-material/Lan';
-import SpeakerIcon from '@mui/icons-material/Speaker';
-import AlbumIcon from '@mui/icons-material/Album';
-import SdCardIcon from '@mui/icons-material/SdCard';
-import CableIcon from '@mui/icons-material/Cable';
-
-import LogoUrl from '../assets/projectlogo.png';
-import { onGetAuthState } from "../pages/+Layout.telefunc";
-
-import ComponentDialog from "./ComponentDialog";
-
-type AuthState = { isLoggedIn: boolean; username: string | null; isAdmin?: boolean };
-
-const COMPONENT_CATEGORIES = [
-    { id: 'cpu', label: 'Processors', icon: <MemoryIcon fontSize="small" /> },
-    { id: 'gpu', label: 'Graphics Cards', icon: <DeveloperBoardIcon fontSize="small" /> },
-    { id: 'motherboard', label: 'Motherboards', icon: <DeveloperBoardIcon fontSize="small" /> },
-    { id: 'memory', label: 'Memory (RAM)', icon: <SdStorageIcon fontSize="small" /> },
-    { id: 'storage', label: 'Storage', icon: <StorageIcon fontSize="small" /> },
-    { id: 'case', label: 'Cases', icon: <StorageIcon fontSize="small" /> },
-    { id: 'power_supply', label: 'Power Supplies', icon: <StorageIcon fontSize="small" /> },
-    { id: 'cooler', label: 'Cooling', icon: <StorageIcon fontSize="small" /> },
-    { id: 'network_adapter', label: 'Network Adapters (WiFi)', icon: <RouterIcon fontSize="small" /> },
-    { id: 'network_card', label: 'Network Cards (Ethernet)', icon: <LanIcon fontSize="small" /> },
-    { id: 'sound_card', label: 'Sound Cards', icon: <SpeakerIcon fontSize="small" /> },
-    { id: 'optical_drive', label: 'Optical Drives', icon: <AlbumIcon fontSize="small" /> },
-    { id: 'memory_card', label: 'Storage Cards', icon: <SdCardIcon fontSize="small" /> },
-    { id: 'cables', label: 'Cables', icon: <CableIcon fontSize="small" /> },
-];
-
-export default function Navbar() {
-    const [auth, setAuth] = useState<AuthState | null>(null);
-    const [openLogoutDialog, setOpenLogoutDialog] = useState(false);
-    const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
-    const [mobileComponentsOpen, setMobileComponentsOpen] = useState(false);
-
-    const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
-    const openMenu = Boolean(anchorEl);
-
-    const [browserOpen, setBrowserOpen] = useState(false);
-    const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
-
-    const handleComponentsClick = (event: React.MouseEvent<HTMLButtonElement>) => {
-        setAnchorEl(event.currentTarget);
-    };
-
-    const handleMenuClose = () => {
-        setAnchorEl(null);
-    };
-
-    const handleCategorySelect = (categoryId: string) => {
-        setSelectedCategory(categoryId);
-        setBrowserOpen(true);
-        handleMenuClose();
-        setMobileDrawerOpen(false);
-        setMobileComponentsOpen(false);
-    };
-
-    const handleLogoutClick = (e: React.MouseEvent) => {
-        e.preventDefault();
-        setOpenLogoutDialog(true);
-        setMobileDrawerOpen(false);
-    };
-
-    const confirmLogout = async () => {
-        setAuth({ isLoggedIn: false, username: null, isAdmin: false });
-        setOpenLogoutDialog(false);
-        const csrfRes = await fetch("/api/auth/csrf");
-        const { csrfToken } = await csrfRes.json();
-        await fetch("/api/auth/signout", {
-            method: "POST",
-            headers: { "Content-Type": "application/x-www-form-urlencoded" },
-            body: new URLSearchParams({ csrfToken: csrfToken, callbackUrl: "/" }),
-        });
-        window.location.href = "/";
-    };
-
-    useEffect(() => {
-        let active = true;
-        onGetAuthState()
-            .then((data) => active && setAuth({
-                isLoggedIn: data.isLoggedIn,
-                username: data.username,
-                isAdmin: data.isAdmin
-            }))
-            .catch(() => active && setAuth({ isLoggedIn: false, username: null, isAdmin: false }));
-        return () => { active = false; };
-    }, []);
-
-    const checkDashboardUrl = auth?.isAdmin ? '/dashboard/admin' : '/dashboard/user';
-    const onHoverNav = {
-        color: 'inherit',
-        '&:hover': { backgroundColor: '#ff8201', color: 'white', fontWeight: 'bold' }
-    };
-
-    return (
-        <>
-            <AppBar position="static" color="default" enableColorOnDark>
-                <Toolbar>
-                    <Box sx={{ display: 'flex', alignItems: 'center', mr: { xs: 1, md: 4 } }}>
-                        <Box
-                            component="img"
-                            src={LogoUrl}
-                            alt="PC Forge Logo"
-                            sx={{ height: 40, mr: { xs: 1, md: 2 }, cursor: 'pointer' }}
-                            onClick={() => window.location.href='/'}
-                        />
-                        <Typography
-                            variant="h6"
-                            component="a"
-                            href="/"
-                            sx={{
-                                textDecoration: "none",
-                                color: "inherit",
-                                fontWeight: "bold",
-                                display: { xs: 'none', sm: 'block' }
-                            }}
-                        >
-                            PC Forge
-                        </Typography>
-                    </Box>
-
-                    <Box sx={{ display: { xs: "none", md: "flex" }, gap: 2 }}>
-                        <Button color="inherit" href="/forge" sx={onHoverNav}>Forge</Button>
-
-                        <Button
-                            color="inherit"
-                            onClick={handleComponentsClick}
-                            endIcon={<KeyboardArrowDownIcon />}
-                            sx={onHoverNav}
-                        >
-                            Components
-                        </Button>
-                        <Menu
-                            anchorEl={anchorEl}
-                            open={openMenu}
-                            onClose={handleMenuClose}
-                            MenuListProps={{ 'aria-labelledby': 'basic-button' }}
-                        >
-                            {COMPONENT_CATEGORIES.map((cat) => (
-                                <MenuItem key={cat.id} onClick={() => handleCategorySelect(cat.id)}>
-                                    <ListItemIcon>{cat.icon}</ListItemIcon>
-                                    <ListItemText>{cat.label}</ListItemText>
-                                </MenuItem>
-                            ))}
-                        </Menu>
-
-                        <Button color="inherit" href="/completed-builds" sx={onHoverNav}>Completed Builds</Button>
-                    </Box>
-
-                    <Box sx={{ flexGrow: 1 }} />
-
-                    <Box sx={{ display: { xs: 'none', md: 'flex' }, gap: 1 }}>
-                        {auth?.isLoggedIn ? (
-                            <>
-                                <Button sx={onHoverNav} color="inherit" href={checkDashboardUrl}>{auth.username}</Button>
-                                <Button sx={onHoverNav} color="inherit" onClick={handleLogoutClick}>Logout</Button>
-                            </>
-                        ) : (
-                            <>
-                                <Button color="inherit" href="/auth/login" sx={onHoverNav}>Login</Button>
-                                <Button color="inherit" href="/auth/register" sx={onHoverNav}>Register</Button>
-                            </>
-                        )}
-                    </Box>
-
-                    <IconButton
-                        color="inherit"
-                        edge="end"
-                        onClick={() => setMobileDrawerOpen(true)}
-                        sx={{ display: { xs: 'block', md: 'none' } }}
-                    >
-                        <MenuIcon />
-                    </IconButton>
-                </Toolbar>
-            </AppBar>
-
-            <Drawer
-                anchor="right"
-                open={mobileDrawerOpen}
-                onClose={() => setMobileDrawerOpen(false)}
-                sx={{
-                    display: { xs: 'block', md: 'none' },
-                    '& .MuiDrawer-paper': { width: 280 , height: '60%'}
-                }}
-            >
-                <Box sx={{ p: 2, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
-                    <Typography variant="h6" fontWeight="bold">Menu</Typography>
-                    <IconButton onClick={() => setMobileDrawerOpen(false)}>
-                        <CloseIcon />
-                    </IconButton>
-                </Box>
-                <Divider />
-
-                <List>
-                    <ListItem disablePadding>
-                        <ListItemButton onClick={() => { window.location.href = '/forge'; }}>
-                            <ListItemIcon><BuildIcon /></ListItemIcon>
-                            <ListItemText primary="Forge" />
-                        </ListItemButton>
-                    </ListItem>
-
-                    <ListItem disablePadding>
-                        <ListItemButton onClick={() => setMobileComponentsOpen(!mobileComponentsOpen)}>
-                            <ListItemIcon><ViewListIcon /></ListItemIcon>
-                            <ListItemText primary="Components" />
-                            {mobileComponentsOpen ? <ExpandLess /> : <ExpandMore />}
-                        </ListItemButton>
-                    </ListItem>
-                    <Collapse in={mobileComponentsOpen} timeout="auto" unmountOnExit>
-                        <List component="div" disablePadding>
-                            {COMPONENT_CATEGORIES.map((cat) => (
-                                <ListItemButton
-                                    key={cat.id}
-                                    sx={{ pl: 4 }}
-                                    onClick={() => handleCategorySelect(cat.id)}
-                                >
-                                    <ListItemIcon>{cat.icon}</ListItemIcon>
-                                    <ListItemText primary={cat.label} />
-                                </ListItemButton>
-                            ))}
-                        </List>
-                    </Collapse>
-
-                    <ListItem disablePadding>
-                        <ListItemButton onClick={() => { window.location.href = '/completed-builds'; }}>
-                            <ListItemIcon><ViewListIcon /></ListItemIcon>
-                            <ListItemText primary="Completed Builds" />
-                        </ListItemButton>
-                    </ListItem>
-
-                    <Divider sx={{ my: 1 }} />
-
-                    {auth?.isLoggedIn ? (
-                        <>
-                            <ListItem disablePadding>
-                                <ListItemButton onClick={() => { window.location.href = checkDashboardUrl; }}>
-                                    <ListItemIcon><PersonIcon /></ListItemIcon>
-                                    <ListItemText primary={"My Profile"} />
-                                </ListItemButton>
-                            </ListItem>
-                            <ListItem disablePadding>
-                                <ListItemButton onClick={handleLogoutClick}>
-                                    <ListItemIcon><LogoutIcon /></ListItemIcon>
-                                    <ListItemText primary="Logout" />
-                                </ListItemButton>
-                            </ListItem>
-                        </>
-                    ) : (
-                        <>
-                            <ListItem disablePadding>
-                                <ListItemButton onClick={() => { window.location.href = '/auth/login'; }}>
-                                    <ListItemIcon><LoginIcon /></ListItemIcon>
-                                    <ListItemText primary="Login" />
-                                </ListItemButton>
-                            </ListItem>
-                            <ListItem disablePadding>
-                                <ListItemButton onClick={() => { window.location.href = '/auth/register'; }}>
-                                    <ListItemIcon><PersonAddIcon /></ListItemIcon>
-                                    <ListItemText primary="Register" />
-                                </ListItemButton>
-                            </ListItem>
-                        </>
-                    )}
-                </List>
-            </Drawer>
-
-            <Dialog open={openLogoutDialog} onClose={() => setOpenLogoutDialog(false)}>
-                <DialogTitle>Confirm Logout</DialogTitle>
-                <DialogContent>
-                    <DialogContentText>Are you sure you want to leave the Forge?</DialogContentText>
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setOpenLogoutDialog(false)}>Cancel</Button>
-                    <Button onClick={confirmLogout} color="error" variant="contained" autoFocus>Logout</Button>
-                </DialogActions>
-            </Dialog>
-
-            <ComponentDialog
-                open={browserOpen}
-                category={selectedCategory}
-                onClose={() => setBrowserOpen(false)}
-            />
-        </>
-    );
-}
Index: database/drizzle/db.ts
===================================================================
--- database/drizzle/db.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ database/drizzle/db.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,11 +1,7 @@
-import { Pool } from "pg";
-import { drizzle } from "drizzle-orm/node-postgres";
-import * as schema from "./schema";
+import Database from "better-sqlite3";
+import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3";
 
-const pool = new Pool({
-    connectionString: process.env.DATABASE_URL,
-})
-
-export const db = drizzle(pool, { schema });
-
-export type Database = typeof db;
+export function dbSqlite() {
+  const sqlite = new Database(process.env.DATABASE_URL);
+  return drizzleSqlite(sqlite);
+}
Index: tabase/drizzle/queries/builds.ts
===================================================================
--- database/drizzle/queries/builds.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,571 +1,0 @@
-import type { Database } from "../db";
-import {
-    buildComponentsTable,
-    buildsTable,
-    componentsTable,
-    favoriteBuildsTable,
-    ratingBuildsTable,
-    reviewsTable, usersTable
-} from "../schema";
-import {eq, desc, and, sql, ilike, asc} from "drizzle-orm";
-import {inArray} from "drizzle-orm/sql/expressions/conditions";
-import {addComponentToBuild} from "./components";
-
-export async function getPendingBuilds(db: Database) {
-    const pendingBuilds = await db
-        .select({
-            id: buildsTable.id,
-            user_id: buildsTable.userId,
-            name: buildsTable.name,
-            created_at: buildsTable.createdAt,
-            total_price: buildsTable.totalPrice
-        })
-        .from(buildsTable)
-        .where(
-            eq(buildsTable.isApproved, false)
-        )
-        .orderBy(
-            desc(buildsTable.createdAt)
-        );
-
-    return pendingBuilds;
-}
-
-export async function getUserBuilds(db: Database, userId: number) {
-    const userBuilds = await db
-        .select({
-            id: buildsTable.id,
-            user_id: buildsTable.userId,
-            name: buildsTable.name,
-            created_at: buildsTable.createdAt,
-            total_price: buildsTable.totalPrice
-        })
-        .from(buildsTable)
-        .where(
-            eq(buildsTable.userId, userId)
-        )
-        .orderBy(
-            desc(buildsTable.createdAt)
-        );
-
-    return userBuilds;
-}
-
-export async function setBuildApprovalStatus(db: Database, buildId: number, isApproved: boolean){
-    const [result] = await db
-        .update(buildsTable)
-        .set({
-            isApproved: isApproved
-        })
-        .where(
-            and(
-                eq(buildsTable.id, buildId),
-                eq(buildsTable.isApproved, !isApproved)
-            )
-        )
-        .returning({
-            id: buildsTable.id
-        })
-
-    return result?.id ?? null;
-}
-
-export async function getFavoriteBuilds(db: Database, userId: number) {
-    const favoriteBuilds = await db
-        .select({
-            id: buildsTable.id,
-            user_id: buildsTable.userId,
-            name: buildsTable.name,
-            created_at: buildsTable.createdAt,
-            total_price: buildsTable.totalPrice,
-            avgRating: sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float),0)`
-        })
-        .from(buildsTable)
-        .innerJoin(
-            favoriteBuildsTable,
-            eq(buildsTable.id, favoriteBuildsTable.buildId)
-        )
-        .leftJoin(
-            ratingBuildsTable,
-            eq(buildsTable.id, ratingBuildsTable.buildId)
-        )
-        .where(
-            eq(favoriteBuildsTable.userId, userId)
-        )
-        .groupBy(
-            buildsTable.id,
-            buildsTable.userId,
-            buildsTable.name,
-            buildsTable.createdAt,
-            buildsTable.totalPrice
-        )
-        .orderBy(
-            desc(sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float),0)`)
-        );
-
-    return favoriteBuilds;
-}
-
-export async function getApprovedBuilds(db: Database, limit?: number, sort?: string, q?: string) {
-    let queryConditions = [eq(buildsTable.isApproved, true)];
-    let sortCondition:any;
-
-    if (q) {
-        queryConditions.push(
-            ilike(buildsTable.name, `%${q}%`)
-        );
-    }
-
-    switch(sort) {
-        case 'price_asc':
-            sortCondition = asc(buildsTable.totalPrice)
-            break;
-        case 'price_desc':
-            sortCondition = desc(buildsTable.totalPrice)
-            break;
-        case 'rating_desc':
-            sortCondition = desc(sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float),0)`)
-            break;
-        case 'oldest':
-            sortCondition = asc(buildsTable.createdAt)
-            break;
-        case 'newest':
-            sortCondition = desc(buildsTable.createdAt)
-            break;
-        default:
-            sortCondition = desc(buildsTable.createdAt)
-            break;
-        }
-
-    const approvedBuilds = await db
-        .select({
-            id: buildsTable.id,
-            user_id: buildsTable.userId,
-            name: buildsTable.name,
-            created_at: buildsTable.createdAt,
-            total_price: buildsTable.totalPrice,
-            avgRating: sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float),0)`
-        })
-        .from(buildsTable)
-        .leftJoin(
-            ratingBuildsTable,
-            eq(buildsTable.id, ratingBuildsTable.buildId)
-        )
-        .groupBy(
-            buildsTable.id,
-            buildsTable.userId,
-            buildsTable.name,
-            buildsTable.createdAt,
-            buildsTable.totalPrice
-        )
-        .where(
-            and (
-                ...queryConditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100); // 100 placeholder
-
-    return approvedBuilds;
-}
-
-export async function getBuildDetails(db: Database, buildId: number, userId?: number) {
-    return db.transaction(async (tx) => {
-        const [buildDetails] = await tx
-            .select({
-                id: buildsTable.id,
-                userId: buildsTable.userId,
-                name: buildsTable.name,
-                createdAt: buildsTable.createdAt,
-                description: buildsTable.description,
-                totalPrice: buildsTable.totalPrice,
-                isApproved: buildsTable.isApproved,
-                creator: usersTable.username
-            })
-            .from(buildsTable)
-            .innerJoin(
-                usersTable,
-                eq(buildsTable.userId, usersTable.id)
-            )
-            .where(
-                eq(buildsTable.id, buildId)
-            )
-            .limit(1);
-
-        if (!buildDetails) return null;
-
-        const components = await tx
-            .select({
-                componentId: buildComponentsTable.componentId,
-                component: componentsTable,
-                quantity: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .innerJoin(
-                componentsTable,
-                eq(buildComponentsTable.componentId, componentsTable.id)
-            )
-            .where(
-                eq(buildComponentsTable.buildId, buildId)
-            );
-
-        const reviews = await tx
-            .select({
-                username: usersTable.username,
-                content: reviewsTable.content,
-                createdAt: reviewsTable.createdAt
-            })
-            .from(reviewsTable)
-            .innerJoin(
-                usersTable,
-                eq(reviewsTable.userId, usersTable.id)
-            )
-            .where(
-                eq(reviewsTable.buildId, buildId)
-            )
-            .orderBy(
-                desc(reviewsTable.createdAt)
-            );
-
-        let [ratingStatistics] = await tx
-            .select({
-                averageRating: sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float), 0)`.as("averageRating"),
-                ratingCount: sql<number>`COUNT(${ratingBuildsTable.value})`.as("ratingCount")
-            })
-            .from(ratingBuildsTable)
-            .where(
-                eq(ratingBuildsTable.buildId, buildId)
-            )
-            .groupBy(ratingBuildsTable.buildId);
-
-        ratingStatistics = {
-            averageRating: Number(ratingStatistics?.averageRating ?? 0),
-            ratingCount: Number(ratingStatistics?.ratingCount ?? 0),
-        }
-
-        let userRating = null;
-        let isFavorite = false;
-        let userReview = null;
-
-        if(userId) {
-            const [rating] = await tx
-                .select()
-                .from(ratingBuildsTable)
-                .where(
-                    and(
-                        eq(ratingBuildsTable.buildId, buildId),
-                        eq(ratingBuildsTable.userId, userId)
-                    )
-                )
-                .limit(1);
-
-            userRating = rating?.value ? Number(rating.value) : null;
-
-            const [favorite] = await tx
-                .select()
-                .from(favoriteBuildsTable)
-                .where(
-                    and(
-                        eq(favoriteBuildsTable.buildId, buildId),
-                        eq(favoriteBuildsTable.userId, userId)
-                    )
-                )
-                .limit(1);
-
-            isFavorite = !!favorite;
-
-            const [review] = await tx
-                .select()
-                .from(reviewsTable)
-                .where(
-                    and(
-                        eq(reviewsTable.buildId, buildId),
-                        eq(reviewsTable.userId, userId)
-                    )
-                )
-                .limit(1);
-
-            userReview = review?.content;
-        }
-
-        return {
-            ...buildDetails,
-            components: components.map(c => ({
-                    ...c.component,
-                    quantity: c.quantity
-            })),
-            reviews: reviews.map(r => ({
-                username: r.username,
-                content: r.content,
-                createdAt: r.createdAt
-            })),
-            ratingStatistics: ratingStatistics,
-            userRating,
-            userReview,
-            isFavorite
-        };
-    });
-}
-
-export async function toggleFavoriteBuild(db: Database, userId: number, buildId: number) {
-    const existing = await db
-        .select()
-        .from(favoriteBuildsTable)
-        .where(
-            and(
-                eq(favoriteBuildsTable.userId, userId),
-                eq(favoriteBuildsTable.buildId, buildId)
-            )
-        )
-        .limit(1);
-
-    if (existing.length > 0) {
-        await db
-            .delete(favoriteBuildsTable)
-            .where(
-                and(
-                    eq(favoriteBuildsTable.userId, userId),
-                    eq(favoriteBuildsTable.buildId, buildId)
-                )
-            );
-
-        return null;
-    }
-
-    await db
-        .insert(favoriteBuildsTable)
-        .values({
-            userId,
-            buildId,
-        });
-
-    return true;
-}
-
-export async function setBuildRating(db: Database, userId: number, buildId: number, value: number) {
-    const [result] = await db
-        .insert(ratingBuildsTable)
-        .values({
-            userId,
-            buildId,
-            value: value
-        })
-        .onConflictDoUpdate({
-            target: [ratingBuildsTable.userId, ratingBuildsTable.buildId],
-            set: {
-                value: value,
-            },
-        })
-        .returning({
-            userId: ratingBuildsTable.userId,
-            buildId: ratingBuildsTable.buildId,
-            value: ratingBuildsTable.value
-        })
-
-    return result ?? null;
-}
-
-export async function setBuildReview(db: Database, userId: number,  buildId: number, content: string) {
-    const [result] = await db
-        .insert(reviewsTable)
-        .values({
-            userId,
-            buildId,
-            content,
-            createdAt: new Date().toISOString().split('T')[0]
-        })
-        .onConflictDoUpdate({
-            target: [reviewsTable.userId, reviewsTable.buildId],
-            set: {
-                content: content,
-                createdAt: new Date().toISOString().split('T')[0]
-            },
-        })
-        .returning({
-            userId: reviewsTable.userId,
-            buildId: reviewsTable.buildId,
-            content: reviewsTable.content,
-            createdAt: reviewsTable.createdAt
-        })
-
-    return result ?? null;
-}
-
-export async function cloneBuild(db: Database, userId: number, buildId: number) {
-    return db.transaction(async (tx) => {
-        const [buildToClone] = await tx
-            .select()
-            .from(buildsTable)
-            .where(
-                eq(buildsTable.id, buildId)
-            )
-            .limit(1);
-
-        if (!buildToClone) return null;
-
-        const [newBuild] = await tx
-            .insert(buildsTable)
-            .values({
-                userId: userId,
-                name: `${buildToClone.name} (copy)`,
-                createdAt: new Date().toISOString().split('T')[0],
-                description: buildToClone.description,
-                totalPrice: buildToClone.totalPrice,
-                isApproved: false
-            })
-            .returning({
-                id: buildsTable.id
-            });
-
-        if(!newBuild) return null;
-
-        const existing = await tx
-            .select({
-                componentId: buildComponentsTable.componentId,
-                numComponents: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .where(eq(buildComponentsTable.buildId, buildId));
-
-        if (existing.length > 0) {
-            await tx.insert(buildComponentsTable).values(
-                existing.map((r) => ({
-                    buildId: newBuild.id,
-                    componentId: r.componentId,
-                    numComponents: r.numComponents
-                })),
-            );
-        }
-
-        return newBuild.id;
-    });
-}
-
-export async function deleteBuild(db: Database, userId: number, buildId: number) {
-    const [result] = await db
-        .delete(buildsTable)
-        .where(
-            and(
-                eq(buildsTable.id, buildId),
-                eq(buildsTable.userId, userId)
-            )
-        )
-        .returning({
-            id: buildsTable.id
-        })
-
-    return result?.id ?? null;
-}
-
-export async function addNewBuild(db: Database, userId: number, name: string, description: string) {
-    const [newBuild] = await db
-        .insert(buildsTable)
-        .values({
-            userId: userId,
-            name: name,
-            createdAt: new Date().toISOString().split('T')[0],
-            description: description,
-            totalPrice: Number(0).toFixed(2),
-            isApproved: false
-        })
-        .returning({
-            id: buildsTable.id
-        });
-
-    return newBuild?.id ?? null;
-}
-
-export async function editBuild(db: Database, userId: number, buildId: number) {
-    const [buildToEdit] = await db
-        .select()
-        .from(buildsTable)
-        .where(
-            and(
-                eq(buildsTable.id, buildId),
-                eq(buildsTable.userId, userId)
-            )
-        )
-        .limit(1);
-
-    if (!buildToEdit || buildToEdit.isApproved) return null;
-
-
-    return buildToEdit?.id ?? null;
-}
-
-export async function saveBuildState(db: Database, userId: number, buildId: number, name: string, description: string ) {
-    const [build] = await db
-        .select({
-            id: buildsTable.id,
-            isApproved: buildsTable.isApproved
-        })
-        .from(buildsTable)
-        .where(
-            and(
-                eq(buildsTable.id, buildId),
-                eq(buildsTable.userId, userId)
-            )
-        )
-        .limit(1);
-
-    if (!build || build.isApproved) return null;
-
-    const [updated] = await db
-        .update(buildsTable)
-        .set({
-            name,
-            description
-        })
-        .where(
-            eq(buildsTable.id, buildId)
-        )
-        .returning({
-            id: buildsTable.id
-        });
-
-    return updated?.id ?? null;
-}
-
-export async function getBuildState(db: Database, userId: number, buildId: number) {
-    return db.transaction(async (tx) => {
-        const [build] = await tx
-            .select({
-                id: buildsTable.id,
-                userId: buildsTable.userId,
-                isApproved: buildsTable.isApproved,
-                name: buildsTable.name,
-                description: buildsTable.description,
-                totalPrice: buildsTable.totalPrice,
-            })
-            .from(buildsTable)
-            .where(
-                and(
-                    eq(buildsTable.id, buildId),
-                    eq(buildsTable.userId, userId)
-                )
-            )
-            .limit(1);
-
-        if (!build || build.isApproved) return null;
-
-        const components = await tx
-            .select({
-                componentId: buildComponentsTable.componentId,
-                quantity: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .where(
-                eq(buildComponentsTable.buildId, buildId)
-            );
-
-        return {
-            build,
-            components: components.map(c => ({
-                id: c.componentId,
-                quantity: c.quantity
-            }))
-        };
-    });
-}
Index: tabase/drizzle/queries/components.ts
===================================================================
--- database/drizzle/queries/components.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,1168 +1,0 @@
-import type { Database } from "../db";
-import {
-    buildComponentsTable,
-    buildsTable, cablesTable, caseMoboFormFactorsTable, casePsFormFactorsTable, caseStorageFormFactorsTable,
-    componentsTable, coolerCPUSocketsTable, coolersTable,
-    CPUTable,
-    GPUTable, memoryCardsTable,
-    memoryTable, motherboardsTable,
-    networkAdaptersTable,
-    networkCardsTable, opticalDrivesTable, pcCasesTable, powerSupplyTable,
-    ratingBuildsTable, soundCardsTable, storageTable
-} from "../schema";
-import {and, asc, desc, eq, ilike, SQL, sql} from "drizzle-orm";
-import {typeConfigMap, ComponentType, requiredFields} from "../util/componentFieldConfig";
-import {AnyPgColumn} from "drizzle-orm/pg-core";
-import {inArray} from "drizzle-orm/sql/expressions/conditions";
-export async function getAllComponents(db: Database, limit?: number, componentType?: string, sort?: string, q?: string) {
-    let queryConditions = [];
-    let sortConditions = [];
-
-    if (q) {
-        queryConditions.push(
-            ilike(componentsTable.name, `%${q}%`)
-        );
-    }
-
-    switch(sort) {
-        case 'price_asc':
-            sortConditions.push(
-                asc(componentsTable.price)
-            );
-            break;
-        case 'price_desc':
-            sortConditions.push(
-                desc(componentsTable.price)
-            );
-            break;
-        default:
-            sortConditions.push(
-                desc(componentsTable.price)
-            );
-            break;
-    }
-
-    if(componentType && componentType.trim() !== 'all') {
-        queryConditions.push(
-            eq(componentsTable.type, componentType.trim().toLowerCase())
-        );
-    }
-
-    const components = await db
-        .select()
-        .from(componentsTable)
-        .where(
-            queryConditions.length > 0 ?
-                and (
-                    ...queryConditions
-                )
-                : undefined
-        )
-        .orderBy(
-            ...sortConditions
-        )
-        .limit(limit || 100); // 100 placeholder
-
-    return components;
-}
-
-export async function getComponentDetails(db: Database, componentId: number) {
-    const [component] = await db
-        .select()
-        .from(componentsTable)
-        .where(
-            eq(componentsTable.id, componentId)
-        )
-        .limit(1);
-
-    if(!component) return null;
-
-    const config = typeConfigMap[component.type as ComponentType];
-
-    const [details] = await db
-        .select()
-        .from(config.table)
-        .where(
-            eq(config.table.componentId, componentId)
-        )
-        .limit(1);
-
-    if (component.type === 'case') {
-        details.storageFormFactors = await db.select().from(caseStorageFormFactorsTable).where(eq(caseStorageFormFactorsTable.caseId, componentId));
-        details.psFormFactors = await db.select().from(casePsFormFactorsTable).where(eq(casePsFormFactorsTable.caseId, componentId));
-        details.moboFormFactors = await db.select().from(caseMoboFormFactorsTable).where(eq(caseMoboFormFactorsTable.caseId, componentId));
-    }
-
-    if (component.type === 'cooler') {
-        details.cpuSockets = await db.select().from(coolerCPUSocketsTable).where(eq(coolerCPUSocketsTable.coolerId, componentId));
-    }
-
-    return {
-        ...component,
-        details: details
-    };
-}
-
-export async function getDetailsNewComponent(componentType: string) {
-    const config = typeConfigMap[componentType as ComponentType];
-
-    return {
-        type: componentType as ComponentType,
-        requiredFields: requiredFields[componentType as ComponentType] ?? [],
-        multiTables: config.multiTables ?? {},
-    };
-}
-
-export async function addNewComponent(db: Database, name: string, brand: string, price: number, imgUrl: string, type: string, specificData: any) {
-    return db.transaction(async (tx) => {
-        const [newComponent] = await tx
-            .insert(componentsTable)
-            .values({
-                name: name,
-                brand: brand,
-                price: price.toFixed(2),
-                imgUrl: imgUrl,
-                type: type
-            })
-            .returning({
-                id: componentsTable.id
-            });
-
-        const componentId = newComponent.id;
-
-        const config = typeConfigMap[type as ComponentType];
-
-        await tx
-            .insert(config.table)
-            .values({
-                componentId: componentId,
-                ...specificData
-            });
-
-        if (type === 'case') {
-            if (specificData.storageFormFactors) {
-                await tx.insert(caseStorageFormFactorsTable).values(
-                    specificData.storageFormFactors.map((sf: any) => ({
-                        caseId: componentId,
-                        formFactor: sf.formFactor,
-                        numSlots: sf.numSlots,
-                    }))
-                );
-            }
-            if (specificData.psFormFactors) {
-                await tx.insert(casePsFormFactorsTable).values(
-                    specificData.psFormFactors.map((pf: any) => ({
-                        caseId: componentId,
-                        formFactor: pf.formFactor,
-                    }))
-                );
-            }
-            if (specificData.moboFormFactors) {
-                await tx.insert(caseMoboFormFactorsTable).values(
-                    specificData.moboFormFactors.map((mf: any) => ({
-                        caseId: componentId,
-                        formFactor: mf.formFactor,
-                    }))
-                );
-            }
-        }
-
-        if (type === 'cooler' && specificData.cpuSockets) {
-            await tx.insert(coolerCPUSocketsTable).values(
-                specificData.cpuSockets.map((socket: any) => ({ coolerId: componentId, socket }))
-            );
-        }
-
-        return componentId;
-    });
-}
-
-export async function getBuildComponents(db: Database, buildId: number) {
-    const [build] = await db
-        .select({
-            buildId: buildsTable.id,
-            userId: buildsTable.userId,
-        })
-        .from(buildsTable)
-        .where(
-            eq(buildsTable.id, buildId)
-        )
-        .limit(1);
-
-    if(!build) return null;
-
-    const components = await db
-        .select({
-            id: componentsTable.id,
-            type: componentsTable.type,
-            quantity: buildComponentsTable.numComponents
-        })
-        .from(buildComponentsTable)
-        .where(
-            eq(buildComponentsTable.buildId, buildId)
-        )
-        .innerJoin(
-            componentsTable,
-            eq(buildComponentsTable.componentId, componentsTable.id)
-        );
-
-    const componentsDetails = [];
-
-    for (const comp of components) {
-        const config = typeConfigMap[comp.type as ComponentType];
-
-        const [details] = await db
-            .select()
-            .from(config.table)
-            .where(
-                eq(config.table.componentId, comp.id)
-            )
-            .limit(1);
-
-        if (comp.type === 'case') {
-            details.storageFormFactors = await db.select().from(caseStorageFormFactorsTable).where(eq(caseStorageFormFactorsTable.caseId, comp.id));
-            details.psFormFactors = await db.select().from(casePsFormFactorsTable).where(eq(casePsFormFactorsTable.caseId, comp.id));
-            details.moboFormFactors = await db.select().from(caseMoboFormFactorsTable).where(eq(caseMoboFormFactorsTable.caseId, comp.id));
-        }
-
-        if (comp.type === 'cooler') {
-            details.cpuSockets = await db.select().from(coolerCPUSocketsTable).where(eq(coolerCPUSocketsTable.coolerId, comp.id));
-        }
-
-        componentsDetails.push({
-            ...comp,
-            quantity: comp.quantity,
-            details: details
-        });
-    }
-
-    return componentsDetails;
-}
-
-export async function getCompatibleComponents(db: Database, buildId: number, componentType: string, limit?: number, sort?: string) {
-    let sortCondition: any;
-
-    switch(sort) {
-        case 'price_asc':
-            sortCondition = asc(componentsTable.price);
-            break;
-        case 'price_desc':
-            sortCondition = desc(componentsTable.price);
-            break;
-        default:
-            sortCondition = desc(componentsTable.price);
-            break;
-    }
-
-    const existingComponents = await getBuildComponents(db, buildId);
-
-    if(!existingComponents) return null;
-
-    const existing = {
-        cpu: existingComponents.find(c => c.type === 'cpu'),
-        motherboard: existingComponents.find(c => c.type === 'motherboard'),
-        case: existingComponents.find(c => c.type === 'case'),
-        cooler: existingComponents.find(c => c.type === 'cooler'),
-        psu: existingComponents.find(c => c.type === 'power_supply'),
-        gpu: existingComponents.find(c => c.type === 'gpu'),
-        memory: existingComponents.filter(c => c.type === 'memory'),
-        storage: existingComponents.filter(c => c.type === 'storage'),
-        networkCards: existingComponents.filter(c => c.type === 'network_card'),
-        networkAdapters: existingComponents.filter(c => c.type === 'network_adapter'),
-        soundCards: existingComponents.filter(c => c.type === 'sound_card'),
-        memoryCards: existingComponents.filter(c => c.type === 'memory_card'),
-        opticalDrives: existingComponents.filter(c => c.type === 'optical_drive'),
-        cables: existingComponents.filter(c => c.type === 'cables')
-    };
-
-    const pciExpressSlotsUsed = [
-        existing.gpu,
-        ...existing.networkCards,
-        ...existing.networkAdapters,
-        ...existing.soundCards,
-        ...existing.memoryCards
-    ].reduce((sum: number, c: any) => {
-        if (!c) return sum;
-        return sum + (c.quantity || 1);
-    }, 0);
-
-    const existingTDP = existingComponents.reduce((sum, c) => {
-        const tdp = c.details?.tdp ? Number(c.details.tdp) : 0;
-        return sum + (tdp * (c.quantity || 1));
-    }, 0);
-
-
-    let compatibleComponents: any[] = [];
-
-    switch (componentType) {
-        case 'cpu':
-            compatibleComponents = await getCompatibleCPUs(db, existing, existingTDP, limit, sortCondition);
-            break;
-        case 'motherboard':
-            compatibleComponents = await getCompatibleMotherboards(db, existing, pciExpressSlotsUsed, limit, sortCondition);
-            break;
-        case 'cooler':
-            compatibleComponents = await getCompatibleCoolers(db, existing, limit, sortCondition);
-            break;
-        case 'gpu':
-            compatibleComponents = await getCompatibleGPUs(db, existing, existingTDP, pciExpressSlotsUsed, limit, sortCondition);
-            break;
-        case 'memory':
-            compatibleComponents = await getCompatibleMemory(db, existing, limit, sortCondition);
-            break;
-        case 'storage':
-            compatibleComponents = await getCompatibleStorage(db, existing, limit, sortCondition);
-            break;
-        case 'case':
-            compatibleComponents = await getCompatibleCases(db, existing, limit, sortCondition);
-            break;
-        case 'power_supply':
-            compatibleComponents = await getCompatiblePSUs(db, existing, existingTDP, limit, sortCondition);
-            break;
-        case 'network_card':
-        case 'network_adapter':
-        case 'sound_card':
-        case 'memory_card':
-            compatibleComponents = await getCompatiblePCIeComponents(db, existing, componentType, pciExpressSlotsUsed, limit, sortCondition);
-            break;
-        case 'optical_drive':
-            compatibleComponents = await getCompatibleOpticalDrives(db, existing, limit, sortCondition);
-            break;
-        case 'cables':
-            compatibleComponents = await getCompatibleCables(db, limit, sortCondition);
-            break;
-        default:
-            compatibleComponents = [];
-    }
-
-    if(compatibleComponents.length === 0) return null;
-
-    return compatibleComponents;
-}
-
-
-// Helper functions for checking component-specific compatibility
-async function getCompatibleCPUs(db: Database, existing: any, existingTDP?: number, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'cpu')];
-
-    if (existing.motherboard) {
-        conditions.push(
-            eq(CPUTable.socket, existing.motherboard.details.socket)
-        );
-    }
-
-    if (existing.cooler) {
-        conditions.push(
-            sql`${CPUTable.tdp} <= ${existing.cooler.details.maxTdpSupported}`
-        );
-    }
-
-    const cpus = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            socket: CPUTable.socket,
-            cores: CPUTable.cores,
-            threads: CPUTable.threads,
-            baseClock: CPUTable.baseClock,
-            boostClock: CPUTable.boostClock,
-            tdp: CPUTable.tdp,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            CPUTable,
-            eq(componentsTable.id, CPUTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    let filteredCPUs = cpus;
-
-    if (existing.cooler?.details?.cpuSockets) {
-        const coolerSockets = existing.cooler.details.cpuSockets.map((s: any) => s.socket);
-        filteredCPUs = filteredCPUs.filter(cpu => coolerSockets.includes(cpu.socket));
-    }
-
-    if(existing.psu?.details?.wattage && existingTDP) {
-        const psuWattage = Number(existing.psu.details.wattage) || 0;
-
-        if (psuWattage > 0) {
-            const budget = psuWattage / 1.2;
-
-            const currentCpuTdp = Number(existing.cpu?.details?.tdp) || 0;
-            const baseWithoutCpu = existingTDP - currentCpuTdp;
-
-            filteredCPUs = filteredCPUs.filter(cpu => {
-                const cpuTdp = Number(cpu.tdp) || 0;
-                return (baseWithoutCpu + cpuTdp) <= budget;
-            });
-        }
-    }
-
-    return filteredCPUs;
-}
-
-async function getCompatibleMotherboards(db: Database, existing: any, pciExpressSlotsUsed: number, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'motherboard')];
-
-    if (existing.cpu) {
-        conditions.push(
-            eq(motherboardsTable.socket, existing.cpu.details.socket)
-        );
-    }
-
-    if (existing.memory.length > 0) {
-        const ramType = existing.memory[0].details.type;
-        conditions.push(
-            eq(motherboardsTable.ramType, ramType)
-        );
-    }
-
-    if (pciExpressSlotsUsed > 0) {
-        conditions.push(
-            sql`${motherboardsTable.pciExpressSlots} >= ${pciExpressSlotsUsed}`
-        );
-    }
-
-    const motherboards = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            socket: motherboardsTable.socket,
-            chipset: motherboardsTable.chipset,
-            formFactor: motherboardsTable.formFactor,
-            ramType: motherboardsTable.ramType,
-            numRamSlots: motherboardsTable.numRamSlots,
-            maxRamCapacity: motherboardsTable.maxRamCapacity,
-            pciExpressSlots: motherboardsTable.pciExpressSlots,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            motherboardsTable,
-            eq(componentsTable.id, motherboardsTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    const compatibleMotherboards = motherboards.filter(mobo => {
-        if (existing.memory.length > 0) {
-            const totalModules = existing.memory.reduce((sum: number, m: any) =>
-                sum + (Number(m.details.modules) * m.quantity), 0
-            );
-            const totalCapacity = existing.memory.reduce((sum: number, m: any) =>
-                sum + (Number(m.details.capacity) * m.quantity), 0
-            );
-
-            if (totalModules > Number(mobo.numRamSlots)) return false;
-            if (totalCapacity > Number(mobo.maxRamCapacity)) return false;
-        }
-
-        return true;
-    });
-
-    if (existing.case?.details?.moboFormFactors) {
-        const caseFormFactors = existing.case.details.moboFormFactors.map((f: any) => f.formFactor);
-        return compatibleMotherboards.filter(mobo => caseFormFactors.includes(mobo.formFactor));
-    }
-
-    return compatibleMotherboards;
-}
-
-async function getCompatibleCoolers(db: Database, existing: any, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'cooler')];
-
-    if (existing.cpu) {
-        conditions.push(
-            sql`${coolersTable.maxTdpSupported} >= ${existing.cpu.details.tdp}`
-        );
-    }
-
-    if (existing.case) {
-        conditions.push(
-            sql`${coolersTable.height} <= ${existing.case.details.coolerMaxHeight}`
-        );
-    }
-
-    const coolers = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            coolerType: coolersTable.type,
-            height: coolersTable.height,
-            maxTdpSupported: coolersTable.maxTdpSupported,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            coolersTable,
-            eq(componentsTable.id, coolersTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-
-    if(existing.cpu && coolers.length > 0) {
-        const coolerIds = coolers.map(c => c.id);
-
-        const allSockets = await db
-            .select({
-                coolerId: coolerCPUSocketsTable.coolerId,
-                socket: coolerCPUSocketsTable.socket
-            })
-            .from(coolerCPUSocketsTable)
-            .where(
-                inArray(coolerCPUSocketsTable.coolerId, coolerIds)
-            );
-        const socketsByCooler = allSockets.reduce((acc, { coolerId, socket }) => {
-            if (!acc[coolerId]) acc[coolerId] = [];
-            acc[coolerId].push(socket);
-            return acc;
-        }, {} as Record<number, string[]>);
-
-        return coolers.filter(cooler => {
-            const sockets = socketsByCooler[cooler.id] || [];
-            return sockets.includes(existing.cpu.details.socket);
-        });
-    }
-
-    return coolers;
-}
-
-async function getCompatibleGPUs(db: Database, existing: any, existingTDP: number, pciExpressSlotsUsed: number, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'gpu')];
-
-    if (existing.case) {
-        conditions.push(
-            sql`${GPUTable.length} <= ${existing.case.details.gpuMaxLength}`
-        );
-    }
-
-    const gpus = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            vram: GPUTable.vram,
-            tdp: GPUTable.tdp,
-            baseClock: GPUTable.baseClock,
-            boostClock: GPUTable.boostClock,
-            chipset: GPUTable.chipset,
-            length: GPUTable.length,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            GPUTable,
-            eq(componentsTable.id, GPUTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    let filteredGPUs = gpus;
-
-    if (existing.motherboard) {
-        const availableSlots = Number(existing.motherboard.details.pciExpressSlots);
-        filteredGPUs = gpus.filter(() => (pciExpressSlotsUsed + 1) <= availableSlots);
-    }
-
-    if(existing.psu?.details?.wattage && existingTDP) {
-        const psuWattage = Number(existing.psu.details.wattage) || 0;
-
-        if (psuWattage > 0) {
-            const budget = psuWattage / 1.2;
-
-            const currentGpuTdp = Number(existing.cpu?.details?.tdp) || 0;
-            const baseWithoutGpu = existingTDP - currentGpuTdp;
-
-            filteredGPUs = filteredGPUs.filter(cpu => {
-                const gpuTdp = Number(cpu.tdp) || 0;
-                return (baseWithoutGpu + gpuTdp) <= budget;
-            });
-        }
-    }
-
-    return filteredGPUs;
-}
-
-async function getCompatibleMemory(db: Database, existing: any, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'memory')];
-
-    if (existing.motherboard) {
-        conditions.push(
-            eq(memoryTable.type, existing.motherboard.details.ramType)
-        );
-    }
-
-    const memory = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            memoryType: memoryTable.type,
-            speed: memoryTable.speed,
-            capacity: memoryTable.capacity,
-            modules: memoryTable.modules,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            memoryTable,
-            eq(componentsTable.id, memoryTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    if (existing.motherboard) {
-        const existingModules = existing.memory.reduce((sum: number, m: any) =>
-            sum + Number(m.details.modules), 0
-        );
-        const existingCapacity = existing.memory.reduce((sum: number, m: any) =>
-            sum + Number(m.details.capacity), 0
-        );
-        const maxSlots = Number(existing.motherboard.details.numRamSlots);
-        const maxCapacity = Number(existing.motherboard.details.maxRamCapacity);
-
-        return memory.filter(mem => {
-            const newModules = existingModules + Number(mem.modules);
-            const newCapacity = existingCapacity + Number(mem.capacity);
-            return newModules <= maxSlots && newCapacity <= maxCapacity;
-        });
-    }
-
-    return memory;
-}
-
-async function getCompatibleStorage(db: Database, existing: any, limit?: number, sortCondition?: any) {
-    const storage = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            storageType: storageTable.type,
-            capacity: storageTable.capacity,
-            formFactor: storageTable.formFactor,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            storageTable,
-            eq(componentsTable.id, storageTable.componentId
-            )
-        )
-        .where(
-            eq(componentsTable.type, 'storage')
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    if (existing.case?.details?.storageFormFactors) {
-        return storage.filter(stor => {
-            const caseStorageFormFactor = existing.case.details.storageFormFactors.find(
-                (sf: any) => sf.formFactor === stor.formFactor
-            );
-
-            if (!caseStorageFormFactor) return false;
-
-            const usedSlots = existing.storage
-                .filter((s: any) => s.details.formFactor === stor.formFactor)
-                .reduce((sum: number, s: any) => sum + s.quantity, 0);
-
-            return usedSlots < Number(caseStorageFormFactor.numSlots);
-        });
-    }
-
-    return storage;
-}
-
-async function getCompatibleCases(db: Database, existing: any, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'case')];
-
-    if (existing.gpu) {
-        conditions.push(
-            sql`${pcCasesTable.gpuMaxLength} >= ${existing.gpu.details.length}`
-        );
-    }
-
-    if (existing.cooler) {
-        conditions.push(
-            sql`${pcCasesTable.coolerMaxHeight} >= ${existing.cooler.details.height}`
-        );
-    }
-
-    const cases = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            coolerMaxHeight: pcCasesTable.coolerMaxHeight,
-            gpuMaxLength: pcCasesTable.gpuMaxLength,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            pcCasesTable,
-            eq(componentsTable.id, pcCasesTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions)
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    if(cases.length === 0) return [];
-
-    const caseIds = cases.map(c => c.id);
-
-    const [allStorageFF, allPsFF, allMoboFF] = await Promise.all([
-        db.select().from(caseStorageFormFactorsTable)
-            .where(
-                inArray(caseStorageFormFactorsTable.caseId, caseIds)
-            ),
-        db.select().from(casePsFormFactorsTable)
-            .where(
-                inArray(casePsFormFactorsTable.caseId, caseIds)
-            ),
-        db.select().from(caseMoboFormFactorsTable)
-            .where(
-                inArray(caseMoboFormFactorsTable.caseId, caseIds)
-            )
-    ]);
-
-    const storageByCase = allStorageFF.reduce((acc, ff) => {
-        if (!acc[ff.caseId]) acc[ff.caseId] = [];
-        acc[ff.caseId].push(ff);
-        return acc;
-    }, {} as Record<number, any[]>);
-
-    const psByCase = allPsFF.reduce((acc, ff) => {
-        if (!acc[ff.caseId]) acc[ff.caseId] = [];
-        acc[ff.caseId].push(ff);
-        return acc;
-    }, {} as Record<number, any[]>);
-
-    const moboByCase = allMoboFF.reduce((acc, ff) => {
-        if (!acc[ff.caseId]) acc[ff.caseId] = [];
-        acc[ff.caseId].push(ff);
-        return acc;
-    }, {} as Record<number, any[]>);
-
-    const casesWithDetails = cases.map(pcCase => ({
-        ...pcCase,
-        storageFormFactors: storageByCase[pcCase.id] || [],
-        psFormFactors: psByCase[pcCase.id] || [],
-        moboFormFactors: moboByCase[pcCase.id] || []
-    }));
-
-    let filteredCases = casesWithDetails;
-
-    if (existing.motherboard) {
-        filteredCases = filteredCases.filter(pcCase =>
-            pcCase.moboFormFactors.some((f: any) => f.formFactor === existing.motherboard.details.formFactor)
-        );
-    }
-
-    if (existing.psu) {
-        filteredCases = filteredCases.filter(pcCase =>
-            pcCase.psFormFactors.some((f: any) => f.formFactor === existing.psu.details.formFactor)
-        );
-    }
-
-    if (existing.storage.length > 0) {
-        filteredCases = filteredCases.filter(pcCase => {
-            return existing.storage.every((stor: any) => {
-                const storageFF = pcCase.storageFormFactors.find(
-                    (sf: any) => sf.formFactor === stor.details.formFactor
-                );
-                if (!storageFF) return false;
-
-                const usedSlots = existing.storage
-                    .filter((s: any) => s.details.formFactor === stor.details.formFactor)
-                    .reduce((sum: number, s: any) => sum + s.quantity, 0);;
-
-                return usedSlots <= Number(storageFF.numSlots);
-            });
-        });
-    }
-
-    return filteredCases;
-}
-
-async function getCompatiblePSUs(db: Database, existing: any, existingTDP: number, limit?: number, sortCondition?: any) {
-    const conditions = [eq(componentsTable.type, 'power_supply')];
-
-    const minWattage = existingTDP * 1.2;
-    conditions.push(
-        sql`${powerSupplyTable.wattage} >= ${minWattage}`
-    );
-
-    const psus = await db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            psuType: powerSupplyTable.type,
-            wattage: powerSupplyTable.wattage,
-            formFactor: powerSupplyTable.formFactor,
-        })
-        .from(componentsTable)
-        .innerJoin(
-            powerSupplyTable,
-            eq(componentsTable.id, powerSupplyTable.componentId)
-        )
-        .where(
-            and(
-                ...conditions
-            )
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    if (existing.case?.details?.psFormFactors) {
-        const casePSFormFactors = existing.case.details.psFormFactors.map((f: any) => f.formFactor);
-        return psus.filter(psu => casePSFormFactors.includes(psu.formFactor));
-    }
-
-    return psus;
-}
-
-async function getCompatiblePCIeComponents(db: Database, existing: any, componentType: string, pciExpressSlotsUsed: number, limit?: number, sortCondition?: any) {
-    let table: any;
-    let selectFields: any = {
-        id: componentsTable.id,
-        name: componentsTable.name,
-        brand: componentsTable.brand,
-        price: componentsTable.price,
-        imgUrl: componentsTable.imgUrl,
-        type: componentsTable.type,
-    };
-
-    switch (componentType) {
-        case 'network_card':
-            table = networkCardsTable;
-            selectFields = {
-                ...selectFields,
-                numPorts: networkCardsTable.numPorts,
-                speed: networkCardsTable.speed,
-                interface: networkCardsTable.interface,
-            };
-            break;
-        case 'network_adapter':
-            table = networkAdaptersTable;
-            selectFields = {
-                ...selectFields,
-                wifiVersion: networkAdaptersTable.wifiVersion,
-                interface: networkAdaptersTable.interface,
-                numAntennas: networkAdaptersTable.numAntennas,
-            };
-            break;
-        case 'sound_card':
-            table = soundCardsTable;
-            selectFields = {
-                ...selectFields,
-                sampleRate: soundCardsTable.sampleRate,
-                bitDepth: soundCardsTable.bitDepth,
-                chipset: soundCardsTable.chipset,
-                interface: soundCardsTable.interface,
-                channel: soundCardsTable.channel,
-            };
-            break;
-        case 'memory_card':
-            table = memoryCardsTable;
-            selectFields = {
-                ...selectFields,
-                numSlots: memoryCardsTable.numSlots,
-                interface: memoryCardsTable.interface,
-            };
-            break;
-        default:
-            return [];
-    }
-
-    const components = await db
-        .select(selectFields)
-        .from(componentsTable)
-        .innerJoin(
-            table,
-            eq(componentsTable.id, table.componentId)
-        )
-        .where(
-            eq(componentsTable.type, componentType)
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-
-    if (existing.motherboard) {
-        const availableSlots = Number(existing.motherboard.details.pciExpressSlots);
-        return components.filter(() => (pciExpressSlotsUsed + 1) <= availableSlots);
-    }
-
-    return components;
-}
-
-async function getCompatibleOpticalDrives(db: Database, existing: any, limit?: number, sortCondition?: any) {
-    if (existing.opticalDrives && existing.opticalDrives.length > 0) {
-        return [];
-    }
-
-    return db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            driveType: opticalDrivesTable.type,
-            formFactor: opticalDrivesTable.formFactor,
-            interface: opticalDrivesTable.interface,
-            writeSpeed: opticalDrivesTable.writeSpeed,
-            readSpeed: opticalDrivesTable.readSpeed
-        })
-        .from(componentsTable)
-        .innerJoin(
-            opticalDrivesTable,
-            eq(componentsTable.id, opticalDrivesTable.componentId)
-        )
-        .where(
-            eq(componentsTable.type, 'optical_drive')
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-}
-async function getCompatibleCables(db: Database, limit?: number, sortCondition?: any) {
-    return db
-        .select({
-            id: componentsTable.id,
-            name: componentsTable.name,
-            brand: componentsTable.brand,
-            price: componentsTable.price,
-            imgUrl: componentsTable.imgUrl,
-            type: componentsTable.type,
-            lengthCm: cablesTable.lengthCm,
-            cableType: cablesTable.type
-        })
-        .from(componentsTable)
-        .innerJoin(
-            cablesTable,
-            eq(componentsTable.id, cablesTable.componentId)
-        )
-        .where(
-            eq(componentsTable.type, 'cables')
-        )
-        .orderBy(
-            sortCondition
-        )
-        .limit(limit || 100);
-}
-
-export async function addComponentToBuild(db: Database, userId: number, buildId: number, componentId: number) {
-    return db.transaction(async (tx) => {
-        const [build] = await tx
-            .select()
-            .from(buildsTable)
-            .where(
-                and(
-                    eq(buildsTable.id, buildId),
-                    eq(buildsTable.userId, userId)
-                )
-            )
-            .limit(1);
-
-        if(!build || build.isApproved) return null;
-
-        await tx
-            .insert(buildComponentsTable)
-            .values({
-                buildId,
-                componentId,
-                numComponents: 1
-            })
-            .onConflictDoUpdate({
-                target: [buildComponentsTable.buildId, buildComponentsTable.componentId],
-                set: {
-                    numComponents: sql`${buildComponentsTable.numComponents} + 1`
-                }
-            });
-
-        const buildComponents = await tx
-            .select({
-                price:  componentsTable.price,
-                quantity: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .innerJoin(
-                componentsTable,
-                eq(buildComponentsTable.componentId, componentsTable.id)
-            )
-            .where(
-                eq(buildComponentsTable.buildId, buildId)
-            );
-
-        const totalPrice = buildComponents.reduce((sum, c) =>
-            sum + (Number(c.price) * c.quantity), 0
-        );
-
-        await tx
-            .update(buildsTable)
-            .set({
-                totalPrice: totalPrice.toFixed(2)
-            })
-            .where(
-                eq(buildsTable.id, buildId)
-            );
-
-        return buildId;
-    })
-}
-
-export async function removeComponentFromBuild(db: Database, userId: number, buildId: number, componentId: number) {
-    return db.transaction(async (tx) => {
-        const [build] = await tx
-            .select()
-            .from(buildsTable)
-            .where(
-                and(
-                    eq(buildsTable.id, buildId),
-                    eq(buildsTable.userId, userId)
-                )
-            )
-            .limit(1);
-
-        if(!build || build.isApproved) return null;
-
-        const [existing] = await tx
-            .select({
-                quantity: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .where(
-                and(
-                    eq(buildComponentsTable.buildId, buildId),
-                    eq(buildComponentsTable.componentId, componentId)
-                )
-            )
-            .limit(1);
-
-        if (!existing) return null;
-
-        if (existing.quantity > 1) {
-            await tx
-                .update(buildComponentsTable)
-                .set({
-                    numComponents: sql`${buildComponentsTable.numComponents} - 1`
-                })
-                .where(
-                    and(
-                        eq(buildComponentsTable.buildId, buildId),
-                        eq(buildComponentsTable.componentId, componentId)
-                    )
-                );
-        } else {
-            await tx
-                .delete(buildComponentsTable)
-                .where(
-                    and(
-                        eq(buildComponentsTable.buildId, buildId),
-                        eq(buildComponentsTable.componentId, componentId)
-                    )
-                );
-        }
-
-        const buildComponents = await tx
-            .select({
-                price:  componentsTable.price,
-                quantity: buildComponentsTable.numComponents
-            })
-            .from(buildComponentsTable)
-            .innerJoin(
-                componentsTable,
-                eq(buildComponentsTable.componentId, componentsTable.id)
-            )
-            .where(
-                eq(buildComponentsTable.buildId, buildId)
-            );
-
-        const totalPrice = buildComponents.reduce((sum, c) =>
-            sum + (Number(c.price) * c.quantity), 0
-        );
-
-        await tx
-            .update(buildsTable)
-            .set({
-                totalPrice: totalPrice.toFixed(2)
-            })
-            .where(
-                eq(buildsTable.id, buildId)
-            );
-
-        return componentId;
-    })
-}
Index: tabase/drizzle/queries/index.ts
===================================================================
--- database/drizzle/queries/index.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,3 +1,0 @@
-export * from "./users";
-export * from "./builds";
-export * from "./components";
Index: database/drizzle/queries/todos.ts
===================================================================
--- database/drizzle/queries/todos.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ database/drizzle/queries/todos.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,10 @@
+import type { dbSqlite } from "../db";
+import { todoTable } from "../schema/todos";
+
+export function insertTodo(db: ReturnType<typeof dbSqlite>, text: string) {
+  return db.insert(todoTable).values({ text });
+}
+
+export function getAllTodos(db: ReturnType<typeof dbSqlite>) {
+  return db.select().from(todoTable).all();
+}
Index: tabase/drizzle/queries/users.ts
===================================================================
--- database/drizzle/queries/users.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,93 +1,0 @@
-import type { Database } from "../db";
-import {adminsTable, suggestionsTable, usersTable} from "../schema";
-import {desc, eq} from "drizzle-orm";
-
-export async function createUser(db: Database, username: string, email: string, passwordHash: string) {
-    const [newUser] = await db
-        .insert(usersTable)
-        .values({
-            username: username,
-            email: email,
-            passwordHash: passwordHash,
-        })
-        .returning({
-            id: usersTable.id,
-        });
-
-    return newUser?.id ?? null;
-}
-
-export async function getUserProfile(db: Database, userId: number) {
-    const [user] = await db
-        .select({
-            username: usersTable.username,
-            email: usersTable.email,
-        })
-        .from(usersTable)
-        .where(
-            eq(usersTable.id, userId)
-        )
-        .limit(1);
-
-    return user ?? null;
-}
-
-export async function isAdmin(db: Database, userId: number) {
-    const [admin] = await db
-        .selectDistinct()
-        .from(adminsTable)
-        .where(
-            eq(adminsTable.userId, userId)
-        )
-        .limit(1);
-
-    return !!admin;
-}
-
-export async function getComponentSuggestions(db: Database) {
-    const suggestionsList = await db
-        .select()
-        .from(suggestionsTable)
-        .where(
-            eq(suggestionsTable.status, 'pending')
-        )
-        .orderBy(
-            desc(suggestionsTable.id)
-        )
-
-    return suggestionsList;
-}
-
-export async function setComponentSuggestionStatus(db: Database, suggestionId: number, adminId: number, status: string, adminComment: string) {
-    const [result] = await db
-        .update(suggestionsTable)
-        .set({
-            adminId: adminId,
-            status: status,
-            adminComment: adminComment
-        })
-        .where(
-            eq(suggestionsTable.id, suggestionId)
-        )
-        .returning({
-            id: suggestionsTable.id
-        });
-
-    return result?.id ?? null;
-}
-
-export async function addNewComponentSuggestion(db: Database, userId: number, link: string, description: string, componentType: string) {
-    const [newSuggestion] = await db
-        .insert(suggestionsTable)
-        .values({
-            userId: userId,
-            link: link,
-            description: description,
-            componentType: componentType
-        })
-        .returning({
-            id: suggestionsTable.id
-        });
-
-    return newSuggestion?.id ?? null;
-}
Index: tabase/drizzle/schema/builds.ts
===================================================================
--- database/drizzle/schema/builds.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,92 +1,0 @@
-import {pgTable, serial, integer, text, numeric, boolean, date, primaryKey, check, unique} from "drizzle-orm/pg-core";
-import { usersTable } from "./users";
-import { componentsTable } from "./components";
-import {sql} from "drizzle-orm";
-
-export const buildsTable = pgTable("build", {
-    id: serial("id").primaryKey(),
-    userId: integer("user_id")
-        .notNull()
-        .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    name: text("name").notNull(),
-    createdAt: date("created_at").notNull(),
-    description: text("description"),
-    totalPrice: numeric("total_price").notNull(),
-    isApproved: boolean("is_approved").notNull(),
-});
-
-export const buildComponentsTable = pgTable("build_component", {
-        buildId: integer("build_id")
-            .notNull()
-            .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        componentId: integer("component_id")
-            .notNull()
-            .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        numComponents: integer("num_components")
-            .notNull()
-            .default(1),
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.buildId, t.componentId] }),
-    }),
-);
-
-export const favoriteBuildsTable = pgTable("favorite_build", {
-        buildId: integer("build_id")
-            .notNull()
-            .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        userId: integer("user_id")
-            .notNull()
-            .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.buildId, t.userId] }),
-    }),
-);
-
-export const ratingBuildsTable = pgTable("rating_build", {
-        buildId: integer("build_id")
-            .notNull()
-            .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        userId: integer("user_id")
-            .notNull()
-            .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        value: numeric("value", { mode: "number" }).notNull(),
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.buildId, t.userId] }),
-        checkValue: check("check_value", sql`${t.value} BETWEEN 1 AND 5`),
-    }),
-);
-
-export const reviewsTable = pgTable("review", {
-        id: serial("id").primaryKey(),
-
-        buildId: integer("build_id")
-            .notNull()
-            .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        userId: integer("user_id")
-            .notNull()
-            .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-        content: text("content").notNull(),
-        createdAt: date("created_at").notNull()
-    },
-    (t) => ({
-        uniqueUserBuild: unique().on(t.buildId, t.userId),
-    }),
-);
-
-export type buildItem = typeof buildsTable.$inferSelect;
-export type buildInsert = typeof buildsTable.$inferInsert;
-
-export type buildComponentItem = typeof buildComponentsTable.$inferSelect;
-export type buildComponentInsert = typeof buildComponentsTable.$inferInsert;
-
-export type favoriteBuildItem = typeof favoriteBuildsTable.$inferSelect;
-export type favoriteBuildInsert = typeof favoriteBuildsTable.$inferInsert;
-
-export type ratingBuildItem = typeof ratingBuildsTable.$inferSelect;
-export type ratingBuildInsert = typeof ratingBuildsTable.$inferInsert;
-
-export type reviewItem = typeof reviewsTable.$inferSelect;
-export type reviewInsert = typeof reviewsTable.$inferInsert;
Index: tabase/drizzle/schema/components.ts
===================================================================
--- database/drizzle/schema/components.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,262 +1,0 @@
-import {pgTable, serial, integer, text, numeric, boolean, date, primaryKey, check} from "drizzle-orm/pg-core";
-import {sql} from "drizzle-orm";
-
-export const componentsTable = pgTable("components", {
-    id: serial("id").primaryKey(),
-    name: text("name").notNull(),
-    brand: text("brand").notNull(),
-    price: numeric("price").notNull(),
-    imgUrl: text("img_url"),
-    type: text("type").notNull()
-    },
-    (t) => ({
-        checkType: check("check_type", sql`${t.type} in 
-      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card')`)
-    }),
-);
-
-// Base Components
-export const CPUTable = pgTable("cpu", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    socket: text("socket").notNull(),
-    cores: integer("cores").notNull(),
-    threads: integer("threads").notNull(),
-    baseClock: numeric("base_clock").notNull(),
-    boostClock: numeric("boost_clock"),
-    tdp: numeric("tdp").notNull()
-});
-
-export const GPUTable = pgTable("gpu", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    vram: numeric("vram").notNull(),
-    tdp: numeric("tdp").notNull(),
-    baseClock: numeric("base_clock"),
-    boostClock: numeric("boost_clock"),
-    chipset: text("chipset").notNull(),
-    length: numeric("length").notNull()
-});
-
-export const memoryTable = pgTable("memory", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    type: text("type").notNull(),
-    speed: numeric("speed").notNull(),
-    capacity: numeric("capacity").notNull(),
-    modules: integer("modules").notNull()
-});
-
-export const powerSupplyTable = pgTable("power_supply", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    type: text("type").notNull(),
-    wattage: numeric("wattage").notNull(),
-    formFactor: text("form_factor").notNull()
-});
-
-export const pcCasesTable = pgTable("pc_case", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    coolerMaxHeight: numeric("cooler_max_height").notNull(),
-    gpuMaxLength: numeric("gpu_max_length").notNull()
-});
-
-// Case multi-values
-export const caseStorageFormFactorsTable = pgTable("case_storage_form_factors", {
-        caseId: integer("case_id")
-            .notNull()
-            .references(() => pcCasesTable.componentId, {onDelete: "cascade", onUpdate: "cascade" }),
-        formFactor: text("form_factor").notNull(),
-        numSlots: integer("num_slots").notNull()
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.caseId, t.formFactor] })
-    }),
-);
-
-export const casePsFormFactorsTable = pgTable( "case_ps_form_factors", {
-        caseId: integer("case_id")
-            .notNull()
-            .references(() => pcCasesTable.componentId, { onDelete: "cascade", onUpdate: "cascade"}),
-        formFactor: text("form_factor").notNull()
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.caseId, t.formFactor] })
-    }),
-);
-
-export const caseMoboFormFactorsTable = pgTable("case_mobo_form_factors", {
-        caseId: integer("case_id")
-            .notNull()
-            .references(() => pcCasesTable.componentId, { onDelete: "cascade", onUpdate: "cascade"}),
-        formFactor: text("form_factor").notNull()
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.caseId, t.formFactor] })
-    }),
-);
-
-export const coolersTable = pgTable("cooler", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    type: text("type").notNull(),
-    height: numeric("height").notNull(),
-    maxTdpSupported: numeric("max_tdp_supported").notNull()
-});
-
-// Cooler multi-values
-export const coolerCPUSocketsTable = pgTable("cooler_cpu_sockets", {
-        coolerId: integer("cooler_id")
-            .notNull()
-            .references(() => coolersTable.componentId, { onDelete: "cascade", onUpdate: "cascade" }),
-        socket: text("socket").notNull()
-    },
-    (t) => ({
-        pk: primaryKey({ columns: [t.coolerId, t.socket] })
-    })
-);
-
-export const motherboardsTable = pgTable("motherboard", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-
-    socket: text("socket").notNull(),
-    chipset: text("chipset").notNull(),
-    formFactor: text("form_factor").notNull(),
-    ramType: text("ram_type").notNull(),
-    numRamSlots: integer("num_ram_slots").notNull(),
-    maxRamCapacity: numeric("max_ram_capacity").notNull(),
-    pciExpressSlots: numeric("pci_express_slots").notNull()
-});
-
-export const storageTable = pgTable("storage", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    type: text("type").notNull(),
-    capacity: numeric("capacity").notNull(),
-    formFactor: text("form_factor").notNull()
-});
-
-// Other Components
-export const memoryCardsTable = pgTable("memory_card", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    numSlots: integer("num_slots").notNull(),
-    interface: text("interface").notNull()
-});
-
-export const opticalDrivesTable = pgTable("optical_drive", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    formFactor: text("form_factor").notNull(),
-    type: text("type").notNull(),
-    interface: text("interface").notNull(),
-    writeSpeed: numeric("write_speed").notNull(),
-    readSpeed: numeric("read_speed").notNull()
-});
-
-export const soundCardsTable = pgTable("sound_card", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    sampleRate: numeric("sample_rate").notNull(),
-    bitDepth: numeric("bit_depth").notNull(),
-    chipset: text("chipset").notNull(),
-    interface: text("interface").notNull(),
-    channel: text("channel").notNull()
-});
-
-export const cablesTable = pgTable("cables", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    lengthCm: numeric("length_cm").notNull(),
-    type: text("type").notNull()
-});
-
-export const networkAdaptersTable = pgTable("network_adapter", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    wifiVersion: text("wifi_version").notNull(),
-    interface: text("interface").notNull(),
-    numAntennas: integer("num_antennas").notNull()
-});
-
-export const networkCardsTable = pgTable("network_card", {
-    componentId: integer("component_id")
-        .primaryKey()
-        .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
-    numPorts: integer("num_ports").notNull(),
-    speed: numeric("speed").notNull(),
-    interface: text("interface").notNull()
-});
-
-export type componentItem = typeof componentsTable.$inferSelect;
-export type componentInsert = typeof componentsTable.$inferInsert;
-
-export type cpuItem = typeof CPUTable.$inferSelect;
-export type cpuInsert = typeof CPUTable.$inferInsert;
-
-export type gpuItem = typeof GPUTable.$inferSelect;
-export type gpuInsert = typeof GPUTable.$inferInsert;
-
-export type memoryItem = typeof memoryTable.$inferSelect;
-export type memoryInsert = typeof memoryTable.$inferInsert;
-
-export type powerSupplyItem = typeof powerSupplyTable.$inferSelect;
-export type powerSupplyInsert = typeof powerSupplyTable.$inferInsert;
-
-export type caseItem = typeof pcCasesTable.$inferSelect;
-export type caseInsert = typeof pcCasesTable.$inferInsert;
-
-export type caseStorageFormFactorsItem = typeof caseStorageFormFactorsTable.$inferSelect;
-export type caseStorageFormFactorsInsert = typeof caseStorageFormFactorsTable.$inferInsert;
-
-export type casePsFormFactorsItem = typeof casePsFormFactorsTable.$inferSelect;
-export type casePsFormFactorsInsert = typeof casePsFormFactorsTable.$inferInsert;
-
-export type caseMoboFormFactorsItem = typeof caseMoboFormFactorsTable.$inferSelect;
-export type caseMoboFormFactorsInsert = typeof caseMoboFormFactorsTable.$inferInsert;
-
-export type coolerItem = typeof coolersTable.$inferSelect;
-export type coolerInsert = typeof coolersTable.$inferInsert;
-
-export type coolerCPUSocketsItem = typeof coolerCPUSocketsTable.$inferSelect;
-export type coolerCPUSocketsInsert = typeof coolerCPUSocketsTable.$inferInsert;
-
-export type motherboardItem = typeof motherboardsTable.$inferSelect;
-export type motherboardInsert = typeof motherboardsTable.$inferInsert;
-
-export type storageItem = typeof storageTable.$inferSelect;
-export type storageInsert = typeof storageTable.$inferInsert
-
-export type memoryCardItem = typeof memoryCardsTable.$inferSelect;
-export type memoryCardInsert = typeof memoryCardsTable.$inferInsert;
-
-export type opticalDriveItem = typeof opticalDrivesTable.$inferSelect;
-export type opticalDriveInsert = typeof opticalDrivesTable.$inferInsert;
-
-export type soundCardItem = typeof soundCardsTable.$inferSelect;
-export type soundCardInsert = typeof soundCardsTable.$inferInsert;
-
-export type cablesItem = typeof cablesTable.$inferSelect;
-export type cablesInsert = typeof cablesTable.$inferInsert;
-
-export type networkAdapterItem = typeof networkAdaptersTable.$inferSelect;
-export type networkAdapterInsert = typeof networkAdaptersTable.$inferInsert;
-
-export type networkCardItem = typeof networkCardsTable.$inferSelect;
-export type networkCardInsert = typeof networkCardsTable.$inferInsert;
-
Index: tabase/drizzle/schema/index.ts
===================================================================
--- database/drizzle/schema/index.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,4 +1,0 @@
-export * from "./builds";
-export * from "./components";
-export * from "./relations";
-export * from "./users";
Index: tabase/drizzle/schema/relations.ts
===================================================================
--- database/drizzle/schema/relations.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,315 +1,0 @@
-import { relations } from "drizzle-orm";
-
-import {
-    componentsTable,
-    CPUTable,
-    GPUTable,
-    memoryTable,
-    powerSupplyTable,
-    pcCasesTable,
-    caseStorageFormFactorsTable,
-    casePsFormFactorsTable,
-    caseMoboFormFactorsTable,
-    coolersTable,
-    coolerCPUSocketsTable,
-    motherboardsTable,
-    storageTable,
-    memoryCardsTable,
-    opticalDrivesTable,
-    soundCardsTable,
-    cablesTable,
-    networkAdaptersTable,
-    networkCardsTable,
-
-} from "./components";
-
-import {
-    buildsTable,
-    buildComponentsTable,
-    favoriteBuildsTable,
-    ratingBuildsTable,
-    reviewsTable
-} from "./builds"
-
-import {
-    usersTable,
-    adminsTable,
-    suggestionsTable
-} from "./users";
-
-export const usersRelations = relations(usersTable, ({ many, one }) => ({
-    builds: many(buildsTable),
-    reviews: many(reviewsTable),
-    favorites: many(favoriteBuildsTable),
-    ratings: many(ratingBuildsTable),
-    suggestions: many(suggestionsTable),
-    adminProfile: one(adminsTable, {
-        fields: [usersTable.id],
-        references: [adminsTable.userId],
-    })
-}));
-
-export const adminsRelations = relations(adminsTable, ({ one, many }) => ({
-    user: one(usersTable, {
-        fields: [adminsTable.userId],
-        references: [usersTable.id],
-    }),
-    moderatedSuggestions: many(suggestionsTable),
-}));
-
-export const suggestionsRelations = relations(suggestionsTable, ({ one }) => ({
-    author: one(usersTable, {
-        fields: [suggestionsTable.userId],
-        references: [usersTable.id],
-    }),
-    moderator: one(adminsTable, {
-        fields: [suggestionsTable.adminId],
-        references: [adminsTable.userId],
-    }),
-}));
-
-export const buildRelations = relations(buildsTable, ({ one, many }) => ({
-    owner: one(usersTable, {
-        fields: [buildsTable.userId],
-        references: [usersTable.id],
-    }),
-    buildComponents: many(buildComponentsTable),
-    favorites: many(favoriteBuildsTable),
-    ratings: many(ratingBuildsTable),
-    reviews: many(reviewsTable),
-}));
-
-export const buildComponentRelations = relations(buildComponentsTable, ({ one }) => ({
-    build: one(buildsTable, {
-        fields: [buildComponentsTable.buildId],
-        references: [buildsTable.id],
-    }),
-    component: one(componentsTable, {
-        fields: [buildComponentsTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const favoriteBuildRelations = relations(favoriteBuildsTable, ({ one }) => ({
-    user: one(usersTable, {
-        fields: [favoriteBuildsTable.userId],
-        references: [usersTable.id],
-    }),
-    build: one(buildsTable, {
-        fields: [favoriteBuildsTable.buildId],
-        references: [buildsTable.id],
-    }),
-}));
-
-export const ratingBuildRelations = relations(ratingBuildsTable, ({ one }) => ({
-    user: one(usersTable, {
-        fields: [ratingBuildsTable.userId],
-        references: [usersTable.id],
-    }),
-    build: one(buildsTable, {
-        fields: [ratingBuildsTable.buildId],
-        references: [buildsTable.id],
-    }),
-}));
-
-export const reviewRelations = relations(reviewsTable, ({ one }) => ({
-    author: one(usersTable, {
-        fields: [reviewsTable.userId],
-        references: [usersTable.id],
-    }),
-    build: one(buildsTable, {
-        fields: [reviewsTable.buildId],
-        references: [buildsTable.id],
-    }),
-}));
-
-export const componentsRelations = relations(componentsTable, ({ many, one }) => ({
-    buildComponents: many(buildComponentsTable),
-
-    cpu: one(CPUTable, {
-        fields: [componentsTable.id],
-        references: [CPUTable.componentId]
-    }),
-    gpu: one(GPUTable, {
-        fields: [componentsTable.id],
-        references: [GPUTable.componentId]
-    }),
-    memory: one(memoryTable, {
-        fields: [componentsTable.id],
-        references: [memoryTable.componentId]
-    }),
-    powerSupply: one(powerSupplyTable, {
-        fields: [componentsTable.id],
-        references: [powerSupplyTable.componentId]
-    }),
-    pcCase: one(pcCasesTable, {
-        fields: [componentsTable.id],
-        references: [pcCasesTable.componentId]
-    }),
-    cooler: one(coolersTable, {
-        fields: [componentsTable.id],
-        references: [coolersTable.componentId]
-    }),
-    motherboard: one(motherboardsTable, {
-        fields: [componentsTable.id],
-        references: [motherboardsTable.componentId]
-    }),
-    storage: one(storageTable, {
-        fields: [componentsTable.id],
-        references: [storageTable.componentId]
-    }),
-    memoryCard: one(memoryCardsTable, {
-        fields: [componentsTable.id],
-        references: [memoryCardsTable.componentId]
-    }),
-    opticalDrive: one(opticalDrivesTable, {
-        fields: [componentsTable.id],
-        references: [opticalDrivesTable.componentId]
-    }),
-    soundCard: one(soundCardsTable, {
-        fields: [componentsTable.id],
-        references: [soundCardsTable.componentId]
-    }),
-    cables: one(cablesTable, {
-        fields: [componentsTable.id],
-        references: [cablesTable.componentId]
-    }),
-    networkAdapter: one(networkAdaptersTable, {
-        fields: [componentsTable.id],
-        references: [networkAdaptersTable.componentId]
-    }),
-    networkCard: one(networkCardsTable, {
-        fields: [componentsTable.id],
-        references: [networkCardsTable.componentId]
-    }),
-}));
-
-export const cpuRelations = relations(CPUTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [CPUTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const gpuRelations = relations(GPUTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [GPUTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const memoryRelations = relations(memoryTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [memoryTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const powerSupplyRelations = relations(powerSupplyTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [powerSupplyTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const motherboardRelations = relations(motherboardsTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [motherboardsTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const storageRelations = relations(storageTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [storageTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const memoryCardRelations = relations(memoryCardsTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [memoryCardsTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const opticalDriveRelations = relations(opticalDrivesTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [opticalDrivesTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const cablesRelations = relations(cablesTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [cablesTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const networkAdapterRelations = relations(networkAdaptersTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [networkAdaptersTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const networkCardRelations = relations(networkCardsTable, ({ one }) => ({
-    component: one(componentsTable, {
-        fields: [networkCardsTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
-
-export const pcCaseRelations = relations(pcCasesTable, ({ one, many }) => ({
-    component: one(componentsTable, {
-        fields: [pcCasesTable.componentId],
-        references: [componentsTable.id],
-    }),
-    storageFormFactors: many(caseStorageFormFactorsTable),
-    psFormFactors: many(casePsFormFactorsTable),
-    moboFormFactors: many(caseMoboFormFactorsTable),
-}));
-
-export const caseStorageFormFactorsRelations = relations(caseStorageFormFactorsTable, ({ one }) => ({
-    pcCase: one(pcCasesTable, {
-        fields: [caseStorageFormFactorsTable.caseId],
-        references: [pcCasesTable.componentId],
-    }),
-}));
-
-export const casePsFormFactorsRelations = relations(casePsFormFactorsTable, ({ one }) => ({
-    pcCase: one(pcCasesTable, {
-        fields: [casePsFormFactorsTable.caseId],
-        references: [pcCasesTable.componentId],
-    }),
-}));
-
-export const caseMoboFormFactorsRelations = relations(caseMoboFormFactorsTable, ({ one }) => ({
-    pcCase: one(pcCasesTable, {
-        fields: [caseMoboFormFactorsTable.caseId],
-        references: [pcCasesTable.componentId],
-    }),
-}));
-
-export const coolerRelations = relations(coolersTable, ({ one, many }) => ({
-    component: one(componentsTable, {
-        fields: [coolersTable.componentId],
-        references: [componentsTable.id],
-    }),
-    cpuSockets: many(coolerCPUSocketsTable),
-}));
-
-export const coolerCpuSocketsRelations = relations(coolerCPUSocketsTable, ({ one }) => ({
-    cooler: one(coolersTable, {
-        fields: [coolerCPUSocketsTable.coolerId],
-        references: [coolersTable.componentId],
-    }),
-}));
-
-export const soundCardRelations = relations(soundCardsTable, ({ one, many }) => ({
-    component: one(componentsTable, {
-        fields: [soundCardsTable.componentId],
-        references: [componentsTable.id],
-    }),
-}));
Index: database/drizzle/schema/todos.ts
===================================================================
--- database/drizzle/schema/todos.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ database/drizzle/schema/todos.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,11 @@
+import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
+
+// Example of defining a schema in Drizzle ORM:
+export const todoTable = sqliteTable("todos", {
+  id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
+  text: text("text", { length: 50 }).notNull(),
+});
+
+// You can then infer the types for selecting and inserting
+export type TodoItem = typeof todoTable.$inferSelect;
+export type TodoInsert = typeof todoTable.$inferInsert;
Index: tabase/drizzle/schema/users.ts
===================================================================
--- database/drizzle/schema/users.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,46 +1,0 @@
-import {pgTable, serial, integer, text, numeric, boolean, date, primaryKey, check} from "drizzle-orm/pg-core";
-import {sql} from "drizzle-orm";
-
-export const usersTable = pgTable("users", {
-    id: serial("id").primaryKey(),
-    username: text("username").notNull().unique(),
-    passwordHash: text("password").notNull(),
-    email: text("email").notNull().unique()
-})
-
-export const adminsTable = pgTable("admins", {
-    userId: integer("user_id")
-        .primaryKey()
-        .references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' })
-})
-
-export const suggestionsTable = pgTable("suggestions", {
-    id: serial("id").primaryKey(),
-    userId: integer("user_id")
-        .notNull()
-        .references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }),
-    adminId: integer("admin_id")
-        .references(() => adminsTable.userId, { onDelete: 'set null', onUpdate: 'cascade' }),
-    link: text("link").notNull(),
-    adminComment: text("admin_comment"),
-    description: text("description"),
-    status: text("status")
-        .notNull()
-        .default("pending"),
-    componentType: text("component_type").notNull()
-    },
-    (t) => ({
-        checkStatus: check("check_status", sql`${t.status} in ('pending', 'approved', 'rejected')`),
-        checkType: check("check_type", sql`${t.componentType} in 
-      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card')`),
-    }),
-);
-
-export type userItem = typeof usersTable.$inferSelect;
-export type userInsert = typeof usersTable.$inferInsert;
-
-export type adminItem = typeof adminsTable.$inferSelect;
-export type adminInsert = typeof adminsTable.$inferInsert;
-
-export type suggestionItem = typeof suggestionsTable.$inferSelect;
-export type suggestionInsert = typeof suggestionsTable.$inferInsert;
Index: tabase/drizzle/util/componentFieldConfig.ts
===================================================================
--- database/drizzle/util/componentFieldConfig.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,109 +1,0 @@
-import {
-    cablesTable, caseMoboFormFactorsTable, casePsFormFactorsTable,
-    caseStorageFormFactorsTable, coolerCPUSocketsTable, coolersTable,
-    CPUTable,
-    GPUTable, memoryCardsTable,
-    memoryTable, motherboardsTable,
-    networkAdaptersTable,
-    networkCardsTable, opticalDrivesTable, pcCasesTable, powerSupplyTable,
-    soundCardsTable, storageTable
-} from "../schema";
-
-export type ComponentConfig<SelectType = any, InsertType = any> = {
-    table: any;
-    multiTables?: {
-        storageFormFactors?: typeof caseStorageFormFactorsTable;
-        psFormFactors?: typeof casePsFormFactorsTable;
-        moboFormFactors?: typeof caseMoboFormFactorsTable;
-        cpuSockets?: typeof coolerCPUSocketsTable;
-    }
-};
-
-export type ComponentType =
-    | 'cpu'
-    | 'gpu'
-    | 'memory'
-    | 'storage'
-    | 'power_supply'
-    | 'motherboard'
-    | 'case'
-    | 'cooler'
-    | 'memory_card'
-    | 'optical_drive'
-    | 'sound_card'
-    | 'cables'
-    | 'network_adapter'
-    | 'network_card';
-
-export const typeConfigMap: Record<ComponentType, ComponentConfig> = {
-    cpu: { table: CPUTable },
-    gpu: { table: GPUTable },
-    memory: { table: memoryTable },
-    storage: { table: storageTable },
-    power_supply: { table: powerSupplyTable },
-    motherboard: { table: motherboardsTable },
-    case: {
-        table: pcCasesTable,
-        multiTables: {
-            storageFormFactors: caseStorageFormFactorsTable,
-            psFormFactors: casePsFormFactorsTable,
-            moboFormFactors: caseMoboFormFactorsTable,
-        },
-    },
-    cooler: {
-        table: coolersTable,
-        multiTables: {
-            cpuSockets: coolerCPUSocketsTable,
-        },
-    },
-    memory_card: { table: memoryCardsTable },
-    optical_drive: { table: opticalDrivesTable },
-    sound_card: { table: soundCardsTable },
-    cables: { table: cablesTable },
-    network_adapter: { table: networkAdaptersTable },
-    network_card: { table: networkCardsTable },
-};
-
-export const requiredFields: Record<ComponentType, string[]> = {
-    cpu: ['socket', 'cores', 'threads', 'baseClock', 'boostClock', 'tdp'],
-    gpu: ['vram', 'baseClock', 'boostClock', 'tdp', 'chipset', 'length'],
-    memory: ['type', 'speed', 'capacity', 'modules'],
-    storage: ['type', 'capacity', 'formFactor'],
-    power_supply: ['type', 'wattage', 'formFactor'],
-    motherboard: ['socket', 'chipset', 'formFactor', 'ramType', 'numRamSlots', 'maxRamCapacity', 'pciExpressSlots'],
-    case: ['coolerMaxHeight', 'gpuMaxLength'],
-    cooler: ['type', 'height', 'maxTdpSupported'],
-    memory_card: ['numSlots', 'interface'],
-    optical_drive: ['formFactor', 'type', 'interface', 'writeSpeed', 'readSpeed'],
-    sound_card: ['sampleRate', 'bitDepth', 'chipset', 'interface', 'channel'],
-    cables: ['lengthCm', 'type'],
-    network_adapter: ['wifiVersion', 'interface', 'numAntennas'],
-    network_card: ['numPorts', 'speed', 'interface']
-};
-
-export function validateComponentSpecificData(type: string, specificData: any): boolean {
-    if (!(type in requiredFields)) {
-        return false;
-    }
-
-    const fields = requiredFields[type as ComponentType];
-
-    for (const field of fields) {
-        const value = specificData[field];
-        if (value === undefined || value === null || value === '') {
-            return false;
-        }
-    }
-
-    if (type === 'case') {
-        if (specificData.storageFormFactors && !Array.isArray(specificData.storageFormFactors)) return false;
-        if (specificData.psFormFactors && !Array.isArray(specificData.psFormFactors)) return false;
-        if (specificData.moboFormFactors && !Array.isArray(specificData.moboFormFactors)) return false;
-    }
-
-    if (type === 'cooler') {
-        if (specificData.cpuSockets && !Array.isArray(specificData.cpuSockets)) return false;
-    }
-
-    return true;
-}
Index: tabase/drizzle/util/reports.ts
===================================================================
--- database/drizzle/util/reports.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,40 +1,0 @@
-import 'dotenv/config';
-import { db } from '../db';
-import { sql } from 'drizzle-orm';
-
-async function main() {
-    console.log("Generating Reports . . .");
-
-    try {
-        const r1 = await db.execute(sql`SELECT * FROM get_report_top_components()`);
-        console.log('--- Top Performing Components ---');
-        console.table(r1.rows);
-
-        const r2 = await db.execute(sql`SELECT * FROM get_report_user_reputation_leaderboard()`);
-        console.log('--- User Reputation Leaderboard ---');
-        console.table(r2.rows);
-
-        const r3 = await db.execute(sql`SELECT * FROM get_report_price_to_performance()`);
-        console.log('--- Price-to-Performance Analysis ---');
-        console.table(r3.rows);
-
-        const r4 = await db.execute(sql`SELECT * FROM get_report_budget_tier_popularity()`);
-        console.log('--- Budget Tier Popularity ---');
-        console.table(r4.rows);
-
-        const r5 = await db.execute(sql`SELECT * FROM get_report_compatibility()`);
-        console.log('--- Component Compatibility ---');
-        console.table(r5.rows);
-
-        const r6 = await db.execute(sql`SELECT * FROM get_report_storage_optimization()`);
-        console.log('--- Storage Optimization ---');
-        console.table(r6.rows);
-
-        process.exit(0);
-    } catch (e) {
-        console.error(e);
-        process.exit(1);
-    }
-}
-
-main();
Index: tabase/drizzle/util/seed.ts
===================================================================
--- database/drizzle/util/seed.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,1445 +1,0 @@
-import "dotenv/config";
-import pg from 'pg';
-
-const dataSQL = `
-SET search_path TO public;
-
-TRUNCATE TABLE
-suggestions,
-cooler_cpu_sockets,
-case_mobo_form_factors,
-case_ps_form_factors,
-case_storage_form_factors,
-build_component,
-favorite_build,
-rating_build,
-review,
-build,
-admins,
-users,
-network_card,
-network_adapter,
-cables,
-sound_card,
-optical_drive,
-memory_card,
-storage,
-motherboard,
-cooler,
-pc_case,
-power_supply,
-memory,
-gpu,
-cpu,
-components
-RESTART IDENTITY CASCADE;
-
-INSERT INTO users (username, password, email) VALUES
-('tome', 'tg', 'tome.gjorgiev@gmail.com'),
-('mihail', 'mn', 'mihail.naumov@gmail.com'),
-('stefan', 'sv', 'stefan.velkovski@gmail.com'),
-('admin', 'admin', 'admin@gmail.com'),
-('pc_wizard', 'pw', 'wizard@gmail.com'),
-('budget_king', 'bk', 'budget@gmail.com'),
-('rgb_lover', 'rgb', 'rgblover@gmail.com'),
-('streamer_pro', 'sp', 'streamer@gmail.com'),
-('office_guy', 'og', 'office@gmail.com'),
-('linux_fan', 'lf', 'linux@gmail.com'),
-('first_timer', 'ft', 'noob@gmail.com');
-
-INSERT INTO admins (user_id) VALUES (4);
-
-INSERT INTO components (name, brand, price, type, img_url) VALUES
-('Air Cooler', 'Noctua', 69.99, 'cooler', 'https://cdn.brandfetch.io/idSeoCDyH9/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('B550 Motherboard', 'ASUS', 149.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('1TB NVMe SSD', 'Samsung', 129.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Sound Card', 'Creative', 59.99, 'sound_card', 'https://cdn.brandfetch.io/idkZSfybrG/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Network Card', 'Intel', 39.99, 'network_card', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Network Adapter', 'TP-Link', 29.99, 'network_adapter', 'https://cdn.brandfetch.io/idfUqCiOVX/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Optical Drive', 'LG', 19.99, 'optical_drive', 'https://cdn.brandfetch.io/idEI6u48uh/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Storage Card', 'SanDisk', 15.99, 'memory_card', 'https://cdn.brandfetch.io/idM3tf3Iq8/w/800/h/800/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Cables Pack', 'Corsair', 9.99, 'cables', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-
--- CPUS
-('Ryzen 5 5600X', 'AMD', 199.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-5600.png'),
-('Ryzen 5 7600', 'AMD', 229.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-7600.png'),
-('Ryzen 7 7800X3D', 'AMD', 399.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-7-7800x3d.png'),
-('Ryzen 9 7950X', 'AMD', 599.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-9-7950x.png'),
-('Core i3-13100F', 'Intel', 119.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i3-13100.png'),
-('Core i5-13600K', 'Intel', 319.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-13600k.png'),
-('Core i7-14700K', 'Intel', 409.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i7-14700k.png'),
-('Core i9-14900KS', 'Intel', 689.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i9-14900ks.png'),
-('Ryzen 5 3600', 'AMD', 149.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-3600.png'),
-('Ryzen 7 3700X', 'AMD', 189.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-7-3700x.png'),
-('Ryzen 5 5600', 'AMD', 179.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-5600.png'),
-('Ryzen 7 5700X', 'AMD', 219.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-7-5700x.png'),
-('Ryzen 9 5900X', 'AMD', 349.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-9-5900x.png'),
-('Core i5-12400F', 'Intel', 159.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-12400.png'),
-('Core i7-12700K', 'Intel', 299.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i7-12700k.png'),
-('Core i5-10400F', 'Intel', 129.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-10400.png'),
-('Core i7-11700K', 'Intel', 249.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i7-11700k.png'),
-('Core i9-12900K', 'Intel', 449.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i9-12900k.png'),
-('Ryzen 3 3200G', 'AMD', 99.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-3-3200g.png'),
-('Ryzen 5 3600X', 'AMD', 199.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-3600x.png'),
-('Ryzen 9 3900X', 'AMD', 399.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-9-3900x.png'),
-('Ryzen 5 5600G', 'AMD', 159.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-5600g.png'),
-('Ryzen 7 5800X', 'AMD', 299.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-7-5800x.png'),
-('Core i3-10100F', 'Intel', 89.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i3-10100.png'),
-('Core i3-12100F', 'Intel', 109.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i3-12100.png'),
-('Core i5-11400F', 'Intel', 139.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-11400.png'),
-('Core i9-10900K', 'Intel', 399.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i9-10900k.png'),
-('Core i5-13400F', 'Intel', 199.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-13400.png'),
-
--- GPUS
-('RTX 3060', 'NVIDIA', 329.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3060.png'),
-('Radeon RX 6600', 'PowerColor', 199.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6600.png'),
-('Radeon RX 7600', 'Sapphire', 269.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7600.png'),
-('Radeon RX 7800 XT', 'XFX', 499.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7800-xt.png'),
-('Radeon RX 7900 XTX', 'Sapphire', 999.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7900-xtx.png'),
-('GeForce RTX 3050', 'MSI', 229.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3050.png'),
-('GeForce RTX 4060', 'Zotac', 299.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4060.png'),
-('GeForce RTX 4070 Super', 'ASUS', 599.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4070-super.png'),
-('GeForce RTX 4080 Super', 'Gigabyte', 999.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4080-super.png'),
-('GeForce RTX 4090', 'NVIDIA', 1599.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4090.png'),
-('GeForce RTX 3060 Ti', 'EVGA', 399.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3060-ti.png'),
-('GeForce RTX 3070', 'MSI', 499.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3070.png'),
-('GeForce RTX 3070 Ti', 'Gigabyte', 549.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3070-ti.png'),
-('GeForce RTX 3080', 'ASUS', 699.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3080.png'),
-('GeForce RTX 3090', 'NVIDIA', 1499.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3090.png'),
-('GeForce RTX 4060 Ti', 'Zotac', 399.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4060-ti.png'),
-('GeForce RTX 4070', 'MSI', 549.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4070.png'),
-('GeForce RTX 4070 Ti', 'Gigabyte', 749.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4070-ti.png'),
-('GeForce RTX 4080', 'ASUS', 1199.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4080.png'),
-('GeForce RTX 2060', 'EVGA', 299.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-2060.png'),
-('Radeon RX 6700 XT', 'Sapphire', 379.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6700-xt.png'),
-('Radeon RX 6800', 'PowerColor', 479.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6800.png'),
-('Radeon RX 6800 XT', 'XFX', 579.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6800-xt.png'),
-('Radeon RX 6900 XT', 'Sapphire', 699.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6900-xt.png'),
-('Radeon RX 7700 XT', 'XFX', 449.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7700-xt.png'),
-('Radeon RX 7900 XT', 'Sapphire', 849.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7900-xt.png'),
-('Radeon RX 6650 XT', 'PowerColor', 279.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6650-xt.png'),
-('Radeon RX 6750 XT', 'XFX', 329.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6750-xt.png'),
-('Radeon RX 5700 XT', 'Sapphire', 349.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-5700-xt.png'),
-('Radeon RX 5600 XT', 'PowerColor', 259.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-5600-xt.png'),
-('Arc A770', 'Intel', 349.99, 'gpu', 'https://static.hardwaredb.net/badges/arc-a770.png'),
-('Arc A750', 'Intel', 289.99, 'gpu', 'https://static.hardwaredb.net/badges/arc-a750.png'),
-('Arc A580', 'Intel', 179.99, 'gpu', 'https://static.hardwaredb.net/badges/arc-a580.png'),
-('Arc A380', 'Intel', 139.99, 'gpu', 'https://static.hardwaredb.net/badges/arc-a380.png'),
-('Arc A310', 'Intel', 99.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Arc B580', 'Intel', 249.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Arc B570', 'Intel', 219.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Arc A350M', 'Intel', 199.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Arc Pro A60', 'Intel', 449.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Arc Pro A40', 'Intel', 299.99, 'gpu', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- MOTHERBOARDS
-('B450 Tomahawk Max', 'MSI', 109.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('B550-A Pro', 'MSI', 139.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('X570 AORUS Elite', 'Gigabyte', 189.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('B550M TUF Gaming', 'ASUS', 119.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('X570 Unify', 'MSI', 279.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('B650 AORUS Elite AX', 'Gigabyte', 199.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('X670 Gaming Plus WiFi', 'MSI', 249.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('B650E TUF Gaming', 'ASUS', 229.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('X670E Taichi', 'ASRock', 399.99, 'motherboard', 'https://d1yjjnpx0p53s8.cloudfront.net/styles/logo-thumbnail/s3/0013/7800/brand.gif?itok=5s1HB6L_'),
-('B550 Phantom Gaming', 'ASRock', 129.99, 'motherboard', 'https://d1yjjnpx0p53s8.cloudfront.net/styles/logo-thumbnail/s3/0013/7800/brand.gif?itok=5s1HB6L_'),
-('B660M Pro RS', 'ASRock', 109.99, 'motherboard', 'https://d1yjjnpx0p53s8.cloudfront.net/styles/logo-thumbnail/s3/0013/7800/brand.gif?itok=5s1HB6L_'),
-('B660 Gaming X DDR4', 'Gigabyte', 139.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('H610M-E', 'ASUS', 89.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Z690 AORUS Pro', 'Gigabyte', 299.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('Z690 Edge WiFi DDR4', 'MSI', 259.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('B760M DS3H DDR4', 'Gigabyte', 119.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('Z790 TUF Gaming', 'ASUS', 349.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('B760 Tomahawk WiFi', 'MSI', 189.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('Z790 AORUS Elite', 'Gigabyte', 269.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('H670 Steel Legend', 'ASRock', 159.99, 'motherboard', 'https://d1yjjnpx0p53s8.cloudfront.net/styles/logo-thumbnail/s3/0013/7800/brand.gif?itok=5s1HB6L_'),
-('B650M DS3H', 'Gigabyte', 149.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('X670E AORUS Master', 'Gigabyte', 459.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-('B760M Bomber WiFi', 'MSI', 129.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
-('Z790 Maximus Hero', 'ASUS', 599.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- RAM MODULES
-('16GB DDR4 Kit', 'Corsair', 79.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Vengeance LPX 8GB', 'Corsair', 24.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Ripjaws V 16GB', 'G.Skill', 34.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Fury Beast 16GB', 'Kingston', 39.99, 'memory', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Elite 32GB Kit', 'TeamGroup', 59.99, 'memory', 'https://cdn.brandfetch.io/id8A5bRNKu/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Vengeance RGB Pro 32GB', 'Corsair', 79.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Trident Z RGB 16GB', 'G.Skill', 49.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Aegis 16GB Kit', 'G.Skill', 29.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('HyperX Fury 32GB', 'Kingston', 69.99, 'memory', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Ballistix 16GB', 'Crucial', 39.99, 'memory', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Value RAM 8GB', 'Corsair', 19.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Trident Z5 16GB', 'G.Skill', 64.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Dominator Platinum 32GB', 'Corsair', 159.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Fury Beast DDR5 16GB', 'Kingston', 69.99, 'memory', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Vengeance DDR5 32GB', 'Corsair', 119.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Trident Z5 RGB 64GB', 'G.Skill', 249.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Elite DDR5 32GB', 'TeamGroup', 109.99, 'memory', 'https://cdn.brandfetch.io/id8A5bRNKu/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Fury Beast DDR5 32GB', 'Kingston', 129.99, 'memory', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Vengeance RGB DDR5 64GB', 'Corsair', 249.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('T-Force Delta RGB 32GB', 'TeamGroup', 99.99, 'memory', 'https://cdn.brandfetch.io/id8A5bRNKu/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Flare X5 32GB', 'G.Skill', 134.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Vengeance LPX 16GB', 'Corsair', 39.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Ripjaws V 32GB', 'G.Skill', 69.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Trident Z5 RGB 32GB', 'G.Skill', 114.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Dominator Platinum 64GB', 'Corsair', 289.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-
--- STORAGE DEVICES
-('Samsung 870 EVO 500GB', 'Samsung', 54.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Samsung 870 QVO 1TB', 'Samsung', 89.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Blue 1TB', 'Western Digital', 49.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Crucial MX500 2TB', 'Crucial', 149.99, 'storage', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Kingston A400 480GB', 'Kingston', 34.99, 'storage', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Samsung 980 Pro 1TB', 'Samsung', 119.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Black SN770 1TB', 'Western Digital', 89.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Crucial P5 Plus 2TB', 'Crucial', 159.99, 'storage', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Samsung 980 500GB', 'Samsung', 49.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Blue SN580 1TB', 'Western Digital', 69.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Kingston KC3000 1TB', 'Kingston', 99.99, 'storage', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Seagate Barracuda 2TB', 'Seagate', 54.99, 'storage', 'https://cdn.brandfetch.io/id5NUik-_s/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Blue 4TB HDD', 'Western Digital', 79.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Seagate IronWolf 4TB', 'Seagate', 99.99, 'storage', 'https://cdn.brandfetch.io/id5NUik-_s/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Toshiba X300 6TB', 'Toshiba', 139.99, 'storage', 'https://cdn.brandfetch.io/idC7lwdfzx/w/200/h/200/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Black 6TB HDD', 'Western Digital', 179.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Seagate Barracuda 8TB', 'Seagate', 149.99, 'storage', 'https://cdn.brandfetch.io/id5NUik-_s/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Crucial BX500 1TB', 'Crucial', 59.99, 'storage', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Samsung 870 EVO 2TB', 'Samsung', 179.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Kingston NV2 2TB', 'Kingston', 109.99, 'storage', 'https://cdn.brandfetch.io/idQrDf3A8-/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Crucial P3 1TB', 'Crucial', 64.99, 'storage', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WD Black SN850X 2TB', 'Western Digital', 159.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Samsung 990 Pro 4TB', 'Samsung', 349.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- CASES
-('H5 Elite Hero', 'NZXT', 119.99, 'case', 'https://nzxt.com/cdn/shop/files/h5-elite-hero-black.png?v=1744789660&width=2000'),
-('H510 Elite', 'NZXT', 149.99, 'case', 'https://nzxt.com/cdn/shop/files/h5-elite-hero-white.png?crop=center&height=1200&v=1762528056&width=1200'),
-('H7 Flow', 'NZXT', 129.99, 'case', 'https://nzxt.com/cdn/shop/files/h7-flow-hero-white.png?v=1762528078&width=1000'),
-('5000D Airflow', 'Corsair', 164.99, 'case', 'https://assets.corsair.com/image/upload/c_pad,q_auto,h_1024,w_1024,f_auto/products/Cases/base-5000d-airflow/Gallery/5000D_AF_WHITE_001.webp'),
-('4000D RGB', 'Corsair', 134.99, 'case', 'https://assets.corsair.com/image/upload/c_pad,q_auto,h_1024,w_1024,f_auto/products/Cases/CC-9011240-WW/iCUE-4000D-RGB-AIRFLOW-Mid-Tower-Case_-Black---3x-AF120-RGB-ELITE-Fans---iCUE-Lighting-Node-PRO-Controller---High-airflow-Design-_CN_-0.webp'),
-('iCUE 5000X RGB', 'Corsair', 179.99, 'case', 'https://assets.corsair.com/image/upload/c_pad,q_auto,h_1024,w_1024,f_auto/products/Cases/base-5000x/Gallery/5000X_RGB_BLACK_27.webp?width=1080&quality=85&auto=webp&format=pjpg'),
-('O11 Dynamic XL', 'Lian Li', 199.99, 'case', 'https://ddstore.mk/media/catalog/product/cache/0ee050c3ffc3555709b9bb6062f4d7e9/1/0/1005459-product_11887_0.png'),
-('Lancool 216', 'Lian Li', 109.99, 'case', 'https://lian-li.com/wp-content/uploads/2022/11/1007_136-b.jpg'),
-('Meshify 2 Compact', 'Fractal Design', 119.99, 'case', 'https://www.fractal-design.com/app/uploads/2021/01/Standard-Studio_Meshify2Compact_Black_TGD_Standard_6.-Left-Front.jpg'),
-('Define 7', 'Fractal Design', 169.99, 'case', 'https://www.fractal-design.com/app/uploads/2020/10/Define_7_TGD_Black_Left_Front-810x810.jpg'),
-('Torrent Compact', 'Fractal Design', 179.99, 'case', 'https://www.fractal-design.com/app/uploads/2022/01/Torrent_Compact_Black_RGB_TGL_1-Left-Front.jpg'),
-('View 51 TG', 'Thermaltake', 139.99, 'case', 'https://www.thermaltake.com/media/catalog/product/cache/cc8b24283b13da6bc2ff91682c03b54b/v/i/view51tg_1.jpg'),
-('Core P3 TG', 'Thermaltake', 149.99, 'case', 'https://www.thermaltake.com/media/catalog/product/cache/6af153fd0a0c509bdfcdfb60a394dd9c/c/o/core_p3_new_5.jpg'),
-('H440', 'NZXT', 109.99, 'case', 'https://static.bhphoto.com/images/images500x500/1449769831_1204996.jpg'),
-('P500A', 'Phanteks', 149.99, 'case', 'https://files.pccasegear.com/images/1594876098-PH-EC500ATG_DBK01-thb3.jpg'),
-('Pure Base 500DX', 'Be Quiet', 109.99, 'case', 'https://www.techpowerup.com/review/be-quiet-pure-base-500dx-rgb-atx-chassis/images/small.png'),
-('H500', 'Cooler Master', 119.99, 'case', 'https://a.storyblok.com/f/281110/819c3bb0a3/mch500_g2.png/m/1440x0/smart'),
-('RL08', 'Silverstone', 89.99, 'case', 'https://www.silverstonetek.com/upload/detail/pro_20220426123228_1.jpg'),
-('Air 100 ARGB', 'Montech', 69.99, 'case', 'https://www.montechpc.com/images/375613?stamp=1734689091'),
-('CC560', 'Deepcool', 59.99, 'case', 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTL4Zf68opHbG86D31NTVI3Y4AQhXE1PBYPjw&s'),
-('DF700 Flux', 'Antec', 159.99, 'case', 'https://www.antec.com/product/case/images/gallery-df700-flux-01.jpg'),
-('H5 Flow', 'NZXT', 94.99, 'case', 'https://nzxt.com/cdn/shop/files/h5-flow-rgb-h5-flow-rgb-primary-lg.png?v=1744863470&width=2000'),
-('4000D Airflow', 'Corsair', 104.99, 'case', 'https://assets.corsair.com/image/upload/c_pad,q_auto,h_1024,w_1024,f_auto/products/Cases/base-4000d-airflow-config/Gallery/4000D_AF_BLACK_01.webp'),
-('O11 Dynamic Evo', 'Lian Li', 159.99, 'case', 'https://www.pbtech.co.nz/imgprod/C/H/CHALAN2074__1.jpg?h=2971221114'),
-('Versa H18', 'Thermaltake', 49.99, 'case', 'https://cdn.mwave.com.au/images/400/AC11503_2.jpg'),
-
--- PSUs
-('650W PSU', 'EVGA', 89.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Smart 450W', 'Thermaltake', 34.99, 'power_supply', 'https://cdn.brandfetch.io/idkwuFYTlH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('CV550', 'Corsair', 49.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('BR600W', 'EVGA', 59.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('CX650M', 'Corsair', 79.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('SuperNOVA 750 G6', 'EVGA', 109.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('RM850x', 'Corsair', 134.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Toughpower GF1 850W', 'Thermaltake', 119.99, 'power_supply', 'https://cdn.brandfetch.io/idkwuFYTlH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('HX1000i', 'Corsair', 199.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('SuperNOVA 1200 P2', 'EVGA', 229.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('RM1000x Shift', 'Corsair', 219.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Smart 500W', 'Thermaltake', 39.99, 'power_supply', 'https://cdn.brandfetch.io/idkwuFYTlH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('RM750e', 'Corsair', 99.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('SuperNOVA 1000 GT', 'EVGA', 169.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- COOLERS
-('Hyper 212 RGB Black', 'Cooler Master', 44.99, 'cooler', 'https://cdn.brandfetch.io/idestV9Dp7/theme/dark/logo.svg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('NH-D15', 'Noctua', 109.99, 'cooler', 'https://cdn.brandfetch.io/idSeoCDyH9/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Dark Rock Pro 4', 'Be Quiet', 89.99, 'cooler', 'https://cdn.brandfetch.io/idl3sdUGQK/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('NH-U12S', 'Noctua', 69.99, 'cooler', 'https://cdn.brandfetch.io/idSeoCDyH9/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Vetroo V5', 'Vetroo', 29.99, 'cooler', 'https://cdn.brandfetch.io/idTMdoBX11/w/500/h/500/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Assassin X 120 Refined', 'Thermalright', 19.99, 'cooler', 'https://cdn.brandfetch.io/id2Wov4r9a/w/339/h/339/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Pure Rock 2', 'Be Quiet', 49.99, 'cooler', 'https://cdn.brandfetch.io/idl3sdUGQK/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Fuma 3', 'Scythe', 64.99, 'cooler', 'https://cdn.brandfetch.io/ide9kDI3oQ/w/200/h/166/theme/light/logo.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Kraken X63', 'NZXT', 149.99, 'cooler', 'https://cdn.brandfetch.io/id6LxRitGO/w/1080/h/1080/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('iCUE H100i Elite', 'Corsair', 149.99, 'cooler', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('iCUE H150i Elite LCD', 'Corsair', 289.99, 'cooler', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('Castle 280 RGB', 'Deepcool', 119.99, 'cooler', 'https://cdn.brandfetch.io/iddrVAMC1d/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('MasterLiquid ML240L', 'Cooler Master', 79.99, 'cooler', 'https://cdn.brandfetch.io/idestV9Dp7/theme/dark/logo.svg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Liquid Freezer II 360', 'Arctic', 119.99, 'cooler', 'https://cdn.brandfetch.io/idPggLGOPA/w/2007/h/2195/theme/dark/logo.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('EK-AIO 240 D-RGB', 'EK Water Blocks', 109.99, 'cooler', 'https://cdn.brandfetch.io/idEOY10s6I/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Peerless Assassin 120 SE', 'Thermalright', 33.90, 'cooler', 'https://cdn.brandfetch.io/id2Wov4r9a/w/339/h/339/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Kraken Elite 360', 'NZXT', 279.99, 'cooler', 'https://cdn.brandfetch.io/id6LxRitGO/w/1080/h/1080/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- SOUND CARDS
-('Sound BlasterX AE-5 Plus', 'Creative', 149.99, 'sound_card', 'https://cdn.brandfetch.io/idkZSfybrG/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Xonar SE', 'ASUS', 44.99, 'sound_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Sound Blaster Z', 'Creative', 89.99, 'sound_card', 'https://cdn.brandfetch.io/idkZSfybrG/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Audigy FX', 'Creative', 39.99, 'sound_card', 'https://cdn.brandfetch.io/idkZSfybrG/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Xonar U7', 'ASUS', 79.99, 'sound_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- NETWORK CARDS
-('PRO/1000 PT', 'Intel', 49.99, 'network_card', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('TG-3468', 'TP-Link', 24.99, 'network_card', 'https://cdn.brandfetch.io/idfUqCiOVX/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('PCE-AC68', 'ASUS', 69.99, 'network_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('XG-C100C', 'ASUS', 99.99, 'network_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Killer E3100G', 'Intel', 54.99, 'network_card', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- NETWORK ADAPTERS
-('Archer TX3000E', 'TP-Link', 49.99, 'network_adapter', 'https://cdn.brandfetch.io/idfUqCiOVX/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('AX200', 'Intel', 34.99, 'network_adapter', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('PCE-AXE5400', 'ASUS', 89.99, 'network_adapter', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Archer T6E', 'TP-Link', 39.99, 'network_adapter', 'https://cdn.brandfetch.io/idfUqCiOVX/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('WN7200ND', 'Rosewill', 19.99, 'network_adapter', 'https://cdn.brandfetch.io/idyFoDrbp8/w/1298/h/471/theme/dark/logo.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- MEMORY CARDS
-('M.2 NVMe Adapter Card', 'ASUS', 24.99, 'memory_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Dual M.2 PCIe Card', 'Silverstone', 29.99, 'memory_card', 'https://cdn.brandfetch.io/idV16xgPJT/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Quad M.2 RAID Card', 'ASUS', 89.99, 'memory_card', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('U.2 NVMe Adapter', 'StarTech', 49.99, 'memory_card', 'https://cdn.brandfetch.io/idXnrkx-Wc/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Triple M.2 Expansion', 'Gigabyte', 44.99, 'memory_card', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
-
--- OPTICAL DRIVE
-('DVD-RW Drive', 'ASUS', 21.99, 'optical_drive', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Slim DVD Writer', 'LG', 24.99, 'optical_drive', 'https://cdn.brandfetch.io/idEI6u48uh/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('BDR-XD07B', 'Pioneer', 89.99, 'optical_drive', 'https://cdn.brandfetch.io/idWn73vTFp/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('BP60NB10', 'LG', 69.99, 'optical_drive', 'https://cdn.brandfetch.io/idEI6u48uh/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Blu-ray Writer', 'ASUS', 79.99, 'optical_drive', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-
--- CABLES
-('USB 3.0 Extension 6ft', 'Cable Matters', 8.99, 'cables', 'https://cdn.brandfetch.io/idvRXtmRRE/w/350/h/350/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('SATA III Cable 3-Pack', 'Monoprice', 6.99, 'cables', 'https://cdn.brandfetch.io/id7CYiuB0p/theme/dark/logo.svg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Premium Sleeved Cables', 'Corsair', 79.99, 'cables', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('DisplayPort 1.4 Cable', 'Cable Matters', 12.99, 'cables', 'https://cdn.brandfetch.io/idvRXtmRRE/w/350/h/350/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('USB-C to USB-A Cable', 'Anker', 9.99, 'cables', 'https://cdn.brandfetch.io/idZx11xCTE/theme/dark/logo.svg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('HDMI 2.1 Cable 10ft', 'Cable Matters', 15.99, 'cables', 'https://cdn.brandfetch.io/idvRXtmRRE/w/350/h/350/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('PWM Fan Splitter Cable', 'Noctua', 7.99, 'cables', 'https://cdn.brandfetch.io/idSeoCDyH9/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
-('RGB LED Strip Extension', 'Corsair', 14.99, 'cables', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
-('PCIe 4.0 Riser Cable', 'Thermaltake', 49.99, 'cables', 'https://cdn.brandfetch.io/idkwuFYTlH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
-('Molex to SATA Power', 'StarTech', 5.99, 'cables', 'https://cdn.brandfetch.io/idXnrkx-Wc/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B');
-
-INSERT INTO cpu (component_id, socket, cores, threads, base_clock, boost_clock, tdp) VALUES
-(1, 'AM4', 6, 12, 3.7, 4.6, 65),
-((SELECT id FROM components WHERE name='Ryzen 5 7600'), 'AM5', 6, 12, 3.8, 5.1, 65),
-((SELECT id FROM components WHERE name='Ryzen 7 7800X3D'), 'AM5', 8, 16, 4.2, 5.0, 120),
-((SELECT id FROM components WHERE name='Ryzen 9 7950X'), 'AM5', 16, 32, 4.5, 5.7, 170),
-((SELECT id FROM components WHERE name='Core i3-13100F'), 'LGA1700', 4, 8, 3.4, 4.5, 58),
-((SELECT id FROM components WHERE name='Core i5-13600K'), 'LGA1700', 14, 20, 3.5, 5.1, 125),
-((SELECT id FROM components WHERE name='Core i7-14700K'), 'LGA1700', 20, 28, 3.4, 5.6, 125),
-((SELECT id FROM components WHERE name='Core i9-14900KS'), 'LGA1700', 24, 32, 3.2, 6.2, 150),
-((SELECT id FROM components WHERE name='Ryzen 5 3600'), 'AM4', 6, 12, 3.6, 4.2, 65),
-((SELECT id FROM components WHERE name='Ryzen 7 3700X'), 'AM4', 8, 16, 3.6, 4.4, 65),
-((SELECT id FROM components WHERE name='Ryzen 5 5600'), 'AM4', 6, 12, 3.5, 4.4, 65),
-((SELECT id FROM components WHERE name='Ryzen 7 5700X'), 'AM4', 8, 16, 3.4, 4.6, 65),
-((SELECT id FROM components WHERE name='Ryzen 9 5900X'), 'AM4', 12, 24, 3.7, 4.8, 105),
-((SELECT id FROM components WHERE name='Core i5-12400F'), 'LGA1700', 6, 12, 2.5, 4.4, 65),
-((SELECT id FROM components WHERE name='Core i7-12700K'), 'LGA1700', 12, 20, 3.6, 5.0, 125),
-((SELECT id FROM components WHERE name='Core i5-10400F'), 'LGA1200', 6, 12, 2.9, 4.3, 65),
-((SELECT id FROM components WHERE name='Core i7-11700K'), 'LGA1200', 8, 16, 3.6, 5.0, 125),
-((SELECT id FROM components WHERE name='Core i9-12900K'), 'LGA1700', 16, 24, 3.2, 5.2, 125),
-((SELECT id FROM components WHERE name='Ryzen 3 3200G'), 'AM4', 4, 4, 3.6, 4.0, 65),
-((SELECT id FROM components WHERE name='Ryzen 5 3600X'), 'AM4', 6, 12, 3.8, 4.4, 95),
-((SELECT id FROM components WHERE name='Ryzen 9 3900X'), 'AM4', 12, 24, 3.8, 4.6, 105),
-((SELECT id FROM components WHERE name='Ryzen 5 5600G'), 'AM4', 6, 12, 3.9, 4.4, 65),
-((SELECT id FROM components WHERE name='Ryzen 7 5800X'), 'AM4', 8, 16, 3.8, 4.7, 105),
-((SELECT id FROM components WHERE name='Core i3-10100F'), 'LGA1200', 4, 8, 3.6, 4.3, 65),
-((SELECT id FROM components WHERE name='Core i3-12100F'), 'LGA1700', 4, 8, 3.3, 4.3, 58),
-((SELECT id FROM components WHERE name='Core i5-11400F'), 'LGA1200', 6, 12, 2.6, 4.4, 65),
-((SELECT id FROM components WHERE name='Core i9-10900K'), 'LGA1200', 10, 20, 3.7, 5.3, 125),
-((SELECT id FROM components WHERE name='Core i5-13400F'), 'LGA1700', 10, 16, 2.5, 4.6, 65);
-
-INSERT INTO gpu (component_id, vram, tdp, base_clock, boost_clock, chipset, length) VALUES
-(2, 12, 170, 1.32, 1.78, 'RTX 3060', 242),
-((SELECT id FROM components WHERE name='Radeon RX 6600'), 8, 132, 2.0, 2.4, 'RX 6600', 200),
-((SELECT id FROM components WHERE name='Radeon RX 7600'), 8, 165, 2.2, 2.6, 'RX 7600', 240),
-((SELECT id FROM components WHERE name='Radeon RX 7800 XT'), 16, 263, 2.1, 2.4, 'RX 7800 XT', 280),
-((SELECT id FROM components WHERE name='Radeon RX 7900 XTX'), 24, 355, 2.3, 2.5, 'RX 7900 XTX', 320),
-((SELECT id FROM components WHERE name='GeForce RTX 3050'), 8, 130, 1.5, 1.7, 'RTX 3050', 200),
-((SELECT id FROM components WHERE name='GeForce RTX 4060'), 8, 115, 1.8, 2.4, 'RTX 4060', 220),
-((SELECT id FROM components WHERE name='GeForce RTX 4070 Super'), 12, 220, 1.9, 2.5, 'RTX 4070 S', 260),
-((SELECT id FROM components WHERE name='GeForce RTX 4080 Super'), 16, 320, 2.2, 2.5, 'RTX 4080 S', 300),
-((SELECT id FROM components WHERE name='GeForce RTX 4090'), 24, 450, 2.2, 2.5, 'RTX 4090', 340),
-((SELECT id FROM components WHERE name='GeForce RTX 3060 Ti'), 8, 200, 1.41, 1.67, 'RTX 3060 Ti', 242),
-((SELECT id FROM components WHERE name='GeForce RTX 3070'), 8, 220, 1.5, 1.73, 'RTX 3070', 242),
-((SELECT id FROM components WHERE name='GeForce RTX 3070 Ti'), 8, 290, 1.58, 1.77, 'RTX 3070 Ti', 267),
-((SELECT id FROM components WHERE name='GeForce RTX 3080'), 10, 320, 1.44, 1.71, 'RTX 3080', 285),
-((SELECT id FROM components WHERE name='GeForce RTX 3090'), 24, 350, 1.4, 1.7, 'RTX 3090', 313),
-((SELECT id FROM components WHERE name='GeForce RTX 4060 Ti'), 8, 160, 2.3, 2.5, 'RTX 4060 Ti', 244),
-((SELECT id FROM components WHERE name='GeForce RTX 4070'), 12, 200, 1.9, 2.48, 'RTX 4070', 242),
-((SELECT id FROM components WHERE name='GeForce RTX 4070 Ti'), 12, 285, 2.3, 2.6, 'RTX 4070 Ti', 267),
-((SELECT id FROM components WHERE name='GeForce RTX 4080'), 16, 320, 2.2, 2.51, 'RTX 4080', 304),
-((SELECT id FROM components WHERE name='GeForce RTX 2060'), 6, 160, 1.37, 1.68, 'RTX 2060', 229),
-((SELECT id FROM components WHERE name='Radeon RX 6700 XT'), 12, 230, 2.3, 2.58, 'RX 6700 XT', 267),
-((SELECT id FROM components WHERE name='Radeon RX 6800'), 16, 250, 1.7, 2.1, 'RX 6800', 267),
-((SELECT id FROM components WHERE name='Radeon RX 6800 XT'), 16, 300, 1.82, 2.25, 'RX 6800 XT', 267),
-((SELECT id FROM components WHERE name='Radeon RX 6900 XT'), 16, 300, 1.83, 2.25, 'RX 6900 XT', 267),
-((SELECT id FROM components WHERE name='Radeon RX 7700 XT'), 12, 245, 2.2, 2.54, 'RX 7700 XT', 260),
-((SELECT id FROM components WHERE name='Radeon RX 7900 XT'), 20, 315, 2.0, 2.4, 'RX 7900 XT', 287),
-((SELECT id FROM components WHERE name='Radeon RX 6650 XT'), 8, 180, 2.06, 2.64, 'RX 6650 XT', 240),
-((SELECT id FROM components WHERE name='Radeon RX 6750 XT'), 12, 250, 2.15, 2.6, 'RX 6750 XT', 267),
-((SELECT id FROM components WHERE name='Radeon RX 5700 XT'), 8, 225, 1.61, 1.91, 'RX 5700 XT', 267),
-((SELECT id FROM components WHERE name='Radeon RX 5600 XT'), 6, 150, 1.38, 1.62, 'RX 5600 XT', 240),
-((SELECT id FROM components WHERE name='Arc A770'), 16, 225, 2.1, 2.4, 'Arc A770', 267),
-((SELECT id FROM components WHERE name='Arc A750'), 8, 225, 2.05, 2.4, 'Arc A750', 267),
-((SELECT id FROM components WHERE name='Arc A580'), 8, 185, 1.7, 2.0, 'Arc A580', 229),
-((SELECT id FROM components WHERE name='Arc A380'), 6, 75, 2.0, 2.45, 'Arc A380', 167),
-((SELECT id FROM components WHERE name='Arc A310'), 4, 75, 2.0, 2.0, 'Arc A310', 150),
-((SELECT id FROM components WHERE name='Arc B580'), 12, 190, 2.0, 2.67, 'Arc B580', 267),
-((SELECT id FROM components WHERE name='Arc B570'), 10, 150, 1.9, 2.5, 'Arc B570', 242),
-((SELECT id FROM components WHERE name='Arc A350M'), 4, 50, 1.15, 1.8, 'Arc A350M', 180),
-((SELECT id FROM components WHERE name='Arc Pro A60'), 12, 130, 2.0, 2.45, 'Arc Pro A60', 229),
-((SELECT id FROM components WHERE name='Arc Pro A40'), 6, 50, 1.65, 2.05, 'Arc Pro A40', 167);
-
-INSERT INTO motherboard (component_id, socket, chipset, form_factor, ram_type, num_ram_slots, max_ram_capacity, pci_express_slots) VALUES
-(7, 'AM4', 'B550', 'ATX', 'DDR4', 4, 128, 3),
-((SELECT id FROM components WHERE name='B650M DS3H'), 'AM5', 'B650', 'Micro-ATX', 'DDR5', 4, 128, 2),
-((SELECT id FROM components WHERE name='X670E AORUS Master'), 'AM5', 'X670E', 'ATX', 'DDR5', 4, 192, 3),
-((SELECT id FROM components WHERE name='B760M Bomber WiFi'), 'LGA1700', 'B760', 'Micro-ATX', 'DDR4', 2, 64, 1),
-((SELECT id FROM components WHERE name='Z790 Maximus Hero'), 'LGA1700', 'Z790', 'ATX', 'DDR5', 4, 192, 3),
-((SELECT id FROM components WHERE name='B450 Tomahawk Max'), 'AM4', 'B450', 'ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='B550-A Pro'), 'AM4', 'B550', 'ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='X570 AORUS Elite'), 'AM4', 'X570', 'ATX', 'DDR4', 4, 128, 3),
-((SELECT id FROM components WHERE name='B550M TUF Gaming'), 'AM4', 'B550', 'Micro-ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='X570 Unify'), 'AM4', 'X570', 'ATX', 'DDR4', 4, 128, 3),
-((SELECT id FROM components WHERE name='B650 AORUS Elite AX'), 'AM5', 'B650', 'ATX', 'DDR5', 4, 128, 3),
-((SELECT id FROM components WHERE name='X670 Gaming Plus WiFi'), 'AM5', 'X670', 'ATX', 'DDR5', 4, 192, 3),
-((SELECT id FROM components WHERE name='B650E TUF Gaming'), 'AM5', 'B650E', 'ATX', 'DDR5', 4, 128, 3),
-((SELECT id FROM components WHERE name='X670E Taichi'), 'AM5', 'X670E', 'ATX', 'DDR5', 4, 256, 4),
-((SELECT id FROM components WHERE name='B550 Phantom Gaming'), 'AM4', 'B550', 'ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='B660M Pro RS'), 'LGA1700', 'B660', 'Micro-ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='B660 Gaming X DDR4'), 'LGA1700', 'B660', 'ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='H610M-E'), 'LGA1700', 'H610', 'Micro-ATX', 'DDR4', 2, 64, 1),
-((SELECT id FROM components WHERE name='Z690 AORUS Pro'), 'LGA1700', 'Z690', 'ATX', 'DDR5', 4, 128, 3),
-((SELECT id FROM components WHERE name='Z690 Edge WiFi DDR4'), 'LGA1700', 'Z690', 'ATX', 'DDR4', 4, 128, 3),
-((SELECT id FROM components WHERE name='B760M DS3H DDR4'), 'LGA1700', 'B760', 'Micro-ATX', 'DDR4', 4, 128, 2),
-((SELECT id FROM components WHERE name='Z790 TUF Gaming'), 'LGA1700', 'Z790', 'ATX', 'DDR5', 4, 192, 3),
-((SELECT id FROM components WHERE name='B760 Tomahawk WiFi'), 'LGA1700', 'B760', 'ATX', 'DDR4', 4, 128, 3),
-((SELECT id FROM components WHERE name='Z790 AORUS Elite'), 'LGA1700', 'Z790', 'ATX', 'DDR5', 4, 192, 3),
-((SELECT id FROM components WHERE name='H670 Steel Legend'), 'LGA1700', 'H670', 'ATX', 'DDR4', 4, 128, 2);
-
-INSERT INTO memory (component_id, type, speed, capacity, modules) VALUES
-(3, 'DDR4', 3200, 16, 2),
-((SELECT id FROM components WHERE name='Vengeance LPX 16GB'), 'DDR4', 3200, 16, 2),
-((SELECT id FROM components WHERE name='Ripjaws V 32GB'), 'DDR4', 3600, 32, 2),
-((SELECT id FROM components WHERE name='Trident Z5 RGB 32GB'), 'DDR5', 6000, 32, 2),
-((SELECT id FROM components WHERE name='Dominator Platinum 64GB'), 'DDR5', 6400, 64, 2),
-((SELECT id FROM components WHERE name='Vengeance LPX 8GB'), 'DDR4', 3200, 8, 1),
-((SELECT id FROM components WHERE name='Ripjaws V 16GB'), 'DDR4', 3600, 16, 2),
-((SELECT id FROM components WHERE name='Fury Beast 16GB'), 'DDR4', 3200, 16, 2),
-((SELECT id FROM components WHERE name='Elite 32GB Kit'), 'DDR4', 3200, 32, 2),
-((SELECT id FROM components WHERE name='Vengeance RGB Pro 32GB'), 'DDR4', 3600, 32, 2),
-((SELECT id FROM components WHERE name='Trident Z RGB 16GB'), 'DDR4', 3600, 16, 2),
-((SELECT id FROM components WHERE name='Aegis 16GB Kit'), 'DDR4', 3000, 16, 2),
-((SELECT id FROM components WHERE name='HyperX Fury 32GB'), 'DDR4', 3200, 32, 4),
-((SELECT id FROM components WHERE name='Ballistix 16GB'), 'DDR4', 3200, 16, 1),
-((SELECT id FROM components WHERE name='Value RAM 8GB'), 'DDR4', 2666, 8, 1),
-((SELECT id FROM components WHERE name='Trident Z5 16GB'), 'DDR5', 6000, 16, 2),
-((SELECT id FROM components WHERE name='Dominator Platinum 32GB'), 'DDR5', 6400, 32, 2),
-((SELECT id FROM components WHERE name='Fury Beast DDR5 16GB'), 'DDR5', 5600, 16, 1),
-((SELECT id FROM components WHERE name='Vengeance DDR5 32GB'), 'DDR5', 5600, 32, 2),
-((SELECT id FROM components WHERE name='Trident Z5 RGB 64GB'), 'DDR5', 6000, 64, 2),
-((SELECT id FROM components WHERE name='Elite DDR5 32GB'), 'DDR5', 5200, 32, 2),
-((SELECT id FROM components WHERE name='Fury Beast DDR5 32GB'), 'DDR5', 6000, 32, 2),
-((SELECT id FROM components WHERE name='Vengeance RGB DDR5 64GB'), 'DDR5', 6400, 64, 2),
-((SELECT id FROM components WHERE name='T-Force Delta RGB 32GB'), 'DDR5', 6000, 32, 2),
-((SELECT id FROM components WHERE name='Flare X5 32GB'), 'DDR5', 6000, 32, 2);
-
-INSERT INTO storage (component_id, type, capacity, form_factor) VALUES
-(8, 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='Crucial P3 1TB'), 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='WD Black SN850X 2TB'), 'NVMe', 2000, 'M.2'),
-((SELECT id FROM components WHERE name='Samsung 990 Pro 4TB'), 'NVMe', 4000, 'M.2'),
-((SELECT id FROM components WHERE name='Samsung 870 EVO 500GB'), 'SATA', 500, '2.5'),
-((SELECT id FROM components WHERE name='Samsung 870 QVO 1TB'), 'SATA', 1000, '2.5'),
-((SELECT id FROM components WHERE name='WD Blue 1TB'), 'SATA', 1000, '2.5'),
-((SELECT id FROM components WHERE name='Crucial MX500 2TB'), 'SATA', 2000, '2.5'),
-((SELECT id FROM components WHERE name='Kingston A400 480GB'), 'SATA', 480, '2.5'),
-((SELECT id FROM components WHERE name='Samsung 980 Pro 1TB'), 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='WD Black SN770 1TB'), 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='Crucial P5 Plus 2TB'), 'NVMe', 2000, 'M.2'),
-((SELECT id FROM components WHERE name='Samsung 980 500GB'), 'NVMe', 500, 'M.2'),
-((SELECT id FROM components WHERE name='WD Blue SN580 1TB'), 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='Kingston KC3000 1TB'), 'NVMe', 1000, 'M.2'),
-((SELECT id FROM components WHERE name='Seagate Barracuda 2TB'), 'HDD', 2000, '3.5'),
-((SELECT id FROM components WHERE name='WD Blue 4TB HDD'), 'HDD', 4000, '3.5'),
-((SELECT id FROM components WHERE name='Seagate IronWolf 4TB'), 'HDD', 4000, '3.5'),
-((SELECT id FROM components WHERE name='Toshiba X300 6TB'), 'HDD', 6000, '3.5'),
-((SELECT id FROM components WHERE name='WD Black 6TB HDD'), 'HDD', 6000, '3.5'),
-((SELECT id FROM components WHERE name='Seagate Barracuda 8TB'), 'HDD', 8000, '3.5'),
-((SELECT id FROM components WHERE name='Crucial BX500 1TB'), 'SATA', 1000, '2.5'),
-((SELECT id FROM components WHERE name='Samsung 870 EVO 2TB'), 'SATA', 2000, '2.5'),
-((SELECT id FROM components WHERE name='Kingston NV2 2TB'), 'NVMe', 2000, 'M.2');
-
-INSERT INTO pc_case (component_id, cooler_max_height, gpu_max_length) VALUES
-(5, 165, 300),
-((SELECT id FROM components WHERE name='H5 Flow'), 165, 365),
-((SELECT id FROM components WHERE name='4000D Airflow'), 170, 360),
-((SELECT id FROM components WHERE name='O11 Dynamic Evo'), 167, 422),
-((SELECT id FROM components WHERE name='Versa H18'), 155, 350),
-((SELECT id FROM components WHERE name='H510 Elite'), 165, 381),
-((SELECT id FROM components WHERE name='H7 Flow'), 185, 400),
-((SELECT id FROM components WHERE name='5000D Airflow'), 170, 420),
-((SELECT id FROM components WHERE name='4000D RGB'), 170, 360),
-((SELECT id FROM components WHERE name='iCUE 5000X RGB'), 170, 420),
-((SELECT id FROM components WHERE name='O11 Dynamic XL'), 167, 420),
-((SELECT id FROM components WHERE name='Lancool 216'), 176, 384),
-((SELECT id FROM components WHERE name='Meshify 2 Compact'), 169, 360),
-((SELECT id FROM components WHERE name='Define 7'), 185, 491),
-((SELECT id FROM components WHERE name='Torrent Compact'), 188, 360),
-((SELECT id FROM components WHERE name='View 51 TG'), 180, 420),
-((SELECT id FROM components WHERE name='Core P3 TG'), 185, 420),
-((SELECT id FROM components WHERE name='H440'), 165, 400),
-((SELECT id FROM components WHERE name='P500A'), 160, 435),
-((SELECT id FROM components WHERE name='Pure Base 500DX'), 190, 369),
-((SELECT id FROM components WHERE name='H500'), 167, 410),
-((SELECT id FROM components WHERE name='RL08'), 158, 400),
-((SELECT id FROM components WHERE name='Air 100 ARGB'), 155, 330),
-((SELECT id FROM components WHERE name='CC560'), 165, 370),
-((SELECT id FROM components WHERE name='DF700 Flux'), 180, 405);
-
-INSERT INTO case_mobo_form_factors (case_id, form_factor) VALUES
-(5, 'ATX'), (5, 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'H5 Flow'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H5 Flow'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = '4000D Airflow'), 'ATX'),
-((SELECT id FROM components WHERE name = '4000D Airflow'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Versa H18'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'H510 Elite'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H510 Elite'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'H7 Flow'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H7 Flow'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = '5000D Airflow'), 'ATX'),
-((SELECT id FROM components WHERE name = '5000D Airflow'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = '4000D RGB'), 'ATX'),
-((SELECT id FROM components WHERE name = '4000D RGB'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'iCUE 5000X RGB'), 'ATX'),
-((SELECT id FROM components WHERE name = 'iCUE 5000X RGB'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic XL'), 'ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic XL'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Lancool 216'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Lancool 216'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Meshify 2 Compact'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Meshify 2 Compact'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Define 7'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Define 7'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Torrent Compact'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Torrent Compact'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'View 51 TG'), 'ATX'),
-((SELECT id FROM components WHERE name = 'View 51 TG'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Core P3 TG'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Core P3 TG'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'H440'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H440'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'P500A'), 'ATX'),
-((SELECT id FROM components WHERE name = 'P500A'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Pure Base 500DX'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Pure Base 500DX'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'H500'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H500'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'RL08'), 'ATX'),
-((SELECT id FROM components WHERE name = 'RL08'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'Air 100 ARGB'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'CC560'), 'ATX'),
-((SELECT id FROM components WHERE name = 'CC560'), 'Micro-ATX'),
-((SELECT id FROM components WHERE name = 'DF700 Flux'), 'ATX'),
-((SELECT id FROM components WHERE name = 'DF700 Flux'), 'Micro-ATX');
-
-INSERT INTO case_storage_form_factors (case_id, form_factor, num_slots) VALUES
-(5, 'M.2', 2),
-((SELECT id FROM components WHERE name = 'H5 Flow'), 'M.2', 3),
-((SELECT id FROM components WHERE name = '4000D Airflow'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'M.2', 4),
-((SELECT id FROM components WHERE name = 'Versa H18'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'H510 Elite'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'H7 Flow'), 'M.2', 4),
-((SELECT id FROM components WHERE name = '5000D Airflow'), 'M.2', 4),
-((SELECT id FROM components WHERE name = '4000D RGB'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'iCUE 5000X RGB'), 'M.2', 4),
-((SELECT id FROM components WHERE name = 'O11 Dynamic XL'), 'M.2', 4),
-((SELECT id FROM components WHERE name = 'Lancool 216'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'Meshify 2 Compact'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'Define 7'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'Torrent Compact'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'View 51 TG'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'Core P3 TG'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'H440'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'P500A'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'Pure Base 500DX'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'H500'), 'M.2', 3),
-((SELECT id FROM components WHERE name = 'RL08'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'Air 100 ARGB'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'CC560'), 'M.2', 2),
-((SELECT id FROM components WHERE name = 'DF700 Flux'), 'M.2', 3);
-
-INSERT INTO power_supply (component_id, type, wattage, form_factor) VALUES
-(4, 'Modular', 650, 'ATX'),
-((SELECT id FROM components WHERE name='Smart 500W'), 'Non-Modular', 500, 'ATX'),
-((SELECT id FROM components WHERE name='RM750e'), 'Fully Modular', 750, 'ATX'),
-((SELECT id FROM components WHERE name='SuperNOVA 1000 GT'), 'Fully Modular', 1000, 'ATX'),
-((SELECT id FROM components WHERE name='Smart 450W'), 'Non-Modular', 450, 'ATX'),
-((SELECT id FROM components WHERE name='CV550'), 'Non-Modular', 550, 'ATX'),
-((SELECT id FROM components WHERE name='BR600W'), 'Non-Modular', 600, 'ATX'),
-((SELECT id FROM components WHERE name='CX650M'), 'Semi-Modular', 650, 'ATX'),
-((SELECT id FROM components WHERE name='SuperNOVA 750 G6'), 'Fully Modular', 750, 'ATX'),
-((SELECT id FROM components WHERE name='RM850x'), 'Fully Modular', 850, 'ATX'),
-((SELECT id FROM components WHERE name='Toughpower GF1 850W'), 'Fully Modular', 850, 'ATX'),
-((SELECT id FROM components WHERE name='HX1000i'), 'Fully Modular', 1000, 'ATX'),
-((SELECT id FROM components WHERE name='SuperNOVA 1200 P2'), 'Fully Modular', 1200, 'ATX'),
-((SELECT id FROM components WHERE name='RM1000x Shift'), 'Fully Modular', 1000, 'ATX');
-
-INSERT INTO cooler (component_id, type, height, max_tdp_supported) VALUES
-(6, 'Air', 158, 150),
-((SELECT id FROM components WHERE name='Peerless Assassin 120 SE'), 'Air', 155, 245),
-((SELECT id FROM components WHERE name='Kraken Elite 360'), 'Liquid', 55, 300),
-((SELECT id FROM components WHERE name='Hyper 212 RGB Black'), 'Air', 159, 180),
-((SELECT id FROM components WHERE name='NH-D15'), 'Air', 165, 220),
-((SELECT id FROM components WHERE name='Dark Rock Pro 4'), 'Air', 163, 250),
-((SELECT id FROM components WHERE name='NH-U12S'), 'Air', 158, 165),
-((SELECT id FROM components WHERE name='Vetroo V5'), 'Air', 155, 180),
-((SELECT id FROM components WHERE name='Assassin X 120 Refined'), 'Air', 157, 150),
-((SELECT id FROM components WHERE name='Pure Rock 2'), 'Air', 155, 150),
-((SELECT id FROM components WHERE name='Fuma 3'), 'Air', 154, 220),
-((SELECT id FROM components WHERE name='Kraken X63'), 'Liquid', 55, 250),
-((SELECT id FROM components WHERE name='iCUE H100i Elite'), 'Liquid', 55, 250),
-((SELECT id FROM components WHERE name='iCUE H150i Elite LCD'), 'Liquid', 55, 300),
-((SELECT id FROM components WHERE name='Castle 280 RGB'), 'Liquid', 55, 250),
-((SELECT id FROM components WHERE name='MasterLiquid ML240L'), 'Liquid', 55, 200),
-((SELECT id FROM components WHERE name='Liquid Freezer II 360'), 'Liquid', 55, 320),
-((SELECT id FROM components WHERE name='EK-AIO 240 D-RGB'), 'Liquid', 55, 240);
-
-INSERT INTO cooler_cpu_sockets (cooler_id, socket) VALUES
-(6, 'AM4'), (6, 'AM5'),
-((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Hyper 212 RGB Black'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Hyper 212 RGB Black'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Hyper 212 RGB Black'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Hyper 212 RGB Black'), 'LGA1200'),
-((SELECT id FROM components WHERE name = 'NH-D15'), 'AM4'),
-((SELECT id FROM components WHERE name = 'NH-D15'), 'AM5'),
-((SELECT id FROM components WHERE name = 'NH-D15'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'NH-D15'), 'LGA1200'),
-((SELECT id FROM components WHERE name = 'Dark Rock Pro 4'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Dark Rock Pro 4'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Dark Rock Pro 4'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Dark Rock Pro 4'), 'LGA1200'),
-((SELECT id FROM components WHERE name = 'NH-U12S'), 'AM4'),
-((SELECT id FROM components WHERE name = 'NH-U12S'), 'AM5'),
-((SELECT id FROM components WHERE name = 'NH-U12S'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'NH-U12S'), 'LGA1200'),
-((SELECT id FROM components WHERE name = 'Vetroo V5'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Vetroo V5'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Assassin X 120 Refined'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Assassin X 120 Refined'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Assassin X 120 Refined'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Pure Rock 2'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Pure Rock 2'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Fuma 3'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Fuma 3'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Fuma 3'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Kraken X63'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Kraken X63'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Kraken X63'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'iCUE H100i Elite'), 'AM4'),
-((SELECT id FROM components WHERE name = 'iCUE H100i Elite'), 'AM5'),
-((SELECT id FROM components WHERE name = 'iCUE H100i Elite'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'iCUE H150i Elite LCD'), 'AM4'),
-((SELECT id FROM components WHERE name = 'iCUE H150i Elite LCD'), 'AM5'),
-((SELECT id FROM components WHERE name = 'iCUE H150i Elite LCD'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Castle 280 RGB'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Castle 280 RGB'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'MasterLiquid ML240L'), 'AM4'),
-((SELECT id FROM components WHERE name = 'MasterLiquid ML240L'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'Liquid Freezer II 360'), 'AM4'),
-((SELECT id FROM components WHERE name = 'Liquid Freezer II 360'), 'AM5'),
-((SELECT id FROM components WHERE name = 'Liquid Freezer II 360'), 'LGA1700'),
-((SELECT id FROM components WHERE name = 'EK-AIO 240 D-RGB'), 'AM4'),
-((SELECT id FROM components WHERE name = 'EK-AIO 240 D-RGB'), 'AM5'),
-((SELECT id FROM components WHERE name = 'EK-AIO 240 D-RGB'), 'LGA1700');
-
-INSERT INTO case_ps_form_factors (case_id, form_factor) VALUES
-(5, 'ATX'),
-((SELECT id FROM components WHERE name = 'H5 Flow'), 'ATX'),
-((SELECT id FROM components WHERE name = '4000D Airflow'), 'ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Versa H18'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H510 Elite'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H7 Flow'), 'ATX'),
-((SELECT id FROM components WHERE name = '5000D Airflow'), 'ATX'),
-((SELECT id FROM components WHERE name = '4000D RGB'), 'ATX'),
-((SELECT id FROM components WHERE name = 'iCUE 5000X RGB'), 'ATX'),
-((SELECT id FROM components WHERE name = 'O11 Dynamic XL'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Lancool 216'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Meshify 2 Compact'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Define 7'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Torrent Compact'), 'ATX'),
-((SELECT id FROM components WHERE name = 'View 51 TG'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Core P3 TG'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H440'), 'ATX'),
-((SELECT id FROM components WHERE name = 'P500A'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Pure Base 500DX'), 'ATX'),
-((SELECT id FROM components WHERE name = 'H500'), 'ATX'),
-((SELECT id FROM components WHERE name = 'RL08'), 'ATX'),
-((SELECT id FROM components WHERE name = 'Air 100 ARGB'), 'ATX'),
-((SELECT id FROM components WHERE name = 'CC560'), 'ATX'),
-((SELECT id FROM components WHERE name = 'DF700 Flux'), 'ATX');
-
-INSERT INTO sound_card (component_id, sample_rate, bit_depth, chipset, interface, channel) VALUES 
-(9, 192000, 24, 'SoundCore', 'PCIe', '7.1'),
-((SELECT id FROM components WHERE name='Sound BlasterX AE-5 Plus'), 192000, 32, 'SB1508', 'PCIe', '7.1'),
-((SELECT id FROM components WHERE name='Xonar SE'), 192000, 24, 'CM6620', 'PCIe', '5.1'),
-((SELECT id FROM components WHERE name='Sound Blaster Z'), 192000, 24, 'SB1502', 'PCIe', '5.1'),
-((SELECT id FROM components WHERE name='Audigy FX'), 192000, 24, 'CA20K2', 'PCIe', '5.1'),
-((SELECT id FROM components WHERE name='Xonar U7'), 192000, 24, 'CM6632AX', 'USB', '7.1');
-
-INSERT INTO network_card (component_id, num_ports, speed, interface) VALUES 
-(10, 2, 1000, 'PCIe'),
-((SELECT id FROM components WHERE name='PRO/1000 PT'), 2, 1000, 'PCIe'),
-((SELECT id FROM components WHERE name='TG-3468'), 1, 1000, 'PCIe'),
-((SELECT id FROM components WHERE name='PCE-AC68'), 1, 1300, 'PCIe'),
-((SELECT id FROM components WHERE name='XG-C100C'), 1, 10000, 'PCIe'),
-((SELECT id FROM components WHERE name='Killer E3100G'), 1, 2500, 'PCIe');
-
-INSERT INTO network_adapter (component_id, wifi_version, interface, num_antennas) VALUES 
-(11, 'WiFi 6', 'PCIe', 3),
-((SELECT id FROM components WHERE name='Archer TX3000E'), 'WiFi 6', 'PCIe', 2),
-((SELECT id FROM components WHERE name='AX200'), 'WiFi 6', 'M.2', 2),
-((SELECT id FROM components WHERE name='PCE-AXE5400'), 'WiFi 6E', 'PCIe', 4),
-((SELECT id FROM components WHERE name='Archer T6E'), 'WiFi 5', 'PCIe', 2),
-((SELECT id FROM components WHERE name='WN7200ND'), 'WiFi 4', 'PCIe', 2);
-
-INSERT INTO optical_drive (component_id, form_factor, type, interface, write_speed, read_speed) VALUES 
-(12, '5.25"', 'DVD-RW', 'SATA', 16, 16),
-((SELECT id FROM components WHERE name='DVD-RW Drive'), '5.25"', 'DVD-RW', 'SATA', 24, 24),
-((SELECT id FROM components WHERE name='Slim DVD Writer'), 'Slim', 'DVD-RW', 'SATA', 8, 8),
-((SELECT id FROM components WHERE name='BDR-XD07B'), 'Slim', 'BD-RE', 'USB', 6, 6),
-((SELECT id FROM components WHERE name='BP60NB10'), 'Slim', 'BD-RE', 'USB', 6, 6),
-((SELECT id FROM components WHERE name='Blu-ray Writer'), '5.25"', 'BD-RE', 'SATA', 16, 16);
-
-INSERT INTO memory_card (component_id, num_slots, interface) VALUES 
-(13, 1, 'PCIe'),
-((SELECT id FROM components WHERE name='M.2 NVMe Adapter Card'), 1, 'PCIe x4'),
-((SELECT id FROM components WHERE name='Dual M.2 PCIe Card'), 2, 'PCIe x8'),
-((SELECT id FROM components WHERE name='Quad M.2 RAID Card'), 4, 'PCIe x16'),
-((SELECT id FROM components WHERE name='U.2 NVMe Adapter'), 1, 'PCIe x4'),
-((SELECT id FROM components WHERE name='Triple M.2 Expansion'), 3, 'PCIe x16');
-
-INSERT INTO cables (component_id, length_cm, type) VALUES 
-(14, 50, 'SATA'),
-((SELECT id FROM components WHERE name='USB 3.0 Extension 6ft'), 180, 'USB'),
-((SELECT id FROM components WHERE name='SATA III Cable 3-Pack'), 50, 'SATA'),
-((SELECT id FROM components WHERE name='Premium Sleeved Cables'), 60, 'PSU'),
-((SELECT id FROM components WHERE name='DisplayPort 1.4 Cable'), 180, 'DisplayPort'),
-((SELECT id FROM components WHERE name='USB-C to USB-A Cable'), 100, 'USB'),
-((SELECT id FROM components WHERE name='HDMI 2.1 Cable 10ft'), 300, 'HDMI'),
-((SELECT id FROM components WHERE name='PWM Fan Splitter Cable'), 30, 'Fan'),
-((SELECT id FROM components WHERE name='RGB LED Strip Extension'), 50, 'RGB'),
-((SELECT id FROM components WHERE name='PCIe 4.0 Riser Cable'), 30, 'PCIe'),
-((SELECT id FROM components WHERE name='Molex to SATA Power'), 20, 'Power');
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='tome'), 'Gaming Build', '2025-09-18', 'Mid-range gaming PC', 1154.92, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'Ryzen 7 5800X')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'RTX 3060')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'B550M TUF Gaming')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'Fury Beast 16GB')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'Samsung 980 Pro 1TB')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = 'CX650M')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'),(SELECT id FROM components WHERE name = '4000D Airflow')),
-  ((SELECT id FROM build WHERE name = 'Gaming Build'), (SELECT id FROM components WHERE name = 'NH-U12S'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='budget_king'), 'Console Killer 2025', '2024-12-01', 'Cheap entry level gaming PC', 580.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Core i3-13100F')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Radeon RX 6600')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Vengeance LPX 16GB')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Smart 500W')),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Versa H18'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='streamer_pro'), 'Pro Streaming Rig', '2025-01-15', 'Handles OBS and 1440p gaming flawlessly', 2150.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Core i7-14700K')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='GeForce RTX 4080 Super')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='WD Black SN850X 2TB')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='H5 Flow')),
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='pc_wizard'), 'Team Red Value King', '2025-02-10', 'Pure rasterization performance', 1450.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Ryzen 7 7800X3D')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Radeon RX 7800 XT')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='B650M DS3H')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='RM750e')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='4000D Airflow')),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Peerless Assassin 120 SE'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='rgb_lover'), 'God Tier 4090 Build', '2025-03-01', 'Money is no object. 4K 144Hz Ultra.', 4200.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Core i9-14900KS')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='GeForce RTX 4090')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Dominator Platinum 64GB')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Samsung 990 Pro 4TB')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='O11 Dynamic Evo')),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='first_timer'), 'Snow White Build', '2024-11-20', 'First time building, went for looks', 1199.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Ryzen 5 7600')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='GeForce RTX 4070 Super')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='B650M DS3H')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='RM750e')),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='H5 Flow'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='linux_fan'), 'Arch Linux Dev Box', '2024-10-15', 'Compilation beast, no Nvidia drivers needed', 920.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Core i5-13600K')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Radeon RX 7600')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Ripjaws V 32GB')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='RM750e')),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Versa H18'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='office_guy'), '1080p Gamer', '2025-01-05', 'Just for Fortnite and Apex', 810.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Core i3-13100F')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='GeForce RTX 4060')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Vengeance LPX 16GB')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Smart 500W')),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Versa H18'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='pc_wizard'), 'Silent Night', '2024-12-25', 'Zero RPM fan mode build', 2450.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Core i7-14700K')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='GeForce RTX 4080 Super')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='WD Black SN850X 2TB')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='4000D Airflow')),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Peerless Assassin 120 SE'));
-
-INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
-((SELECT id FROM users WHERE username='rgb_lover'), 'Radeon Ultimate', '2025-03-10', '4K Gaming without Nvidia tax', 2850.00, TRUE);
-
-INSERT INTO build_component (build_id, component_id) VALUES
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Ryzen 9 7950X')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Radeon RX 7900 XTX')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='X670E AORUS Master')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Dominator Platinum 64GB')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Samsung 990 Pro 4TB')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='O11 Dynamic Evo')),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
-
--- Ratings & Reviews
-INSERT INTO rating_build (build_id, user_id, value) VALUES (1, 2, 5);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES (1, 2, 'Still runs everything in 2025!', CURRENT_DATE);
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='rgb_lover'), 3),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='pc_wizard'), 4);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='rgb_lover'), 'No RGB, 3 stars.', '2024-12-05'),
-((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='pc_wizard'), 'Solid entry-level build. Beats PS5 performance per dollar.', '2024-12-02'); -- ADDED
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM users WHERE username='pc_wizard'), 5);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM users WHERE username='pc_wizard'), 'Zero dropped frames at 1440p/144Hz. Encoder handles everything.', '2025-01-16');
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='budget_king'), 5),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='first_timer'), 4);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='budget_king'), 'Best FPS per dollar.', '2025-02-12'),
-((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='first_timer'), 'Great build guide for beginners. Assembly was straightforward.', '2025-02-14'); -- ADDED
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='streamer_pro'), 5),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='budget_king'), 2);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='budget_king'), 'Waaaaay too much money.', '2025-03-05'),
-((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='streamer_pro'), 'Streams in 4K while gaming at max settings. Insane power!', '2025-03-06'); -- ADDED
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='rgb_lover'), 5),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='office_guy'), 4);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='rgb_lover'), 'Beautiful RGB setup with white theme. Looks amazing!', '2024-11-21'),
-((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='office_guy'), 'Clean aesthetic but a bit pricey for the performance.', '2024-11-22');
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='linux_fan'), 5),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='first_timer'), 1);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='first_timer'), 'Could not install Windows easily.', '2024-10-20'),
-((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='linux_fan'), 'Compiles kernels like a beast. Perfect Linux workstation.', '2024-10-16'); -- ADDED
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='streamer_pro'), 2),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='budget_king'), 3);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='streamer_pro'), 'Stutters in Warzone.', '2025-01-10'),
-((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='budget_king'), 'Decent 1080p performance but could use more GPU power.', '2025-01-12'); -- ADDED
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='rgb_lover'), 2),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='office_guy'), 5);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='rgb_lover'), 'Not enough RGB! Boring aesthetics.', '2024-12-26'),
-((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='office_guy'), 'Whisper quiet even under full load. Perfect for my office!', '2024-12-27');
-
-INSERT INTO rating_build (build_id, user_id, value) VALUES
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='pc_wizard'), 5),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='linux_fan'), 5);
-INSERT INTO review (build_id, user_id, content, created_at) VALUES
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='pc_wizard'), 'Red team absolutely crushes 4K gaming. No regrets.', '2025-03-11'),
-((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='linux_fan'), 'AMD drivers work flawlessly on Linux. Peak gaming experience.', '2025-03-12');
-
-INSERT INTO case_storage_form_factors (case_id, form_factor, num_slots) VALUES
-((SELECT id FROM components WHERE name = 'H5 Flow'), '3.5', 2),
-((SELECT id FROM components WHERE name = '4000D Airflow'), '3.5', 2),
-((SELECT id FROM components WHERE name = '5000D Airflow'), '3.5', 2),
-((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), '3.5', 2),
-((SELECT id FROM components WHERE name = 'Define 7'), '3.5', 4),
-((SELECT id FROM components WHERE name = 'Meshify 2 Compact'), '3.5', 2),
-((SELECT id FROM components WHERE name = 'Lancool 216'), '3.5', 2);
-
-INSERT INTO case_storage_form_factors (case_id, form_factor, num_slots) VALUES
-((SELECT id FROM components WHERE name = 'H5 Flow'), '2.5', 4),
-((SELECT id FROM components WHERE name = '4000D Airflow'), '2.5', 2),
-((SELECT id FROM components WHERE name = 'Versa H18'), '2.5', 2);
-
-INSERT INTO suggestions (user_id, admin_id, link, admin_comment, description, status, component_type) VALUES
-(1, 4, 'https://www.gigabyte.com/Graphics-Card/GV-N4070WF3OC-12GD-rev-10', NULL, 'Consider adding the NVIDIA RTX 4070', 'pending', 'gpu'),
-(5, 4, 'https://www.amd.com/en/support/downloads/drivers.html/processors/ryzen/ryzen-7000-series/amd-ryzen-5-7600x.html#amd_support_product_spec', NULL, 'Consider adding the Ryzen 5 7600x', 'pending', 'cpu'),
-(11, NULL, 'https://www.corsair.com/us/en/p/pc-cases/cc-9011251-ww/3000d-tempered-glass-mid-tower-black-cc-9011251-ww', NULL, 'Please add the Corsair 3000D Airflow case', 'pending', 'case');`
-
-const triggerSQL = `
-CREATE OR REPLACE FUNCTION update_build_total_price()
-RETURNS TRIGGER
-LANGUAGE plpgsql AS $$
-DECLARE
-    target_build_id INT;
-BEGIN
-    IF (TG_OP = 'DELETE') THEN
-        target_build_id := OLD.build_id;
-    ELSE
-        target_build_id := NEW.build_id;
-    END IF;
-
-    UPDATE "build"
-    SET "total_price" = (
-        SELECT COALESCE(SUM(c.price * bc.num_components), 0)
-        FROM "build_component" bc
-        JOIN "components" c ON bc.component_id = c.id
-        WHERE bc.build_id = target_build_id
-    )
-    WHERE id = target_build_id;
-
-    RETURN NULL;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trigger_auto_update_price ON "build_component";
-CREATE TRIGGER trigger_auto_update_price
-AFTER INSERT OR UPDATE OR DELETE ON "build_component"
-FOR EACH ROW
-EXECUTE FUNCTION update_build_total_price();
-
-
-
-CREATE OR REPLACE FUNCTION check_review_validity()
-RETURNS TRIGGER
-LANGUAGE plpgsql AS $$
-DECLARE
-    build_owner_id INT;
-BEGIN
-    SELECT user_id INTO build_owner_id FROM "build" WHERE id = NEW.build_id;
-
-    IF NEW.user_id = build_owner_id THEN
-        RAISE EXCEPTION 'Cannot review own builds.';
-    END IF;
-
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trigger_check_self_review ON "review";
-CREATE TRIGGER trigger_check_self_review
-BEFORE INSERT ON "review"
-FOR EACH ROW
-EXECUTE FUNCTION check_review_validity();
-
-
-
-CREATE OR REPLACE FUNCTION check_rating_validity()
-RETURNS TRIGGER
-LANGUAGE plpgsql AS $$
-DECLARE
-    build_owner_id INT;
-BEGIN
-    SELECT user_id INTO build_owner_id FROM "build" WHERE id = NEW.build_id;
-
-    IF NEW.user_id = build_owner_id THEN
-        RAISE EXCEPTION 'Cannot rate own builds.';
-    END IF;
-
-    RETURN NEW;
-END;
-$$;
-
-DROP TRIGGER IF EXISTS trigger_check_self_rating ON "rating_build";
-CREATE TRIGGER trigger_check_self_rating
-BEFORE INSERT ON "rating_build"
-FOR EACH ROW
-EXECUTE FUNCTION check_rating_validity();
-`
-
-const functionSQL = `
-CREATE OR REPLACE FUNCTION get_report_top_components()
-    RETURNS TABLE (
-                      type TEXT,
-                      brand TEXT,
-                      name TEXT,
-                      usage_count BIGINT,
-                      avg_build_rating NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-SELECT
-    c.type,
-    c.brand,
-    c.name,
-    COUNT(bc.component_id) AS usage_count,
-    AVG(rb.value) AS avg_build_rating
-FROM components c
-         JOIN build_component bc ON c.id = bc.component_id
-         JOIN build b ON bc.build_id = b.id
-         JOIN rating_build rb ON b.id = rb.build_id
-WHERE b.created_at >= CURRENT_DATE - INTERVAL '1 year'
-GROUP BY c.type, c.brand, c.name
-HAVING AVG(rb.value) >= 4.5
-ORDER BY usage_count DESC, avg_build_rating DESC
-LIMIT 15;
-$$;
-
-
-
-CREATE OR REPLACE FUNCTION get_report_user_reputation_leaderboard()
-    RETURNS TABLE (
-                      username TEXT,
-                      email TEXT,
-                      approved_builds_count BIGINT,
-                      total_favorites_received BIGINT,
-                      avg_rating_received NUMERIC,
-                      reputation_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH build_stats AS (
-    SELECT
-        b.id AS build_id,
-        b.user_id,
-        COUNT(DISTINCT fb.user_id) AS favorites_count,
-        AVG(rb.value) AS avg_rating
-    FROM build b
-             LEFT JOIN favorite_build fb ON b.id = fb.build_id
-             LEFT JOIN rating_build rb ON b.id = rb.build_id
-    WHERE b.is_approved = TRUE
-    GROUP BY b.id, b.user_id
-),
-     user_stats AS (
-         SELECT
-             user_id,
-             COUNT(build_id) AS approved_builds_count,
-             COALESCE(SUM(favorites_count), 0) AS total_favorites_received,
-             AVG(avg_rating) AS avg_rating_received
-         FROM build_stats
-         GROUP BY user_id
-     )
-SELECT
-    u.username,
-    u.email,
-    us.approved_builds_count,
-    us.total_favorites_received,
-    ROUND(CAST(COALESCE(us.avg_rating_received, 0) AS numeric), 2) AS avg_rating_received,
-    (
-        (us.approved_builds_count * 10) +
-        (us.total_favorites_received * 5) +
-        (COALESCE(us.avg_rating_received, 0) * 20)
-        ) AS reputation_score
-FROM user_stats us
-         JOIN users u ON u.id = us.user_id
-ORDER BY reputation_score DESC
-LIMIT 10;
-$$;
-
-
-
-CREATE OR REPLACE FUNCTION get_report_price_to_performance()
-    RETURNS TABLE (
-                      build_name TEXT,
-                      cpu_model TEXT,
-                      gpu_model TEXT,
-                      total_price NUMERIC,
-                      performance_score NUMERIC,
-                      price_to_performance_index NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH cpu_per_build AS (
-    SELECT
-        b.id AS build_id,
-        c.name AS cpu_model,
-        cpu.cores,
-        cpu.base_clock
-    FROM build b
-             JOIN build_component bc ON b.id = bc.build_id
-             JOIN components c ON bc.component_id = c.id
-             JOIN cpu ON c.id = cpu.component_id
-    WHERE LOWER(c.type) = LOWER('CPU')
-),
-     gpu_per_build AS (
-         SELECT
-             b.id AS build_id,
-             c.name AS gpu_model,
-             gpu.vram
-         FROM build b
-                  JOIN build_component bc ON b.id = bc.build_id
-                  JOIN components c ON bc.component_id = c.id
-                  JOIN gpu ON c.id = gpu.component_id
-         WHERE LOWER(c.type) = LOWER('GPU')
-     )
-SELECT
-    b.name AS build_name,
-    cpu.cpu_model,
-    gpu.gpu_model,
-    b.total_price,
-    (cpu.cores * cpu.base_clock + gpu.vram * 100) AS performance_score,
-    ROUND(
-            CAST(
-                    (cpu.cores * cpu.base_clock + gpu.vram * 100) / NULLIF(b.total_price, 0)
-                AS numeric),
-            4
-    ) AS price_to_performance_index
-FROM build b
-         JOIN cpu_per_build cpu ON b.id = cpu.build_id
-         JOIN gpu_per_build gpu ON b.id = gpu.build_id
-WHERE b.total_price > 0
-ORDER BY price_to_performance_index DESC
-LIMIT 20;
-$$;
-
-
-
-CREATE OR REPLACE FUNCTION get_report_budget_tier_popularity()
-    RETURNS TABLE (
-                      price_tier TEXT,
-                      builds_count BIGINT,
-                      avg_favorites NUMERIC,
-                      avg_rating NUMERIC,
-                      unique_builders BIGINT,
-                      engagement_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH price_tier_builds AS (
-    SELECT
-        b.id AS build_id,
-        b.user_id,
-        b.total_price,
-        CASE
-            WHEN b.total_price < 500 THEN 'Budget'
-            WHEN b.total_price < 1000 THEN 'Mid-Range'
-            WHEN b.total_price < 2000 THEN 'High-End'
-            ELSE 'Enthusiast'
-            END AS price_tier
-    FROM build b
-    WHERE b.is_approved = TRUE
-      AND b.created_at >= CURRENT_DATE - INTERVAL '6 months'
-),
-     favorites AS (
-         SELECT
-             build_id,
-             COUNT(DISTINCT user_id) AS favorites_count
-         FROM favorite_build
-         GROUP BY build_id
-     ),
-     engagement_stats AS (
-         SELECT
-             ptb.price_tier,
-             COUNT(DISTINCT ptb.build_id) AS builds_count,
-             AVG(COALESCE(f.favorites_count, 0)) AS avg_favorites,
-             AVG(rb.value) AS avg_rating,
-             COUNT(DISTINCT ptb.user_id) AS unique_builders
-         FROM price_tier_builds ptb
-                  LEFT JOIN rating_build rb ON ptb.build_id = rb.build_id
-                  LEFT JOIN favorites f ON ptb.build_id = f.build_id
-         GROUP BY ptb.price_tier
-     )
-SELECT
-    price_tier,
-    builds_count,
-    ROUND(CAST(avg_favorites AS numeric), 1) AS avg_favorites,
-    ROUND(CAST(COALESCE(avg_rating, 0) AS numeric), 2) AS avg_rating,
-    unique_builders,
-    ROUND(
-            CAST(
-                    (builds_count * 2) +
-                    (avg_favorites * 3) +
-                    (COALESCE(avg_rating, 0) * 10) +
-                    (unique_builders * 1.5)
-                AS numeric),
-            2
-    ) AS engagement_score
-FROM engagement_stats
-ORDER BY engagement_score DESC
-LIMIT 15;
-$$;
-
-
-
-CREATE OR REPLACE FUNCTION get_report_compatibility()
-    RETURNS TABLE (
-                      cpu_combo TEXT,
-                      motherboard_chipset TEXT,
-                      total_builds BIGINT,
-                      avg_satisfaction NUMERIC,
-                      success_rate NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH cpu_mobo_pairs AS (
-    SELECT
-        cpu_comp.brand AS cpu_brand,
-        cpu_comp.name AS cpu_model,
-        mobo.chipset AS motherboard_chipset,
-        b.id AS build_id,
-        b.user_id,
-        b.created_at
-    FROM build b
-             JOIN build_component bc_cpu ON b.id = bc_cpu.build_id
-             JOIN components cpu_comp ON bc_cpu.component_id = cpu_comp.id
-             JOIN cpu ON cpu.component_id = cpu_comp.id
-             JOIN build_component bc_mobo ON b.id = bc_mobo.build_id
-             JOIN components mobo_comp ON bc_mobo.component_id = mobo_comp.id
-             JOIN motherboard mobo ON mobo.component_id = mobo_comp.id
-    WHERE b.is_approved = TRUE
-),
-     recent_activity AS (
-         SELECT DISTINCT build_id
-         FROM review
-         WHERE created_at >= CURRENT_DATE - INTERVAL '3 months'
-     ),
-     pair_metrics AS (
-         SELECT
-             cmp.cpu_brand,
-             cmp.cpu_model,
-             cmp.motherboard_chipset,
-             COUNT(DISTINCT cmp.build_id) AS total_builds,
-             AVG(COALESCE(rb.value, 0)) AS avg_satisfaction,
-             COUNT(DISTINCT ra.build_id) AS active_builds
-         FROM cpu_mobo_pairs cmp
-                  LEFT JOIN rating_build rb ON cmp.build_id = rb.build_id
-                  LEFT JOIN recent_activity ra ON cmp.build_id = ra.build_id
-         GROUP BY
-             cmp.cpu_brand,
-             cmp.cpu_model,
-             cmp.motherboard_chipset
-         HAVING COUNT(DISTINCT cmp.build_id) >= 2
-     )
-SELECT
-    CONCAT(cpu_brand, ' ', cpu_model) AS cpu_combo,
-    motherboard_chipset,
-    total_builds,
-    ROUND(CAST(avg_satisfaction AS numeric), 2) AS avg_satisfaction,
-    ROUND(
-            CAST(
-                    (avg_satisfaction / 5.0) * 0.6 +
-                    (CAST(active_builds AS DECIMAL) / total_builds) * 0.4
-                AS numeric),
-            3
-    ) AS success_rate
-FROM pair_metrics
-ORDER BY success_rate DESC, total_builds DESC
-LIMIT 15;
-$$;
-
-
-
-CREATE OR REPLACE FUNCTION get_report_storage_optimization()
-    RETURNS TABLE (
-                      config_type TEXT,
-                      ssd_brand TEXT,
-                      builds_count BIGINT,
-                      avg_storage_cost NUMERIC,
-                      avg_total_capacity_gb NUMERIC,
-                      avg_build_rating NUMERIC,
-                      storage_cost_pct NUMERIC,
-                      optimization_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH storage_configs AS (
-    SELECT
-        b.id AS build_id,
-        b.total_price,
-
-        ssd_comp.brand AS ssd_brand,
-        ssd_storage.capacity AS ssd_capacity,
-        ssd_comp.price AS ssd_price,
-
-        hdd_storage.capacity AS hdd_capacity,
-        hdd_comp.price AS hdd_price,
-
-        CASE
-            WHEN hdd_storage.capacity IS NULL THEN 'SSD-Only'
-            WHEN ssd_storage.capacity < 512 THEN 'SSD-Boot-HDD-Storage'
-            ELSE 'SSD-Primary-HDD-Archive'
-            END AS config_type
-    FROM build b
-             JOIN build_component bc_ssd ON b.id = bc_ssd.build_id
-             JOIN components ssd_comp ON bc_ssd.component_id = ssd_comp.id
-             JOIN storage ssd_storage ON ssd_storage.component_id = ssd_comp.id
-
-             LEFT JOIN build_component bc_hdd ON b.id = bc_hdd.build_id
-             LEFT JOIN components hdd_comp ON bc_hdd.component_id = hdd_comp.id
-             LEFT JOIN storage hdd_storage ON hdd_storage.component_id = hdd_comp.id
-
-    WHERE ssd_comp.type = 'storage'
-      AND b.is_approved = TRUE
-      AND b.created_at >= CURRENT_DATE - INTERVAL '1 year'
-
-      AND (
-        ssd_storage.type ILIKE '%nvme%'
-            OR ssd_storage.type ILIKE '%ssd%'
-            OR ssd_storage.type ILIKE '%m.2%'
-            OR ssd_storage.form_factor ILIKE '%m.2%'
-        )
-      AND (
-        hdd_storage.component_id IS NULL
-            OR hdd_storage.type ILIKE '%hdd%'
-            OR hdd_storage.form_factor ILIKE '%3.5%'
-        )
-),
-     config_performance AS (
-         SELECT
-             sc.config_type,
-             sc.ssd_brand,
-             COUNT(sc.build_id) AS builds_count,
-             AVG(sc.ssd_price + COALESCE(sc.hdd_price, 0)) AS avg_storage_cost,
-             AVG(sc.ssd_capacity + COALESCE(sc.hdd_capacity, 0)) AS avg_total_capacity,
-             AVG(rb.value) AS avg_build_rating,
-             AVG((sc.ssd_price + COALESCE(sc.hdd_price, 0)) / NULLIF(sc.total_price, 0)) AS storage_cost_ratio
-         FROM storage_configs sc
-                  LEFT JOIN rating_build rb ON sc.build_id = rb.build_id
-         GROUP BY sc.config_type, sc.ssd_brand
-         HAVING COUNT(sc.build_id) >= 2
-     )
-SELECT
-    config_type,
-    ssd_brand,
-    builds_count,
-    ROUND(CAST(avg_storage_cost AS numeric), 2) AS avg_storage_cost,
-    ROUND(CAST(avg_total_capacity AS numeric), 0) AS avg_total_capacity_gb,
-    ROUND(CAST(COALESCE(avg_build_rating, 0) AS numeric), 2) AS avg_build_rating,
-    ROUND(CAST(COALESCE(storage_cost_ratio, 0) * 100 AS numeric), 1) AS storage_cost_pct,
-    ROUND(
-            CAST(
-                    (COALESCE(avg_build_rating, 0) / 5.0 * 40) +
-                    (avg_total_capacity / NULLIF(avg_storage_cost, 0) * 0.5) +
-                    ((1 - COALESCE(storage_cost_ratio, 0)) * 30) +
-                    (LN(CAST(builds_count + 1 AS numeric)) * 5)
-                AS numeric),
-            2
-    ) AS optimization_score
-FROM config_performance
-ORDER BY optimization_score DESC, builds_count DESC
-LIMIT 15;
-$$;
-`
-
-async function seed() {
-    if (!process.env.DATABASE_URL) {
-        throw new Error('DATABASE_URL environment variable not set');
-    }
-
-    const client = new pg.Client({
-        connectionString: process.env.DATABASE_URL,
-    });
-
-    try {
-        await client.connect();
-
-        console.log('Checking if database needs seeding...');
-
-        const result = await client.query('SELECT COUNT(*) as count FROM users');
-        const count = parseInt(result.rows[0].count);
-
-        if (count === 0) {
-            console.log('Seeding initial data...');
-            await client.query(dataSQL);
-            console.log('Data seeded successfully.');
-        } else {
-            console.log('Database already contains data, skipping data seed.');
-        }
-
-        console.log('Applying Database Triggers...');
-        await client.query(triggerSQL);
-
-        console.log('Applying Database Functions...');
-        await client.query(functionSQL);
-
-        console.log('Database seeded successfully...');
-    } catch (error) {
-        console.error('Seed failed:', error);
-        throw error;
-    } finally {
-        await client.end();
-    }
-}
-
-seed().catch((err) => {
-    console.error(err);
-    process.exit(1);
-});
Index: tabase/migrations/0000_colorful_scream.sql
===================================================================
--- database/migrations/0000_colorful_scream.sql	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,595 +1,0 @@
-CREATE TABLE "build_component" (
-	"build_id" integer NOT NULL,
-	"component_id" integer NOT NULL,
-	"num_components" integer DEFAULT 1 NOT NULL,
-	CONSTRAINT "build_component_build_id_component_id_pk" PRIMARY KEY("build_id","component_id")
-);
---> statement-breakpoint
-CREATE TABLE "build" (
-	"id" serial PRIMARY KEY NOT NULL,
-	"user_id" integer NOT NULL,
-	"name" text NOT NULL,
-	"created_at" date NOT NULL,
-	"description" text,
-	"total_price" numeric NOT NULL,
-	"is_approved" boolean NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "favorite_build" (
-	"build_id" integer NOT NULL,
-	"user_id" integer NOT NULL,
-	CONSTRAINT "favorite_build_build_id_user_id_pk" PRIMARY KEY("build_id","user_id")
-);
---> statement-breakpoint
-CREATE TABLE "rating_build" (
-	"build_id" integer NOT NULL,
-	"user_id" integer NOT NULL,
-	"value" numeric NOT NULL,
-	CONSTRAINT "rating_build_build_id_user_id_pk" PRIMARY KEY("build_id","user_id"),
-	CONSTRAINT "check_value" CHECK ("rating_build"."value" BETWEEN 1 AND 5)
-);
---> statement-breakpoint
-CREATE TABLE "review" (
-	"id" serial PRIMARY KEY NOT NULL,
-	"build_id" integer NOT NULL,
-	"user_id" integer NOT NULL,
-	"content" text NOT NULL,
-	"created_at" date NOT NULL,
-	CONSTRAINT "review_build_id_user_id_unique" UNIQUE("build_id","user_id")
-);
---> statement-breakpoint
-CREATE TABLE "cpu" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"socket" text NOT NULL,
-	"cores" integer NOT NULL,
-	"threads" integer NOT NULL,
-	"base_clock" numeric NOT NULL,
-	"boost_clock" numeric,
-	"tdp" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "gpu" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"vram" numeric NOT NULL,
-	"tdp" numeric NOT NULL,
-	"base_clock" numeric,
-	"boost_clock" numeric,
-	"chipset" text NOT NULL,
-	"length" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "cables" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"length_cm" numeric NOT NULL,
-	"type" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "case_mobo_form_factors" (
-	"case_id" integer NOT NULL,
-	"form_factor" text NOT NULL,
-	CONSTRAINT "case_mobo_form_factors_case_id_form_factor_pk" PRIMARY KEY("case_id","form_factor")
-);
---> statement-breakpoint
-CREATE TABLE "case_ps_form_factors" (
-	"case_id" integer NOT NULL,
-	"form_factor" text NOT NULL,
-	CONSTRAINT "case_ps_form_factors_case_id_form_factor_pk" PRIMARY KEY("case_id","form_factor")
-);
---> statement-breakpoint
-CREATE TABLE "case_storage_form_factors" (
-	"case_id" integer NOT NULL,
-	"form_factor" text NOT NULL,
-	"num_slots" integer NOT NULL,
-	CONSTRAINT "case_storage_form_factors_case_id_form_factor_pk" PRIMARY KEY("case_id","form_factor")
-);
---> statement-breakpoint
-CREATE TABLE "components" (
-	"id" serial PRIMARY KEY NOT NULL,
-	"name" text NOT NULL,
-	"brand" text NOT NULL,
-	"price" numeric NOT NULL,
-	"img_url" text,
-	"type" text NOT NULL,
-	CONSTRAINT "check_type" CHECK ("components"."type" in 
-      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card'))
-);
---> statement-breakpoint
-CREATE TABLE "cooler_cpu_sockets" (
-	"cooler_id" integer NOT NULL,
-	"socket" text NOT NULL,
-	CONSTRAINT "cooler_cpu_sockets_cooler_id_socket_pk" PRIMARY KEY("cooler_id","socket")
-);
---> statement-breakpoint
-CREATE TABLE "cooler" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"type" text NOT NULL,
-	"height" numeric NOT NULL,
-	"max_tdp_supported" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "memory_card" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"num_slots" integer NOT NULL,
-	"interface" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "memory" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"type" text NOT NULL,
-	"speed" numeric NOT NULL,
-	"capacity" numeric NOT NULL,
-	"modules" integer NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "motherboard" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"socket" text NOT NULL,
-	"chipset" text NOT NULL,
-	"form_factor" text NOT NULL,
-	"ram_type" text NOT NULL,
-	"num_ram_slots" integer NOT NULL,
-	"max_ram_capacity" numeric NOT NULL,
-	"pci_express_slots" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "network_adapter" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"wifi_version" text NOT NULL,
-	"interface" text NOT NULL,
-	"num_antennas" integer NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "network_card" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"num_ports" integer NOT NULL,
-	"speed" numeric NOT NULL,
-	"interface" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "optical_drive" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"form_factor" text NOT NULL,
-	"type" text NOT NULL,
-	"interface" text NOT NULL,
-	"write_speed" numeric NOT NULL,
-	"read_speed" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "pc_case" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"cooler_max_height" numeric NOT NULL,
-	"gpu_max_length" numeric NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "power_supply" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"type" text NOT NULL,
-	"wattage" numeric NOT NULL,
-	"form_factor" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "sound_card" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"sample_rate" numeric NOT NULL,
-	"bit_depth" numeric NOT NULL,
-	"chipset" text NOT NULL,
-	"interface" text NOT NULL,
-	"channel" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "storage" (
-	"component_id" integer PRIMARY KEY NOT NULL,
-	"type" text NOT NULL,
-	"capacity" numeric NOT NULL,
-	"form_factor" text NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "admins" (
-	"user_id" integer PRIMARY KEY NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "suggestions" (
-	"id" serial PRIMARY KEY NOT NULL,
-	"user_id" integer NOT NULL,
-	"admin_id" integer,
-	"link" text NOT NULL,
-	"admin_comment" text,
-	"description" text,
-	"status" text DEFAULT 'pending' NOT NULL,
-	"component_type" text NOT NULL,
-	CONSTRAINT "check_status" CHECK ("suggestions"."status" in ('pending', 'approved', 'rejected')),
-	CONSTRAINT "check_type" CHECK ("suggestions"."component_type" in 
-      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card'))
-);
---> statement-breakpoint
-CREATE TABLE "users" (
-	"id" serial PRIMARY KEY NOT NULL,
-	"username" text NOT NULL,
-	"password" text NOT NULL,
-	"email" text NOT NULL,
-	CONSTRAINT "users_username_unique" UNIQUE("username"),
-	CONSTRAINT "users_email_unique" UNIQUE("email")
-);
---> statement-breakpoint
-ALTER TABLE "build_component" ADD CONSTRAINT "build_component_build_id_build_id_fk" FOREIGN KEY ("build_id") REFERENCES "public"."build"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "build_component" ADD CONSTRAINT "build_component_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "build" ADD CONSTRAINT "build_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "favorite_build" ADD CONSTRAINT "favorite_build_build_id_build_id_fk" FOREIGN KEY ("build_id") REFERENCES "public"."build"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "favorite_build" ADD CONSTRAINT "favorite_build_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "rating_build" ADD CONSTRAINT "rating_build_build_id_build_id_fk" FOREIGN KEY ("build_id") REFERENCES "public"."build"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "rating_build" ADD CONSTRAINT "rating_build_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "review" ADD CONSTRAINT "review_build_id_build_id_fk" FOREIGN KEY ("build_id") REFERENCES "public"."build"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "review" ADD CONSTRAINT "review_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "cpu" ADD CONSTRAINT "cpu_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "gpu" ADD CONSTRAINT "gpu_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "cables" ADD CONSTRAINT "cables_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "case_mobo_form_factors" ADD CONSTRAINT "case_mobo_form_factors_case_id_pc_case_component_id_fk" FOREIGN KEY ("case_id") REFERENCES "public"."pc_case"("component_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "case_ps_form_factors" ADD CONSTRAINT "case_ps_form_factors_case_id_pc_case_component_id_fk" FOREIGN KEY ("case_id") REFERENCES "public"."pc_case"("component_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "case_storage_form_factors" ADD CONSTRAINT "case_storage_form_factors_case_id_pc_case_component_id_fk" FOREIGN KEY ("case_id") REFERENCES "public"."pc_case"("component_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "cooler_cpu_sockets" ADD CONSTRAINT "cooler_cpu_sockets_cooler_id_cooler_component_id_fk" FOREIGN KEY ("cooler_id") REFERENCES "public"."cooler"("component_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "cooler" ADD CONSTRAINT "cooler_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "memory_card" ADD CONSTRAINT "memory_card_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "memory" ADD CONSTRAINT "memory_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "motherboard" ADD CONSTRAINT "motherboard_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "network_adapter" ADD CONSTRAINT "network_adapter_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "network_card" ADD CONSTRAINT "network_card_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "optical_drive" ADD CONSTRAINT "optical_drive_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "pc_case" ADD CONSTRAINT "pc_case_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "power_supply" ADD CONSTRAINT "power_supply_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "sound_card" ADD CONSTRAINT "sound_card_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "storage" ADD CONSTRAINT "storage_component_id_components_id_fk" FOREIGN KEY ("component_id") REFERENCES "public"."components"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "admins" ADD CONSTRAINT "admins_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "suggestions" ADD CONSTRAINT "suggestions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "suggestions" ADD CONSTRAINT "suggestions_admin_id_admins_user_id_fk" FOREIGN KEY ("admin_id") REFERENCES "public"."admins"("user_id") ON DELETE set null ON UPDATE cascade;
-
-CREATE OR REPLACE FUNCTION get_report_top_components()
-    RETURNS TABLE (
-                      type TEXT,
-                      brand TEXT,
-                      name TEXT,
-                      usage_count BIGINT,
-                      avg_build_rating NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-SELECT
-    c.type,
-    c.brand,
-    c.name,
-    COUNT(bc.component_id) AS usage_count,
-    AVG(rb.value) AS avg_build_rating
-FROM components c
-         JOIN build_component bc ON c.id = bc.component_id
-         JOIN build b ON bc.build_id = b.id
-         JOIN rating_build rb ON b.id = rb.build_id
-WHERE b.created_at >= CURRENT_DATE - INTERVAL '1 year'
-GROUP BY c.type, c.brand, c.name
-HAVING AVG(rb.value) >= 4.5
-ORDER BY usage_count DESC, avg_build_rating DESC
-LIMIT 15;
-$$;
-
-CREATE OR REPLACE FUNCTION get_report_user_reputation_leaderboard()
-    RETURNS TABLE (
-                      username TEXT,
-                      email TEXT,
-                      approved_builds_count BIGINT,
-                      total_favorites_received BIGINT,
-                      avg_rating_received NUMERIC,
-                      reputation_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH build_stats AS (
-    SELECT
-        b.id AS build_id,
-        b.user_id,
-        COUNT(DISTINCT fb.user_id) AS favorites_count,
-        AVG(rb.value) AS avg_rating
-    FROM build b
-             LEFT JOIN favorite_build fb ON b.id = fb.build_id
-             LEFT JOIN rating_build rb ON b.id = rb.build_id
-    WHERE b.is_approved = TRUE
-    GROUP BY b.id, b.user_id
-),
-     user_stats AS (
-         SELECT
-             user_id,
-             COUNT(build_id) AS approved_builds_count,
-             COALESCE(SUM(favorites_count), 0) AS total_favorites_received,
-             AVG(avg_rating) AS avg_rating_received
-         FROM build_stats
-         GROUP BY user_id
-     )
-SELECT
-    u.username,
-    u.email,
-    us.approved_builds_count,
-    us.total_favorites_received,
-    ROUND(CAST(COALESCE(us.avg_rating_received, 0) AS numeric), 2) AS avg_rating_received,
-    (
-        (us.approved_builds_count * 10) +
-        (us.total_favorites_received * 5) +
-        (COALESCE(us.avg_rating_received, 0) * 20)
-        ) AS reputation_score
-FROM user_stats us
-         JOIN users u ON u.id = us.user_id
-ORDER BY reputation_score DESC
-LIMIT 10;
-$$;
-
-CREATE OR REPLACE FUNCTION get_report_price_to_performance()
-    RETURNS TABLE (
-                      build_name TEXT,
-                      cpu_model TEXT,
-                      gpu_model TEXT,
-                      total_price NUMERIC,
-                      performance_score NUMERIC,
-                      price_to_performance_index NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH cpu_per_build AS (
-    SELECT
-        b.id AS build_id,
-        c.name AS cpu_model,
-        cpu.cores,
-        cpu.base_clock
-    FROM build b
-             JOIN build_component bc ON b.id = bc.build_id
-             JOIN components c ON bc.component_id = c.id
-             JOIN cpu ON c.id = cpu.component_id
-    WHERE LOWER(c.type) = LOWER('CPU')
-),
-     gpu_per_build AS (
-         SELECT
-             b.id AS build_id,
-             c.name AS gpu_model,
-             gpu.vram
-         FROM build b
-                  JOIN build_component bc ON b.id = bc.build_id
-                  JOIN components c ON bc.component_id = c.id
-                  JOIN gpu ON c.id = gpu.component_id
-         WHERE LOWER(c.type) = LOWER('GPU')
-     )
-SELECT
-    b.name AS build_name,
-    cpu.cpu_model,
-    gpu.gpu_model,
-    b.total_price,
-    (cpu.cores * cpu.base_clock + gpu.vram * 100) AS performance_score,
-    ROUND(
-            CAST(
-                    (cpu.cores * cpu.base_clock + gpu.vram * 100) / NULLIF(b.total_price, 0)
-                AS numeric),
-            4
-    ) AS price_to_performance_index
-FROM build b
-         JOIN cpu_per_build cpu ON b.id = cpu.build_id
-         JOIN gpu_per_build gpu ON b.id = gpu.build_id
-WHERE b.total_price > 0
-ORDER BY price_to_performance_index DESC
-LIMIT 20;
-$$;
-
-CREATE OR REPLACE FUNCTION get_report_budget_tier_popularity()
-    RETURNS TABLE (
-                      price_tier TEXT,
-                      builds_count BIGINT,
-                      avg_favorites NUMERIC,
-                      avg_rating NUMERIC,
-                      unique_builders BIGINT,
-                      engagement_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH price_tier_builds AS (
-    SELECT
-        b.id AS build_id,
-        b.user_id,
-        b.total_price,
-        CASE
-            WHEN b.total_price < 500 THEN 'Budget'
-            WHEN b.total_price < 1000 THEN 'Mid-Range'
-            WHEN b.total_price < 2000 THEN 'High-End'
-            ELSE 'Enthusiast'
-            END AS price_tier
-    FROM build b
-    WHERE b.is_approved = TRUE
-      AND b.created_at >= CURRENT_DATE - INTERVAL '6 months'
-),
-     favorites AS (
-         SELECT
-             build_id,
-             COUNT(DISTINCT user_id) AS favorites_count
-         FROM favorite_build
-         GROUP BY build_id
-     ),
-     engagement_stats AS (
-         SELECT
-             ptb.price_tier,
-             COUNT(DISTINCT ptb.build_id) AS builds_count,
-             AVG(COALESCE(f.favorites_count, 0)) AS avg_favorites,
-             AVG(rb.value) AS avg_rating,
-             COUNT(DISTINCT ptb.user_id) AS unique_builders
-         FROM price_tier_builds ptb
-                  LEFT JOIN rating_build rb ON ptb.build_id = rb.build_id
-                  LEFT JOIN favorites f ON ptb.build_id = f.build_id
-         GROUP BY ptb.price_tier
-     )
-SELECT
-    price_tier,
-    builds_count,
-    ROUND(CAST(avg_favorites AS numeric), 1) AS avg_favorites,
-    ROUND(CAST(COALESCE(avg_rating, 0) AS numeric), 2) AS avg_rating,
-    unique_builders,
-    ROUND(
-            CAST(
-                    (builds_count * 2) +
-                    (avg_favorites * 3) +
-                    (COALESCE(avg_rating, 0) * 10) +
-                    (unique_builders * 1.5)
-                AS numeric),
-            2
-    ) AS engagement_score
-FROM engagement_stats
-ORDER BY engagement_score DESC
-LIMIT 15;
-$$;
-
-CREATE OR REPLACE FUNCTION get_report_compatibility()
-    RETURNS TABLE (
-                      cpu_combo TEXT,
-                      motherboard_chipset TEXT,
-                      total_builds BIGINT,
-                      avg_satisfaction NUMERIC,
-                      success_rate NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH cpu_mobo_pairs AS (
-    SELECT
-        cpu_comp.brand AS cpu_brand,
-        cpu_comp.name AS cpu_model,
-        mobo.chipset AS motherboard_chipset,
-        b.id AS build_id,
-        b.user_id,
-        b.created_at
-    FROM build b
-             JOIN build_component bc_cpu ON b.id = bc_cpu.build_id
-             JOIN components cpu_comp ON bc_cpu.component_id = cpu_comp.id
-             JOIN cpu ON cpu.component_id = cpu_comp.id
-             JOIN build_component bc_mobo ON b.id = bc_mobo.build_id
-             JOIN components mobo_comp ON bc_mobo.component_id = mobo_comp.id
-             JOIN motherboard mobo ON mobo.component_id = mobo_comp.id
-    WHERE b.is_approved = TRUE
-),
-     recent_activity AS (
-         SELECT DISTINCT build_id
-         FROM review
-         WHERE created_at >= CURRENT_DATE - INTERVAL '3 months'
-     ),
-     pair_metrics AS (
-         SELECT
-             cmp.cpu_brand,
-             cmp.cpu_model,
-             cmp.motherboard_chipset,
-             COUNT(DISTINCT cmp.build_id) AS total_builds,
-             AVG(COALESCE(rb.value, 0)) AS avg_satisfaction,
-             COUNT(DISTINCT ra.build_id) AS active_builds
-         FROM cpu_mobo_pairs cmp
-                  LEFT JOIN rating_build rb ON cmp.build_id = rb.build_id
-                  LEFT JOIN recent_activity ra ON cmp.build_id = ra.build_id
-         GROUP BY
-             cmp.cpu_brand,
-             cmp.cpu_model,
-             cmp.motherboard_chipset
-         HAVING COUNT(DISTINCT cmp.build_id) >= 2
-     )
-SELECT
-    CONCAT(cpu_brand, ' ', cpu_model) AS cpu_combo,
-    motherboard_chipset,
-    total_builds,
-    ROUND(CAST(avg_satisfaction AS numeric), 2) AS avg_satisfaction,
-    ROUND(
-            CAST(
-                    (avg_satisfaction / 5.0) * 0.6 +
-                    (CAST(active_builds AS DECIMAL) / total_builds) * 0.4
-                AS numeric),
-            3
-    ) AS success_rate
-FROM pair_metrics
-ORDER BY success_rate DESC, total_builds DESC
-LIMIT 15;
-$$;
-
-CREATE OR REPLACE FUNCTION get_report_storage_optimization()
-    RETURNS TABLE (
-                      config_type TEXT,
-                      ssd_brand TEXT,
-                      builds_count BIGINT,
-                      avg_storage_cost NUMERIC,
-                      avg_total_capacity_gb NUMERIC,
-                      avg_build_rating NUMERIC,
-                      storage_cost_pct NUMERIC,
-                      optimization_score NUMERIC
-                  )
-    LANGUAGE sql
-AS $$
-WITH storage_configs AS (
-    SELECT
-        b.id AS build_id,
-        b.total_price,
-
-        ssd_comp.brand AS ssd_brand,
-        ssd_storage.capacity AS ssd_capacity,
-        ssd_comp.price AS ssd_price,
-
-        hdd_storage.capacity AS hdd_capacity,
-        hdd_comp.price AS hdd_price,
-
-        CASE
-            WHEN hdd_storage.capacity IS NULL THEN 'SSD-Only'
-            WHEN ssd_storage.capacity < 512 THEN 'SSD-Boot-HDD-Storage'
-            ELSE 'SSD-Primary-HDD-Archive'
-            END AS config_type
-    FROM build b
-             JOIN build_component bc_ssd ON b.id = bc_ssd.build_id
-             JOIN components ssd_comp ON bc_ssd.component_id = ssd_comp.id
-             JOIN storage ssd_storage ON ssd_storage.component_id = ssd_comp.id
-
-             LEFT JOIN build_component bc_hdd ON b.id = bc_hdd.build_id
-             LEFT JOIN components hdd_comp ON bc_hdd.component_id = hdd_comp.id
-             LEFT JOIN storage hdd_storage ON hdd_storage.component_id = hdd_comp.id
-
-    WHERE ssd_comp.type = 'storage'
-      AND b.is_approved = TRUE
-      AND b.created_at >= CURRENT_DATE - INTERVAL '1 year'
-
-      AND (
-        ssd_storage.type ILIKE '%nvme%'
-            OR ssd_storage.type ILIKE '%ssd%'
-            OR ssd_storage.type ILIKE '%m.2%'
-            OR ssd_storage.form_factor ILIKE '%m.2%'
-        )
-      AND (
-        hdd_storage.component_id IS NULL
-            OR hdd_storage.type ILIKE '%hdd%'
-            OR hdd_storage.form_factor ILIKE '%3.5%'
-        )
-),
-     config_performance AS (
-         SELECT
-             sc.config_type,
-             sc.ssd_brand,
-             COUNT(sc.build_id) AS builds_count,
-             AVG(sc.ssd_price + COALESCE(sc.hdd_price, 0)) AS avg_storage_cost,
-             AVG(sc.ssd_capacity + COALESCE(sc.hdd_capacity, 0)) AS avg_total_capacity,
-             AVG(rb.value) AS avg_build_rating,
-             AVG((sc.ssd_price + COALESCE(sc.hdd_price, 0)) / NULLIF(sc.total_price, 0)) AS storage_cost_ratio
-         FROM storage_configs sc
-                  LEFT JOIN rating_build rb ON sc.build_id = rb.build_id
-         GROUP BY sc.config_type, sc.ssd_brand
-         HAVING COUNT(sc.build_id) >= 2
-     )
-SELECT
-    config_type,
-    ssd_brand,
-    builds_count,
-    ROUND(CAST(avg_storage_cost AS numeric), 2) AS avg_storage_cost,
-    ROUND(CAST(avg_total_capacity AS numeric), 0) AS avg_total_capacity_gb,
-    ROUND(CAST(COALESCE(avg_build_rating, 0) AS numeric), 2) AS avg_build_rating,
-    ROUND(CAST(COALESCE(storage_cost_ratio, 0) * 100 AS numeric), 1) AS storage_cost_pct,
-    ROUND(
-            CAST(
-                    (COALESCE(avg_build_rating, 0) / 5.0 * 40) +
-                    (avg_total_capacity / NULLIF(avg_storage_cost, 0) * 0.5) +
-                    ((1 - COALESCE(storage_cost_ratio, 0)) * 30) +
-                    (LN(CAST(builds_count + 1 AS numeric)) * 5)
-                AS numeric),
-            2
-    ) AS optimization_score
-FROM config_performance
-ORDER BY optimization_score DESC, builds_count DESC
-LIMIT 15;
-$$;
Index: tabase/migrations/meta/0000_snapshot.json
===================================================================
--- database/migrations/meta/0000_snapshot.json	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,1582 +1,0 @@
-{
-  "id": "57cce218-a083-4ce5-a7f6-734995e78d37",
-  "prevId": "00000000-0000-0000-0000-000000000000",
-  "version": "7",
-  "dialect": "postgresql",
-  "tables": {
-    "public.build_component": {
-      "name": "build_component",
-      "schema": "",
-      "columns": {
-        "build_id": {
-          "name": "build_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "num_components": {
-          "name": "num_components",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true,
-          "default": 1
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "build_component_build_id_build_id_fk": {
-          "name": "build_component_build_id_build_id_fk",
-          "tableFrom": "build_component",
-          "tableTo": "build",
-          "columnsFrom": [
-            "build_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        },
-        "build_component_component_id_components_id_fk": {
-          "name": "build_component_component_id_components_id_fk",
-          "tableFrom": "build_component",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "build_component_build_id_component_id_pk": {
-          "name": "build_component_build_id_component_id_pk",
-          "columns": [
-            "build_id",
-            "component_id"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.build": {
-      "name": "build",
-      "schema": "",
-      "columns": {
-        "id": {
-          "name": "id",
-          "type": "serial",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "name": {
-          "name": "name",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "created_at": {
-          "name": "created_at",
-          "type": "date",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "description": {
-          "name": "description",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "total_price": {
-          "name": "total_price",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "is_approved": {
-          "name": "is_approved",
-          "type": "boolean",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "build_user_id_users_id_fk": {
-          "name": "build_user_id_users_id_fk",
-          "tableFrom": "build",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.favorite_build": {
-      "name": "favorite_build",
-      "schema": "",
-      "columns": {
-        "build_id": {
-          "name": "build_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "favorite_build_build_id_build_id_fk": {
-          "name": "favorite_build_build_id_build_id_fk",
-          "tableFrom": "favorite_build",
-          "tableTo": "build",
-          "columnsFrom": [
-            "build_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        },
-        "favorite_build_user_id_users_id_fk": {
-          "name": "favorite_build_user_id_users_id_fk",
-          "tableFrom": "favorite_build",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "favorite_build_build_id_user_id_pk": {
-          "name": "favorite_build_build_id_user_id_pk",
-          "columns": [
-            "build_id",
-            "user_id"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.rating_build": {
-      "name": "rating_build",
-      "schema": "",
-      "columns": {
-        "build_id": {
-          "name": "build_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "value": {
-          "name": "value",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "rating_build_build_id_build_id_fk": {
-          "name": "rating_build_build_id_build_id_fk",
-          "tableFrom": "rating_build",
-          "tableTo": "build",
-          "columnsFrom": [
-            "build_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        },
-        "rating_build_user_id_users_id_fk": {
-          "name": "rating_build_user_id_users_id_fk",
-          "tableFrom": "rating_build",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "rating_build_build_id_user_id_pk": {
-          "name": "rating_build_build_id_user_id_pk",
-          "columns": [
-            "build_id",
-            "user_id"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {
-        "check_value": {
-          "name": "check_value",
-          "value": "\"rating_build\".\"value\" BETWEEN 1 AND 5"
-        }
-      },
-      "isRLSEnabled": false
-    },
-    "public.review": {
-      "name": "review",
-      "schema": "",
-      "columns": {
-        "id": {
-          "name": "id",
-          "type": "serial",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "build_id": {
-          "name": "build_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "content": {
-          "name": "content",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "created_at": {
-          "name": "created_at",
-          "type": "date",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "review_build_id_build_id_fk": {
-          "name": "review_build_id_build_id_fk",
-          "tableFrom": "review",
-          "tableTo": "build",
-          "columnsFrom": [
-            "build_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        },
-        "review_user_id_users_id_fk": {
-          "name": "review_user_id_users_id_fk",
-          "tableFrom": "review",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {
-        "review_build_id_user_id_unique": {
-          "name": "review_build_id_user_id_unique",
-          "nullsNotDistinct": false,
-          "columns": [
-            "build_id",
-            "user_id"
-          ]
-        }
-      },
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.cpu": {
-      "name": "cpu",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "socket": {
-          "name": "socket",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "cores": {
-          "name": "cores",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "threads": {
-          "name": "threads",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "base_clock": {
-          "name": "base_clock",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "boost_clock": {
-          "name": "boost_clock",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "tdp": {
-          "name": "tdp",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "cpu_component_id_components_id_fk": {
-          "name": "cpu_component_id_components_id_fk",
-          "tableFrom": "cpu",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.gpu": {
-      "name": "gpu",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "vram": {
-          "name": "vram",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "tdp": {
-          "name": "tdp",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "base_clock": {
-          "name": "base_clock",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "boost_clock": {
-          "name": "boost_clock",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "chipset": {
-          "name": "chipset",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "length": {
-          "name": "length",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "gpu_component_id_components_id_fk": {
-          "name": "gpu_component_id_components_id_fk",
-          "tableFrom": "gpu",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.cables": {
-      "name": "cables",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "length_cm": {
-          "name": "length_cm",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "cables_component_id_components_id_fk": {
-          "name": "cables_component_id_components_id_fk",
-          "tableFrom": "cables",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.case_mobo_form_factors": {
-      "name": "case_mobo_form_factors",
-      "schema": "",
-      "columns": {
-        "case_id": {
-          "name": "case_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "case_mobo_form_factors_case_id_pc_case_component_id_fk": {
-          "name": "case_mobo_form_factors_case_id_pc_case_component_id_fk",
-          "tableFrom": "case_mobo_form_factors",
-          "tableTo": "pc_case",
-          "columnsFrom": [
-            "case_id"
-          ],
-          "columnsTo": [
-            "component_id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "case_mobo_form_factors_case_id_form_factor_pk": {
-          "name": "case_mobo_form_factors_case_id_form_factor_pk",
-          "columns": [
-            "case_id",
-            "form_factor"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.case_ps_form_factors": {
-      "name": "case_ps_form_factors",
-      "schema": "",
-      "columns": {
-        "case_id": {
-          "name": "case_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "case_ps_form_factors_case_id_pc_case_component_id_fk": {
-          "name": "case_ps_form_factors_case_id_pc_case_component_id_fk",
-          "tableFrom": "case_ps_form_factors",
-          "tableTo": "pc_case",
-          "columnsFrom": [
-            "case_id"
-          ],
-          "columnsTo": [
-            "component_id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "case_ps_form_factors_case_id_form_factor_pk": {
-          "name": "case_ps_form_factors_case_id_form_factor_pk",
-          "columns": [
-            "case_id",
-            "form_factor"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.case_storage_form_factors": {
-      "name": "case_storage_form_factors",
-      "schema": "",
-      "columns": {
-        "case_id": {
-          "name": "case_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "num_slots": {
-          "name": "num_slots",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "case_storage_form_factors_case_id_pc_case_component_id_fk": {
-          "name": "case_storage_form_factors_case_id_pc_case_component_id_fk",
-          "tableFrom": "case_storage_form_factors",
-          "tableTo": "pc_case",
-          "columnsFrom": [
-            "case_id"
-          ],
-          "columnsTo": [
-            "component_id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "case_storage_form_factors_case_id_form_factor_pk": {
-          "name": "case_storage_form_factors_case_id_form_factor_pk",
-          "columns": [
-            "case_id",
-            "form_factor"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.components": {
-      "name": "components",
-      "schema": "",
-      "columns": {
-        "id": {
-          "name": "id",
-          "type": "serial",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "name": {
-          "name": "name",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "brand": {
-          "name": "brand",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "price": {
-          "name": "price",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "img_url": {
-          "name": "img_url",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {},
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {
-        "check_type": {
-          "name": "check_type",
-          "value": "\"components\".\"type\" in \n      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card')"
-        }
-      },
-      "isRLSEnabled": false
-    },
-    "public.cooler_cpu_sockets": {
-      "name": "cooler_cpu_sockets",
-      "schema": "",
-      "columns": {
-        "cooler_id": {
-          "name": "cooler_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "socket": {
-          "name": "socket",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "cooler_cpu_sockets_cooler_id_cooler_component_id_fk": {
-          "name": "cooler_cpu_sockets_cooler_id_cooler_component_id_fk",
-          "tableFrom": "cooler_cpu_sockets",
-          "tableTo": "cooler",
-          "columnsFrom": [
-            "cooler_id"
-          ],
-          "columnsTo": [
-            "component_id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {
-        "cooler_cpu_sockets_cooler_id_socket_pk": {
-          "name": "cooler_cpu_sockets_cooler_id_socket_pk",
-          "columns": [
-            "cooler_id",
-            "socket"
-          ]
-        }
-      },
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.cooler": {
-      "name": "cooler",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "height": {
-          "name": "height",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "max_tdp_supported": {
-          "name": "max_tdp_supported",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "cooler_component_id_components_id_fk": {
-          "name": "cooler_component_id_components_id_fk",
-          "tableFrom": "cooler",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.memory_card": {
-      "name": "memory_card",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "num_slots": {
-          "name": "num_slots",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "interface": {
-          "name": "interface",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "memory_card_component_id_components_id_fk": {
-          "name": "memory_card_component_id_components_id_fk",
-          "tableFrom": "memory_card",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.memory": {
-      "name": "memory",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "speed": {
-          "name": "speed",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "capacity": {
-          "name": "capacity",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "modules": {
-          "name": "modules",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "memory_component_id_components_id_fk": {
-          "name": "memory_component_id_components_id_fk",
-          "tableFrom": "memory",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.motherboard": {
-      "name": "motherboard",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "socket": {
-          "name": "socket",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "chipset": {
-          "name": "chipset",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "ram_type": {
-          "name": "ram_type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "num_ram_slots": {
-          "name": "num_ram_slots",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "max_ram_capacity": {
-          "name": "max_ram_capacity",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "pci_express_slots": {
-          "name": "pci_express_slots",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "motherboard_component_id_components_id_fk": {
-          "name": "motherboard_component_id_components_id_fk",
-          "tableFrom": "motherboard",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.network_adapter": {
-      "name": "network_adapter",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "wifi_version": {
-          "name": "wifi_version",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "interface": {
-          "name": "interface",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "num_antennas": {
-          "name": "num_antennas",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "network_adapter_component_id_components_id_fk": {
-          "name": "network_adapter_component_id_components_id_fk",
-          "tableFrom": "network_adapter",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.network_card": {
-      "name": "network_card",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "num_ports": {
-          "name": "num_ports",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "speed": {
-          "name": "speed",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "interface": {
-          "name": "interface",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "network_card_component_id_components_id_fk": {
-          "name": "network_card_component_id_components_id_fk",
-          "tableFrom": "network_card",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.optical_drive": {
-      "name": "optical_drive",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "interface": {
-          "name": "interface",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "write_speed": {
-          "name": "write_speed",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "read_speed": {
-          "name": "read_speed",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "optical_drive_component_id_components_id_fk": {
-          "name": "optical_drive_component_id_components_id_fk",
-          "tableFrom": "optical_drive",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.pc_case": {
-      "name": "pc_case",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "cooler_max_height": {
-          "name": "cooler_max_height",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "gpu_max_length": {
-          "name": "gpu_max_length",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "pc_case_component_id_components_id_fk": {
-          "name": "pc_case_component_id_components_id_fk",
-          "tableFrom": "pc_case",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.power_supply": {
-      "name": "power_supply",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "wattage": {
-          "name": "wattage",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "power_supply_component_id_components_id_fk": {
-          "name": "power_supply_component_id_components_id_fk",
-          "tableFrom": "power_supply",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.sound_card": {
-      "name": "sound_card",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "sample_rate": {
-          "name": "sample_rate",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "bit_depth": {
-          "name": "bit_depth",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "chipset": {
-          "name": "chipset",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "interface": {
-          "name": "interface",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "channel": {
-          "name": "channel",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "sound_card_component_id_components_id_fk": {
-          "name": "sound_card_component_id_components_id_fk",
-          "tableFrom": "sound_card",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.storage": {
-      "name": "storage",
-      "schema": "",
-      "columns": {
-        "component_id": {
-          "name": "component_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "type": {
-          "name": "type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "capacity": {
-          "name": "capacity",
-          "type": "numeric",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "form_factor": {
-          "name": "form_factor",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "storage_component_id_components_id_fk": {
-          "name": "storage_component_id_components_id_fk",
-          "tableFrom": "storage",
-          "tableTo": "components",
-          "columnsFrom": [
-            "component_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.admins": {
-      "name": "admins",
-      "schema": "",
-      "columns": {
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": true,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "admins_user_id_users_id_fk": {
-          "name": "admins_user_id_users_id_fk",
-          "tableFrom": "admins",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    },
-    "public.suggestions": {
-      "name": "suggestions",
-      "schema": "",
-      "columns": {
-        "id": {
-          "name": "id",
-          "type": "serial",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "user_id": {
-          "name": "user_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "admin_id": {
-          "name": "admin_id",
-          "type": "integer",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "link": {
-          "name": "link",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "admin_comment": {
-          "name": "admin_comment",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "description": {
-          "name": "description",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": false
-        },
-        "status": {
-          "name": "status",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true,
-          "default": "'pending'"
-        },
-        "component_type": {
-          "name": "component_type",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {
-        "suggestions_user_id_users_id_fk": {
-          "name": "suggestions_user_id_users_id_fk",
-          "tableFrom": "suggestions",
-          "tableTo": "users",
-          "columnsFrom": [
-            "user_id"
-          ],
-          "columnsTo": [
-            "id"
-          ],
-          "onDelete": "cascade",
-          "onUpdate": "cascade"
-        },
-        "suggestions_admin_id_admins_user_id_fk": {
-          "name": "suggestions_admin_id_admins_user_id_fk",
-          "tableFrom": "suggestions",
-          "tableTo": "admins",
-          "columnsFrom": [
-            "admin_id"
-          ],
-          "columnsTo": [
-            "user_id"
-          ],
-          "onDelete": "set null",
-          "onUpdate": "cascade"
-        }
-      },
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {},
-      "policies": {},
-      "checkConstraints": {
-        "check_status": {
-          "name": "check_status",
-          "value": "\"suggestions\".\"status\" in ('pending', 'approved', 'rejected')"
-        },
-        "check_type": {
-          "name": "check_type",
-          "value": "\"suggestions\".\"component_type\" in \n      ('cpu', 'gpu', 'memory', 'storage', 'power_supply', 'motherboard', 'case', 'cooler', 'memory_card', 'optical_drive', 'sound_card', 'cables', 'network_adapter', 'network_card')"
-        }
-      },
-      "isRLSEnabled": false
-    },
-    "public.users": {
-      "name": "users",
-      "schema": "",
-      "columns": {
-        "id": {
-          "name": "id",
-          "type": "serial",
-          "primaryKey": true,
-          "notNull": true
-        },
-        "username": {
-          "name": "username",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "password": {
-          "name": "password",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        },
-        "email": {
-          "name": "email",
-          "type": "text",
-          "primaryKey": false,
-          "notNull": true
-        }
-      },
-      "indexes": {},
-      "foreignKeys": {},
-      "compositePrimaryKeys": {},
-      "uniqueConstraints": {
-        "users_username_unique": {
-          "name": "users_username_unique",
-          "nullsNotDistinct": false,
-          "columns": [
-            "username"
-          ]
-        },
-        "users_email_unique": {
-          "name": "users_email_unique",
-          "nullsNotDistinct": false,
-          "columns": [
-            "email"
-          ]
-        }
-      },
-      "policies": {},
-      "checkConstraints": {},
-      "isRLSEnabled": false
-    }
-  },
-  "enums": {},
-  "schemas": {},
-  "sequences": {},
-  "roles": {},
-  "policies": {},
-  "views": {},
-  "_meta": {
-    "columns": {},
-    "schemas": {},
-    "tables": {}
-  }
-}
Index: tabase/migrations/meta/_journal.json
===================================================================
--- database/migrations/meta/_journal.json	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,13 +1,0 @@
-{
-  "version": "7",
-  "dialect": "postgresql",
-  "entries": [
-    {
-      "idx": 0,
-      "version": "7",
-      "when": 1771530903611,
-      "tag": "0000_colorful_scream",
-      "breakpoints": true
-    }
-  ]
-}
Index: cker-compose.yml
===================================================================
--- docker-compose.yml	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,31 +1,0 @@
-services:
-  app:
-    build: .
-    ports:
-      - "8080:8080"
-    env_file:
-      - .env
-    depends_on:
-      db:
-        condition: service_healthy
-    restart: unless-stopped
-
-  db:
-    image: postgres:16
-    container_name: postgres
-    environment:
-      POSTGRES_DB: postgres
-      POSTGRES_USER: app
-      POSTGRES_PASSWORD: app
-    ports:
-      - "5432:5432"
-    volumes:
-      - postgres_data:/var/lib/postgresql/data
-    healthcheck:
-      test: ["CMD-SHELL", "pg_isready -U app -d postgres"]
-      interval: 5s
-      timeout: 5s
-      retries: 5
-
-volumes:
-  postgres_data:
Index: cker-entrypoint.sh
===================================================================
--- docker-entrypoint.sh	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,18 +1,0 @@
-#!/bin/sh
-set -e
-
-echo "Waiting for PostgreSQL to be ready..."
-
-until pg_isready -h db -U app -d postgres > /dev/null 2>&1; do
-  sleep 2
-done
-
-echo "Checking if database is initialized..."
-
-npm run drizzle:migrate
-
-echo "Checking if database needs seeding..."
-npm run drizzle:seed
-
-echo "Starting application..."
-exec node dist/server/index.mjs
Index: drizzle.config.ts
===================================================================
--- drizzle.config.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ drizzle.config.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -7,5 +7,5 @@
 
 export default defineConfig({
-  dialect: "postgresql",
+  dialect: "sqlite",
   schema: "./database/drizzle/schema/*",
   out: "./database/migrations",
Index: otion-server.d.ts
===================================================================
--- emotion-server.d.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,10 +1,0 @@
-declare module '@emotion/server/create-instance' {
-    import { EmotionCache } from '@emotion/cache';
-
-    export interface EmotionServer {
-        extractCriticalToChunks: (html: string) => { styles: any[]; html: string };
-        constructStyleTagsFromChunks: (chunks: any) => string;
-    }
-
-    export default function createEmotionServer(cache: EmotionCache): EmotionServer;
-}
Index: global.d.ts
===================================================================
--- global.d.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ global.d.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,11 +1,9 @@
 import { Session } from "@auth/core/types";
-import type { Database } from "./database/drizzle/db";
+import type { dbSqlite } from "./database/drizzle/db";
 
 declare module "telefunc" {
   namespace Telefunc {
     interface Context {
-      db: Database;
-      session: Session | null;
-      request: Request;
+      db: ReturnType<typeof dbSqlite>;
     }
   }
@@ -15,5 +13,5 @@
   namespace Vike {
     interface PageContextServer {
-      db: Database;
+      db: ReturnType<typeof dbSqlite>;
     }
   }
Index: ckage-lock.json
===================================================================
--- package-lock.json	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,6605 +1,0 @@
-{
-  "name": "pc-forge",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "dependencies": {
-        "@auth/core": "^0.41.1",
-        "@emotion/react": "^11.14.0",
-        "@emotion/styled": "^11.14.1",
-        "@hono/node-server": "^1.19.7",
-        "@mui/icons-material": "^7.3.6",
-        "@mui/material": "^7.3.6",
-        "@photonjs/hono": "^0.1.10",
-        "@universal-middleware/core": "^0.4.13",
-        "bcrypt": "^6.0.0",
-        "dotenv": "^17.2.3",
-        "drizzle-orm": "^0.45.1",
-        "hono": "^4.10.7",
-        "pg": "^8.16.3",
-        "react": "^19.2.1",
-        "react-dom": "^19.2.1",
-        "telefunc": "^0.2.17",
-        "tsx": "^4.21.0",
-        "vike": "^0.4.247",
-        "vike-photon": "^0.1.22",
-        "vike-react": "^0.6.13"
-      },
-      "devDependencies": {
-        "@biomejs/biome": "2.3.8",
-        "@types/bcrypt": "^6.0.0",
-        "@types/node": "^20.19.25",
-        "@types/pg": "^8.16.0",
-        "@types/react": "^19.2.7",
-        "@types/react-dom": "^19.2.3",
-        "@vitejs/plugin-react": "^5.1.2",
-        "drizzle-kit": "^0.31.8",
-        "typescript": "^5.9.3",
-        "vite": "^7.2.7"
-      }
-    },
-    "node_modules/@auth/core": {
-      "version": "0.41.1",
-      "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.41.1.tgz",
-      "integrity": "sha512-t9cJ2zNYAdWMacGRMT6+r4xr1uybIdmYa49calBPeTqwgAFPV/88ac9TEvCR85pvATiSPt8VaNf+Gt24JIT/uw==",
-      "license": "ISC",
-      "dependencies": {
-        "@panva/hkdf": "^1.2.1",
-        "jose": "^6.0.6",
-        "oauth4webapi": "^3.3.0",
-        "preact": "10.24.3",
-        "preact-render-to-string": "6.5.11"
-      },
-      "peerDependencies": {
-        "@simplewebauthn/browser": "^9.0.1",
-        "@simplewebauthn/server": "^9.0.2",
-        "nodemailer": "^7.0.7"
-      },
-      "peerDependenciesMeta": {
-        "@simplewebauthn/browser": {
-          "optional": true
-        },
-        "@simplewebauthn/server": {
-          "optional": true
-        },
-        "nodemailer": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
-      "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.27.1",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.1.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
-      "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
-      "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.28.5",
-        "@babel/helper-compilation-targets": "^7.27.2",
-        "@babel/helper-module-transforms": "^7.28.3",
-        "@babel/helpers": "^7.28.4",
-        "@babel/parser": "^7.28.5",
-        "@babel/template": "^7.27.2",
-        "@babel/traverse": "^7.28.5",
-        "@babel/types": "^7.28.5",
-        "@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/generator": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
-      "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.28.5",
-        "@babel/types": "^7.28.5",
-        "@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.27.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
-      "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/compat-data": "^7.27.2",
-        "@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-globals": {
-      "version": "7.28.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
-      "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
-      "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.27.1",
-        "@babel/types": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.28.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
-      "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.27.1",
-        "@babel/helper-validator-identifier": "^7.27.1",
-        "@babel/traverse": "^7.28.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
-      "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.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==",
-      "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==",
-      "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==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.28.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
-      "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/template": "^7.27.2",
-        "@babel/types": "^7.28.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
-      "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/types": "^7.28.5"
-      },
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-self": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
-      "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-source": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
-      "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.28.4",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
-      "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/template": {
-      "version": "7.27.2",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
-      "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.27.1",
-        "@babel/parser": "^7.27.2",
-        "@babel/types": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
-      "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.28.5",
-        "@babel/helper-globals": "^7.28.0",
-        "@babel/parser": "^7.28.5",
-        "@babel/template": "^7.27.2",
-        "@babel/types": "^7.28.5",
-        "debug": "^4.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.28.5",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
-      "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/helper-string-parser": "^7.27.1",
-        "@babel/helper-validator-identifier": "^7.28.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@biomejs/biome": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.8.tgz",
-      "integrity": "sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==",
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "bin": {
-        "biome": "bin/biome"
-      },
-      "engines": {
-        "node": ">=14.21.3"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/biome"
-      },
-      "optionalDependencies": {
-        "@biomejs/cli-darwin-arm64": "2.3.8",
-        "@biomejs/cli-darwin-x64": "2.3.8",
-        "@biomejs/cli-linux-arm64": "2.3.8",
-        "@biomejs/cli-linux-arm64-musl": "2.3.8",
-        "@biomejs/cli-linux-x64": "2.3.8",
-        "@biomejs/cli-linux-x64-musl": "2.3.8",
-        "@biomejs/cli-win32-arm64": "2.3.8",
-        "@biomejs/cli-win32-x64": "2.3.8"
-      }
-    },
-    "node_modules/@biomejs/cli-darwin-arm64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.8.tgz",
-      "integrity": "sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-darwin-x64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.8.tgz",
-      "integrity": "sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-linux-arm64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.8.tgz",
-      "integrity": "sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-linux-arm64-musl": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.8.tgz",
-      "integrity": "sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-linux-x64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.8.tgz",
-      "integrity": "sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-linux-x64-musl": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.8.tgz",
-      "integrity": "sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-win32-arm64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.8.tgz",
-      "integrity": "sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@biomejs/cli-win32-x64": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.8.tgz",
-      "integrity": "sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT OR Apache-2.0",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=14.21.3"
-      }
-    },
-    "node_modules/@brillout/import": {
-      "version": "0.2.6",
-      "resolved": "https://registry.npmjs.org/@brillout/import/-/import-0.2.6.tgz",
-      "integrity": "sha512-1GUTmADc8trUC1YSW2lp9r6PmwluMoEyHajnE1kxVdbKGD0wJOlq/DvTWMUqLtBDCnQR+n//qgMtz6HwA/lotA==",
-      "license": "MIT"
-    },
-    "node_modules/@brillout/json-serializer": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/@brillout/json-serializer/-/json-serializer-0.5.21.tgz",
-      "integrity": "sha512-pzzT4U4A9rk7eZpFjloRoMrGG2jnptwNGAhPIH7ZVjCMHd6TaJ29hrERPaY6Bp3Xdzu8JWlHI1o3x7PysxkaHQ==",
-      "license": "MIT"
-    },
-    "node_modules/@brillout/picocolors": {
-      "version": "1.0.30",
-      "resolved": "https://registry.npmjs.org/@brillout/picocolors/-/picocolors-1.0.30.tgz",
-      "integrity": "sha512-xJjdgyN1H0qh2nB2xlzazIipiDixuUd9oD5msh/Qv5bXJG9j8MSD/m4lREt6Z10ej6FF31b8vB4tdT7lDUbiyA==",
-      "license": "ISC"
-    },
-    "node_modules/@brillout/require-shim": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@brillout/require-shim/-/require-shim-0.1.2.tgz",
-      "integrity": "sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==",
-      "license": "MIT"
-    },
-    "node_modules/@brillout/vite-plugin-server-entry": {
-      "version": "0.7.15",
-      "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-server-entry/-/vite-plugin-server-entry-0.7.15.tgz",
-      "integrity": "sha512-0ClgcmjkhJoHbI6KhbjZlXMeA9qn/EPLXEVssjCE6IVYnVb4bTYuq635c44n7jV3GkjcgFHCQWBmNw0OAGiUvQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@brillout/import": "^0.2.6",
-        "@brillout/picocolors": "^1.0.26"
-      }
-    },
-    "node_modules/@drizzle-team/brocli": {
-      "version": "0.10.2",
-      "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz",
-      "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==",
-      "dev": true,
-      "license": "Apache-2.0"
-    },
-    "node_modules/@emnapi/core": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
-      "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "@emnapi/wasi-threads": "1.1.0",
-        "tslib": "^2.4.0"
-      }
-    },
-    "node_modules/@emnapi/runtime": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz",
-      "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
-      "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==",
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "tslib": "^2.4.0"
-      }
-    },
-    "node_modules/@emotion/babel-plugin": {
-      "version": "11.13.5",
-      "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
-      "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/runtime": "^7.18.3",
-        "@emotion/hash": "^0.9.2",
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/serialize": "^1.3.3",
-        "babel-plugin-macros": "^3.1.0",
-        "convert-source-map": "^1.5.0",
-        "escape-string-regexp": "^4.0.0",
-        "find-root": "^1.1.0",
-        "source-map": "^0.5.7",
-        "stylis": "4.2.0"
-      }
-    },
-    "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/babel-plugin/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/@emotion/cache": {
-      "version": "11.14.0",
-      "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
-      "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/sheet": "^1.4.0",
-        "@emotion/utils": "^1.4.2",
-        "@emotion/weak-memoize": "^0.4.0",
-        "stylis": "4.2.0"
-      }
-    },
-    "node_modules/@emotion/hash": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
-      "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/is-prop-valid": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz",
-      "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/memoize": "^0.9.0"
-      }
-    },
-    "node_modules/@emotion/memoize": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
-      "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/react": {
-      "version": "11.14.0",
-      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
-      "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "@emotion/babel-plugin": "^11.13.5",
-        "@emotion/cache": "^11.14.0",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
-        "@emotion/utils": "^1.4.2",
-        "@emotion/weak-memoize": "^0.4.0",
-        "hoist-non-react-statics": "^3.3.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@emotion/serialize": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
-      "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/hash": "^0.9.2",
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/unitless": "^0.10.0",
-        "@emotion/utils": "^1.4.2",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@emotion/sheet": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
-      "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/styled": {
-      "version": "11.14.1",
-      "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
-      "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "@emotion/babel-plugin": "^11.13.5",
-        "@emotion/is-prop-valid": "^1.3.0",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
-        "@emotion/utils": "^1.4.2"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.0.0-rc.0",
-        "react": ">=16.8.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@emotion/unitless": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
-      "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
-      "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">=16.8.0"
-      }
-    },
-    "node_modules/@emotion/utils": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
-      "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/weak-memoize": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
-      "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
-      "license": "MIT"
-    },
-    "node_modules/@esbuild-kit/core-utils": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz",
-      "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==",
-      "deprecated": "Merged into tsx: https://tsx.is",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "esbuild": "~0.18.20",
-        "source-map-support": "^0.5.21"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
-      "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
-      "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
-      "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
-      "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
-      "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
-      "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
-      "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
-      "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
-      "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
-      "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
-      "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
-      "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
-      "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
-      "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
-      "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
-      "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
-      "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
-      "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
-      "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
-      "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
-      "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/android-arm": "0.18.20",
-        "@esbuild/android-arm64": "0.18.20",
-        "@esbuild/android-x64": "0.18.20",
-        "@esbuild/darwin-arm64": "0.18.20",
-        "@esbuild/darwin-x64": "0.18.20",
-        "@esbuild/freebsd-arm64": "0.18.20",
-        "@esbuild/freebsd-x64": "0.18.20",
-        "@esbuild/linux-arm": "0.18.20",
-        "@esbuild/linux-arm64": "0.18.20",
-        "@esbuild/linux-ia32": "0.18.20",
-        "@esbuild/linux-loong64": "0.18.20",
-        "@esbuild/linux-mips64el": "0.18.20",
-        "@esbuild/linux-ppc64": "0.18.20",
-        "@esbuild/linux-riscv64": "0.18.20",
-        "@esbuild/linux-s390x": "0.18.20",
-        "@esbuild/linux-x64": "0.18.20",
-        "@esbuild/netbsd-x64": "0.18.20",
-        "@esbuild/openbsd-x64": "0.18.20",
-        "@esbuild/sunos-x64": "0.18.20",
-        "@esbuild/win32-arm64": "0.18.20",
-        "@esbuild/win32-ia32": "0.18.20",
-        "@esbuild/win32-x64": "0.18.20"
-      }
-    },
-    "node_modules/@esbuild-kit/esm-loader": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz",
-      "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==",
-      "deprecated": "Merged into tsx: https://tsx.is",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@esbuild-kit/core-utils": "^3.3.2",
-        "get-tsconfig": "^4.7.0"
-      }
-    },
-    "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
-      "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
-      "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
-      "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
-      "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
-      "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
-      "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
-      "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
-      "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
-      "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
-      "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
-      "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
-      "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
-      "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
-      "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
-      "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
-      "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
-      "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
-      "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
-      "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
-      "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
-      "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openharmony-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
-      "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
-      "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
-      "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-ia32": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
-      "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
-      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@hono/node-server": {
-      "version": "1.19.7",
-      "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz",
-      "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=18.14.1"
-      },
-      "peerDependencies": {
-        "hono": "^4"
-      }
-    },
-    "node_modules/@isaacs/balanced-match": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
-      "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
-      "license": "MIT",
-      "engines": {
-        "node": "20 || >=22"
-      }
-    },
-    "node_modules/@isaacs/brace-expansion": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
-      "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
-      "license": "MIT",
-      "dependencies": {
-        "@isaacs/balanced-match": "^4.0.1"
-      },
-      "engines": {
-        "node": "20 || >=22"
-      }
-    },
-    "node_modules/@isaacs/cliui": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
-      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^5.1.2",
-        "string-width-cjs": "npm:string-width@^4.2.0",
-        "strip-ansi": "^7.0.1",
-        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
-        "wrap-ansi": "^8.1.0",
-        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@isaacs/fs-minipass": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
-      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.4"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "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==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      }
-    },
-    "node_modules/@jridgewell/remapping": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
-      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      }
-    },
-    "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
-      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
-      "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==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.1.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz",
-      "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "consola": "^3.2.3",
-        "detect-libc": "^2.0.0",
-        "https-proxy-agent": "^7.0.5",
-        "node-fetch": "^2.6.7",
-        "nopt": "^8.0.0",
-        "semver": "^7.5.3",
-        "tar": "^7.4.0"
-      },
-      "bin": {
-        "node-pre-gyp": "bin/node-pre-gyp"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
-      "version": "7.7.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
-      "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@mui/core-downloads-tracker": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz",
-      "integrity": "sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==",
-      "license": "MIT",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      }
-    },
-    "node_modules/@mui/icons-material": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.6.tgz",
-      "integrity": "sha512-0FfkXEj22ysIq5pa41A2NbcAhJSvmcZQ/vcTIbjDsd6hlslG82k5BEBqqS0ZJprxwIL3B45qpJ+bPHwJPlF7uQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@mui/material": "^7.3.6",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/material": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.6.tgz",
-      "integrity": "sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/runtime": "^7.28.4",
-        "@mui/core-downloads-tracker": "^7.3.6",
-        "@mui/system": "^7.3.6",
-        "@mui/types": "^7.4.9",
-        "@mui/utils": "^7.3.6",
-        "@popperjs/core": "^2.11.8",
-        "@types/react-transition-group": "^4.4.12",
-        "clsx": "^2.1.1",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1",
-        "react-is": "^19.2.0",
-        "react-transition-group": "^4.4.5"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.5.0",
-        "@emotion/styled": "^11.3.0",
-        "@mui/material-pigment-css": "^7.3.6",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        },
-        "@mui/material-pigment-css": {
-          "optional": true
-        },
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/private-theming": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz",
-      "integrity": "sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4",
-        "@mui/utils": "^7.3.6",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/styled-engine": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz",
-      "integrity": "sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4",
-        "@emotion/cache": "^11.14.0",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/sheet": "^1.4.0",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.4.1",
-        "@emotion/styled": "^11.3.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/system": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz",
-      "integrity": "sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4",
-        "@mui/private-theming": "^7.3.6",
-        "@mui/styled-engine": "^7.3.6",
-        "@mui/types": "^7.4.9",
-        "@mui/utils": "^7.3.6",
-        "clsx": "^2.1.1",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.5.0",
-        "@emotion/styled": "^11.3.0",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        },
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/types": {
-      "version": "7.4.9",
-      "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz",
-      "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/utils": {
-      "version": "7.3.6",
-      "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz",
-      "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.28.4",
-        "@mui/types": "^7.4.9",
-        "@types/prop-types": "^15.7.15",
-        "clsx": "^2.1.1",
-        "prop-types": "^15.8.1",
-        "react-is": "^19.2.0"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@napi-rs/wasm-runtime": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz",
-      "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==",
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "@emnapi/core": "^1.7.1",
-        "@emnapi/runtime": "^1.7.1",
-        "@tybys/wasm-util": "^0.10.1"
-      }
-    },
-    "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==",
-      "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==",
-      "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==",
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@oxc-project/types": {
-      "version": "0.98.0",
-      "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.98.0.tgz",
-      "integrity": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/Boshen"
-      }
-    },
-    "node_modules/@panva/hkdf": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz",
-      "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/panva"
-      }
-    },
-    "node_modules/@photonjs/core": {
-      "version": "0.1.20",
-      "resolved": "https://registry.npmjs.org/@photonjs/core/-/core-0.1.20.tgz",
-      "integrity": "sha512-OmpaRPCwq1IymnTKT85JRr47vAPZw9Us2s3twxxegxt8y+jAmu3eRCUnPs9DqKJKY/Mk4dsDfaaUZrAfJeDGQA==",
-      "license": "MIT",
-      "dependencies": {
-        "@brillout/vite-plugin-server-entry": "^0.7.15",
-        "@universal-middleware/cloudflare": "^0.4.10",
-        "@universal-middleware/compress": "^0.2.34",
-        "@universal-middleware/core": "^0.4.14",
-        "@universal-middleware/express": "^0.4.22",
-        "@universal-middleware/sirv": "^0.1.24",
-        "estree-walker": "^3.0.3",
-        "ts-deepmerge": "^7.0.3",
-        "zod": "^4.2.1"
-      },
-      "peerDependencies": {
-        "vite": ">=7.1"
-      },
-      "peerDependenciesMeta": {
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@photonjs/hono": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/@photonjs/hono/-/hono-0.1.12.tgz",
-      "integrity": "sha512-S/fiW3H5ivgayfLbr2cXQQdXZ82olMwLPBbKF4I/6nNH29s2+/nvsH4kswjVg8+ZVJ/WDibO1tCensbknEvM3w==",
-      "license": "MIT",
-      "dependencies": {
-        "@photonjs/core": "^0.1.20",
-        "@universal-middleware/hono": "^0.4.18"
-      },
-      "peerDependencies": {
-        "@hono/node-server": "^1",
-        "vite": ">=7.1"
-      },
-      "peerDependenciesMeta": {
-        "@hono/node-server": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@photonjs/runtime": {
-      "version": "0.1.16",
-      "resolved": "https://registry.npmjs.org/@photonjs/runtime/-/runtime-0.1.16.tgz",
-      "integrity": "sha512-04ejZcSfQ3f16cpv22tJyJbqGMepuhpg2NBVoxK8YOiJltkBK1fF5lY/EORTF8ZTxYd1M2HGvn0ZfCAlTfZmng==",
-      "license": "MIT",
-      "dependencies": {
-        "@photonjs/core": "^0.1.20",
-        "@photonjs/srvx": "^0.1.12",
-        "@universal-middleware/core": "^0.4.14",
-        "@universal-middleware/sirv": "^0.1.24",
-        "srvx": "^0.9.8",
-        "standaloner": "^0.1.11"
-      },
-      "peerDependencies": {
-        "vite": ">=7.1"
-      },
-      "peerDependenciesMeta": {
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@photonjs/srvx": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/@photonjs/srvx/-/srvx-0.1.12.tgz",
-      "integrity": "sha512-UT/ukFPdmLsEm6Z5kKIl2DXhayxP0braPBcKRZ4bE1l2sFpN67/54JlZXyFgS/Qdmuo3Hpn94sDIX9uoEBVlGQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@photonjs/core": "^0.1.20",
-        "@universal-middleware/srvx": "^0.1.1"
-      },
-      "peerDependencies": {
-        "vite": ">=7.1"
-      },
-      "peerDependenciesMeta": {
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@pkgjs/parseargs": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=14"
-      }
-    },
-    "node_modules/@polka/url": {
-      "version": "1.0.0-next.29",
-      "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
-      "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
-      "license": "MIT"
-    },
-    "node_modules/@popperjs/core": {
-      "version": "2.11.8",
-      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
-      "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
-      "license": "MIT",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/popperjs"
-      }
-    },
-    "node_modules/@rolldown/binding-android-arm64": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.51.tgz",
-      "integrity": "sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-darwin-arm64": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.51.tgz",
-      "integrity": "sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-darwin-x64": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.51.tgz",
-      "integrity": "sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-freebsd-x64": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.51.tgz",
-      "integrity": "sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.51.tgz",
-      "integrity": "sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-linux-arm64-gnu": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.51.tgz",
-      "integrity": "sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-linux-arm64-musl": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.51.tgz",
-      "integrity": "sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-linux-x64-gnu": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.51.tgz",
-      "integrity": "sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-linux-x64-musl": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.51.tgz",
-      "integrity": "sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-openharmony-arm64": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.51.tgz",
-      "integrity": "sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-wasm32-wasi": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.51.tgz",
-      "integrity": "sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==",
-      "cpu": [
-        "wasm32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "@napi-rs/wasm-runtime": "^1.0.7"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      }
-    },
-    "node_modules/@rolldown/binding-win32-arm64-msvc": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.51.tgz",
-      "integrity": "sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-win32-ia32-msvc": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.51.tgz",
-      "integrity": "sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/binding-win32-x64-msvc": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.51.tgz",
-      "integrity": "sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      }
-    },
-    "node_modules/@rolldown/pluginutils": {
-      "version": "1.0.0-beta.53",
-      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz",
-      "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@rollup/pluginutils": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
-      "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^2.0.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "license": "MIT"
-    },
-    "node_modules/@rollup/pluginutils/node_modules/picomatch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
-      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz",
-      "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz",
-      "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz",
-      "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz",
-      "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz",
-      "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz",
-      "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz",
-      "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz",
-      "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz",
-      "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz",
-      "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-loong64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz",
-      "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz",
-      "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz",
-      "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz",
-      "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz",
-      "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz",
-      "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz",
-      "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-openharmony-arm64": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz",
-      "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz",
-      "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz",
-      "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-gnu": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz",
-      "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz",
-      "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@ts-morph/common": {
-      "version": "0.27.0",
-      "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz",
-      "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==",
-      "license": "MIT",
-      "dependencies": {
-        "fast-glob": "^3.3.3",
-        "minimatch": "^10.0.1",
-        "path-browserify": "^1.0.1"
-      }
-    },
-    "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==",
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "tslib": "^2.4.0"
-      }
-    },
-    "node_modules/@types/babel__core": {
-      "version": "7.20.5",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
-      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.20.7",
-        "@babel/types": "^7.20.7",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "node_modules/@types/babel__generator": {
-      "version": "7.27.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
-      "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__template": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
-      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__traverse": {
-      "version": "7.28.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
-      "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.28.2"
-      }
-    },
-    "node_modules/@types/bcrypt": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz",
-      "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
-      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
-      "license": "MIT"
-    },
-    "node_modules/@types/node": {
-      "version": "20.19.27",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz",
-      "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
-      "devOptional": true,
-      "license": "MIT",
-      "dependencies": {
-        "undici-types": "~6.21.0"
-      }
-    },
-    "node_modules/@types/parse-json": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
-      "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
-      "license": "MIT"
-    },
-    "node_modules/@types/pg": {
-      "version": "8.16.0",
-      "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz",
-      "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==",
-      "devOptional": true,
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@types/node": "*",
-        "pg-protocol": "*",
-        "pg-types": "^2.2.0"
-      }
-    },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.15",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
-      "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
-      "license": "MIT"
-    },
-    "node_modules/@types/react": {
-      "version": "19.2.7",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
-      "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "csstype": "^3.2.2"
-      }
-    },
-    "node_modules/@types/react-dom": {
-      "version": "19.2.3",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
-      "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "^19.2.0"
-      }
-    },
-    "node_modules/@types/react-transition-group": {
-      "version": "4.4.12",
-      "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
-      "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@universal-middleware/cloudflare": {
-      "version": "0.4.10",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/cloudflare/-/cloudflare-0.4.10.tgz",
-      "integrity": "sha512-ZY+N0KKoH+H+BB3wsaD5yqTiiFtX7uklPyCBqGLqEijOtZA5ZgFIExfWDjiIUjezUBAbRB8kUZ/WlPITY+hyTg==",
-      "license": "MIT",
-      "dependencies": {
-        "@universal-middleware/core": "^0.4.9"
-      }
-    },
-    "node_modules/@universal-middleware/compress": {
-      "version": "0.2.34",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/compress/-/compress-0.2.34.tgz",
-      "integrity": "sha512-zpLaiHHEfx1ouahZ+NKc5UScsiRAsEn+wiwWMH55JAEeUQ73zymw3e1kZg45Tr/oQh8X3PL0YrRKXDdc5Lt8WA==",
-      "license": "MIT"
-    },
-    "node_modules/@universal-middleware/core": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/core/-/core-0.4.14.tgz",
-      "integrity": "sha512-yomLeaMdh0YYnIWA5wt71+znX1oTf+olO+XnsvEEids8FexxsAxyjkjGaIeRYr4Vc5CviKEriTe6ewkpLRtdgQ==",
-      "license": "MIT",
-      "dependencies": {
-        "regexparam": "^3.0.0",
-        "tough-cookie": "^6.0.0"
-      },
-      "peerDependencies": {
-        "@cloudflare/workers-types": "^4.20251213.0",
-        "@hattip/core": "^0.0.49",
-        "@types/express": "^4 || ^5",
-        "@webroute/route": "^0.8.0",
-        "elysia": "^1.4.19",
-        "fastify": "^5.6.2",
-        "h3": "^1.15.4",
-        "hono": "^4.11.1",
-        "srvx": "^0.8 || ^0.9"
-      },
-      "peerDependenciesMeta": {
-        "@cloudflare/workers-types": {
-          "optional": true
-        },
-        "@hattip/core": {
-          "optional": true
-        },
-        "@types/express": {
-          "optional": true
-        },
-        "@webroute/route": {
-          "optional": true
-        },
-        "elysia": {
-          "optional": true
-        },
-        "fastify": {
-          "optional": true
-        },
-        "h3": {
-          "optional": true
-        },
-        "hono": {
-          "optional": true
-        },
-        "srvx": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@universal-middleware/express": {
-      "version": "0.4.22",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/express/-/express-0.4.22.tgz",
-      "integrity": "sha512-4aIrnK52NJmYKokZnwpWja/vT2m/HoZ8zxQyYLdokkSQdx0B1k1VsmYGeWENvpDQBgLjnfyvDzyaxch6Tib/hA==",
-      "license": "MIT",
-      "dependencies": {
-        "@universal-middleware/core": "^0.4.13"
-      }
-    },
-    "node_modules/@universal-middleware/hono": {
-      "version": "0.4.18",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/hono/-/hono-0.4.18.tgz",
-      "integrity": "sha512-RpnX8hKh2zx7hwVYzI32DjvH7KBYpt7MLIHWYw9QBSEzpD1ErqL+SpkvvlJaINjFs+sYJKH5IOoL53uHCL5alw==",
-      "license": "MIT",
-      "dependencies": {
-        "@universal-middleware/core": "^0.4.14"
-      }
-    },
-    "node_modules/@universal-middleware/sirv": {
-      "version": "0.1.24",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/sirv/-/sirv-0.1.24.tgz",
-      "integrity": "sha512-BshKQ6hsb3mbgIyFguyf6QEjqAFGW2KGLd3j/N1aK2b1bicD2elsWOD5UYSb0b84VHglGmISqOu30FbfMWhMgg==",
-      "license": "MIT",
-      "dependencies": {
-        "mrmime": "^2.0.1",
-        "totalist": "^3.0.1"
-      }
-    },
-    "node_modules/@universal-middleware/srvx": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@universal-middleware/srvx/-/srvx-0.1.1.tgz",
-      "integrity": "sha512-nTy4BZvaEI+rFO8sWEVvZrZWwFuqEXlXPNvIBAfl16+nKcorwiwm1x+qzuDrSqLd/kr5LSsGR3/KenTvESS9dQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@universal-middleware/core": "^0.4.12"
-      }
-    },
-    "node_modules/@vercel/nft": {
-      "version": "0.30.4",
-      "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.30.4.tgz",
-      "integrity": "sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==",
-      "license": "MIT",
-      "dependencies": {
-        "@mapbox/node-pre-gyp": "^2.0.0",
-        "@rollup/pluginutils": "^5.1.3",
-        "acorn": "^8.6.0",
-        "acorn-import-attributes": "^1.9.5",
-        "async-sema": "^3.1.1",
-        "bindings": "^1.4.0",
-        "estree-walker": "2.0.2",
-        "glob": "^10.5.0",
-        "graceful-fs": "^4.2.9",
-        "node-gyp-build": "^4.2.2",
-        "picomatch": "^4.0.2",
-        "resolve-from": "^5.0.0"
-      },
-      "bin": {
-        "nft": "out/cli.js"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@vercel/nft/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "license": "MIT"
-    },
-    "node_modules/@vercel/nft/node_modules/picomatch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
-      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/@vitejs/plugin-react": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz",
-      "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/core": "^7.28.5",
-        "@babel/plugin-transform-react-jsx-self": "^7.27.1",
-        "@babel/plugin-transform-react-jsx-source": "^7.27.1",
-        "@rolldown/pluginutils": "1.0.0-beta.53",
-        "@types/babel__core": "^7.20.5",
-        "react-refresh": "^0.18.0"
-      },
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      },
-      "peerDependencies": {
-        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
-      }
-    },
-    "node_modules/abbrev": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
-      "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
-      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
-      "license": "MIT",
-      "peer": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-import-attributes": {
-      "version": "1.9.5",
-      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
-      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "acorn": "^8"
-      }
-    },
-    "node_modules/agent-base": {
-      "version": "7.1.4",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
-      "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
-      "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
-      "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/async-sema": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
-      "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
-      "license": "MIT"
-    },
-    "node_modules/babel-plugin-macros": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
-      "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.12.5",
-        "cosmiconfig": "^7.0.0",
-        "resolve": "^1.19.0"
-      },
-      "engines": {
-        "node": ">=10",
-        "npm": ">=6"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "license": "MIT"
-    },
-    "node_modules/baseline-browser-mapping": {
-      "version": "2.9.11",
-      "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
-      "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==",
-      "license": "Apache-2.0",
-      "bin": {
-        "baseline-browser-mapping": "dist/cli.js"
-      }
-    },
-    "node_modules/bcrypt": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz",
-      "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "dependencies": {
-        "node-addon-api": "^8.3.0",
-        "node-gyp-build": "^4.8.4"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "license": "MIT",
-      "dependencies": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "node_modules/brace-expansion": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "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==",
-      "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==",
-      "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",
-      "peer": true,
-      "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/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "license": "MIT"
-    },
-    "node_modules/cac": {
-      "version": "6.7.14",
-      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
-      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001761",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz",
-      "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==",
-      "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/clsx": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
-      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/code-block-writer": {
-      "version": "13.0.3",
-      "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz",
-      "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==",
-      "license": "MIT"
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "license": "MIT"
-    },
-    "node_modules/confbox": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
-      "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
-      "license": "MIT"
-    },
-    "node_modules/consola": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
-      "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
-      "license": "MIT",
-      "engines": {
-        "node": "^14.18.0 || >=16.10.0"
-      }
-    },
-    "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==",
-      "license": "MIT"
-    },
-    "node_modules/cosmiconfig": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
-      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cosmiconfig/node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "license": "ISC",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
-      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/csstype": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
-      "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
-      "license": "MIT"
-    },
-    "node_modules/debug": {
-      "version": "4.4.3",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
-      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/detect-libc": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
-      "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/dom-helpers": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
-      "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.8.7",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/dotenv": {
-      "version": "17.2.3",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
-      "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://dotenvx.com"
-      }
-    },
-    "node_modules/drizzle-kit": {
-      "version": "0.31.8",
-      "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz",
-      "integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@drizzle-team/brocli": "^0.10.2",
-        "@esbuild-kit/esm-loader": "^2.5.5",
-        "esbuild": "^0.25.4",
-        "esbuild-register": "^3.5.0"
-      },
-      "bin": {
-        "drizzle-kit": "bin.cjs"
-      }
-    },
-    "node_modules/drizzle-orm": {
-      "version": "0.45.1",
-      "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz",
-      "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==",
-      "license": "Apache-2.0",
-      "peerDependencies": {
-        "@aws-sdk/client-rds-data": ">=3",
-        "@cloudflare/workers-types": ">=4",
-        "@electric-sql/pglite": ">=0.2.0",
-        "@libsql/client": ">=0.10.0",
-        "@libsql/client-wasm": ">=0.10.0",
-        "@neondatabase/serverless": ">=0.10.0",
-        "@op-engineering/op-sqlite": ">=2",
-        "@opentelemetry/api": "^1.4.1",
-        "@planetscale/database": ">=1.13",
-        "@prisma/client": "*",
-        "@tidbcloud/serverless": "*",
-        "@types/better-sqlite3": "*",
-        "@types/pg": "*",
-        "@types/sql.js": "*",
-        "@upstash/redis": ">=1.34.7",
-        "@vercel/postgres": ">=0.8.0",
-        "@xata.io/client": "*",
-        "better-sqlite3": ">=7",
-        "bun-types": "*",
-        "expo-sqlite": ">=14.0.0",
-        "gel": ">=2",
-        "knex": "*",
-        "kysely": "*",
-        "mysql2": ">=2",
-        "pg": ">=8",
-        "postgres": ">=3",
-        "sql.js": ">=1",
-        "sqlite3": ">=5"
-      },
-      "peerDependenciesMeta": {
-        "@aws-sdk/client-rds-data": {
-          "optional": true
-        },
-        "@cloudflare/workers-types": {
-          "optional": true
-        },
-        "@electric-sql/pglite": {
-          "optional": true
-        },
-        "@libsql/client": {
-          "optional": true
-        },
-        "@libsql/client-wasm": {
-          "optional": true
-        },
-        "@neondatabase/serverless": {
-          "optional": true
-        },
-        "@op-engineering/op-sqlite": {
-          "optional": true
-        },
-        "@opentelemetry/api": {
-          "optional": true
-        },
-        "@planetscale/database": {
-          "optional": true
-        },
-        "@prisma/client": {
-          "optional": true
-        },
-        "@tidbcloud/serverless": {
-          "optional": true
-        },
-        "@types/better-sqlite3": {
-          "optional": true
-        },
-        "@types/pg": {
-          "optional": true
-        },
-        "@types/sql.js": {
-          "optional": true
-        },
-        "@upstash/redis": {
-          "optional": true
-        },
-        "@vercel/postgres": {
-          "optional": true
-        },
-        "@xata.io/client": {
-          "optional": true
-        },
-        "better-sqlite3": {
-          "optional": true
-        },
-        "bun-types": {
-          "optional": true
-        },
-        "expo-sqlite": {
-          "optional": true
-        },
-        "gel": {
-          "optional": true
-        },
-        "knex": {
-          "optional": true
-        },
-        "kysely": {
-          "optional": true
-        },
-        "mysql2": {
-          "optional": true
-        },
-        "pg": {
-          "optional": true
-        },
-        "postgres": {
-          "optional": true
-        },
-        "prisma": {
-          "optional": true
-        },
-        "sql.js": {
-          "optional": true
-        },
-        "sqlite3": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/eastasianwidth": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "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==",
-      "license": "ISC"
-    },
-    "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==",
-      "license": "MIT"
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
-      "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
-      "license": "MIT",
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-module-lexer": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
-      "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
-      "license": "MIT"
-    },
-    "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"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.25.12",
-        "@esbuild/android-arm": "0.25.12",
-        "@esbuild/android-arm64": "0.25.12",
-        "@esbuild/android-x64": "0.25.12",
-        "@esbuild/darwin-arm64": "0.25.12",
-        "@esbuild/darwin-x64": "0.25.12",
-        "@esbuild/freebsd-arm64": "0.25.12",
-        "@esbuild/freebsd-x64": "0.25.12",
-        "@esbuild/linux-arm": "0.25.12",
-        "@esbuild/linux-arm64": "0.25.12",
-        "@esbuild/linux-ia32": "0.25.12",
-        "@esbuild/linux-loong64": "0.25.12",
-        "@esbuild/linux-mips64el": "0.25.12",
-        "@esbuild/linux-ppc64": "0.25.12",
-        "@esbuild/linux-riscv64": "0.25.12",
-        "@esbuild/linux-s390x": "0.25.12",
-        "@esbuild/linux-x64": "0.25.12",
-        "@esbuild/netbsd-arm64": "0.25.12",
-        "@esbuild/netbsd-x64": "0.25.12",
-        "@esbuild/openbsd-arm64": "0.25.12",
-        "@esbuild/openbsd-x64": "0.25.12",
-        "@esbuild/openharmony-arm64": "0.25.12",
-        "@esbuild/sunos-x64": "0.25.12",
-        "@esbuild/win32-arm64": "0.25.12",
-        "@esbuild/win32-ia32": "0.25.12",
-        "@esbuild/win32-x64": "0.25.12"
-      }
-    },
-    "node_modules/esbuild-register": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
-      "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.3.4"
-      },
-      "peerDependencies": {
-        "esbuild": ">=0.12 <1"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
-    },
-    "node_modules/exsolve": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
-      "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
-      "license": "MIT"
-    },
-    "node_modules/fast-glob": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
-      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
-      "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.8"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fastq": {
-      "version": "1.20.1",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
-      "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
-      "license": "ISC",
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "license": "MIT"
-    },
-    "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==",
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-root": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
-      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
-      "license": "MIT"
-    },
-    "node_modules/foreground-child": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
-      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
-      "license": "ISC",
-      "dependencies": {
-        "cross-spawn": "^7.0.6",
-        "signal-exit": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "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==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "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==",
-      "license": "MIT",
-      "dependencies": {
-        "resolve-pkg-maps": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
-      }
-    },
-    "node_modules/glob": {
-      "version": "10.5.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
-      "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
-      "license": "ISC",
-      "dependencies": {
-        "foreground-child": "^3.1.0",
-        "jackspeak": "^3.1.2",
-        "minimatch": "^9.0.4",
-        "minipass": "^7.1.2",
-        "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^1.11.1"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "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==",
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/glob/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "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==",
-      "license": "ISC"
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/hoist-non-react-statics": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
-      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "react-is": "^16.7.0"
-      }
-    },
-    "node_modules/hoist-non-react-statics/node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
-      "license": "MIT"
-    },
-    "node_modules/hono": {
-      "version": "4.11.1",
-      "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.1.tgz",
-      "integrity": "sha512-KsFcH0xxHes0J4zaQgWbYwmz3UPOOskdqZmItstUG93+Wk1ePBLkLGwbP9zlmh1BFUiL8Qp+Xfu9P7feJWpGNg==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=16.9.0"
-      }
-    },
-    "node_modules/https-proxy-agent": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
-      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "^7.1.2",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
-      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
-      "license": "MIT",
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/import-fresh/node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "license": "MIT"
-    },
-    "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==",
-      "license": "MIT",
-      "dependencies": {
-        "hasown": "^2.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",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/isbot-fast": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/isbot-fast/-/isbot-fast-1.2.0.tgz",
-      "integrity": "sha512-twjuQzy2gKMDVfKGQyQqrx6Uy4opu/fiVUTTpdqtFsd7OQijIp5oXvb27n5EemYXaijh5fomndJt/SPRLsEdSg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "license": "ISC"
-    },
-    "node_modules/jackspeak": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
-      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "@isaacs/cliui": "^8.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      },
-      "optionalDependencies": {
-        "@pkgjs/parseargs": "^0.11.0"
-      }
-    },
-    "node_modules/jose": {
-      "version": "6.1.3",
-      "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
-      "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/panva"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "license": "MIT"
-    },
-    "node_modules/jsesc": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
-      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
-      "license": "MIT",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "license": "MIT"
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "license": "MIT",
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "license": "MIT"
-    },
-    "node_modules/loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "license": "MIT",
-      "dependencies": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      },
-      "bin": {
-        "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==",
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.30.21",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
-      "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.5"
-      }
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "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==",
-      "license": "MIT",
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
-      "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "@isaacs/brace-expansion": "^5.0.0"
-      },
-      "engines": {
-        "node": "20 || >=22"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/minizlib": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
-      "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^7.1.2"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/mrmime": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
-      "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "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==",
-      "license": "MIT"
-    },
-    "node_modules/nanoid": {
-      "version": "3.3.11",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
-      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/node-addon-api": {
-      "version": "8.5.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz",
-      "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==",
-      "license": "MIT",
-      "engines": {
-        "node": "^18 || ^20 || >= 21"
-      }
-    },
-    "node_modules/node-fetch": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
-      "license": "MIT",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/node-gyp-build": {
-      "version": "4.8.4",
-      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
-      "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
-      "license": "MIT",
-      "bin": {
-        "node-gyp-build": "bin.js",
-        "node-gyp-build-optional": "optional.js",
-        "node-gyp-build-test": "build-test.js"
-      }
-    },
-    "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==",
-      "license": "MIT"
-    },
-    "node_modules/nopt": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
-      "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
-      "license": "ISC",
-      "dependencies": {
-        "abbrev": "^3.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/oauth4webapi": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.3.tgz",
-      "integrity": "sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/panva"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/package-json-from-dist": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
-      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
-      "license": "BlueOak-1.0.0"
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "license": "MIT",
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
-      "license": "MIT"
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "license": "MIT",
-      "engines": {
-        "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==",
-      "license": "MIT"
-    },
-    "node_modules/path-scurry": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
-      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "lru-cache": "^10.2.0",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "license": "ISC"
-    },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pathe": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
-      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
-      "license": "MIT"
-    },
-    "node_modules/pg": {
-      "version": "8.16.3",
-      "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
-      "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "pg-connection-string": "^2.9.1",
-        "pg-pool": "^3.10.1",
-        "pg-protocol": "^1.10.3",
-        "pg-types": "2.2.0",
-        "pgpass": "1.0.5"
-      },
-      "engines": {
-        "node": ">= 16.0.0"
-      },
-      "optionalDependencies": {
-        "pg-cloudflare": "^1.2.7"
-      },
-      "peerDependencies": {
-        "pg-native": ">=3.0.1"
-      },
-      "peerDependenciesMeta": {
-        "pg-native": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/pg-cloudflare": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz",
-      "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==",
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/pg-connection-string": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
-      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
-      "license": "MIT"
-    },
-    "node_modules/pg-int8": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
-      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/pg-pool": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz",
-      "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "pg": ">=8.0"
-      }
-    },
-    "node_modules/pg-protocol": {
-      "version": "1.10.3",
-      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz",
-      "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==",
-      "license": "MIT"
-    },
-    "node_modules/pg-types": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
-      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
-      "license": "MIT",
-      "dependencies": {
-        "pg-int8": "1.0.1",
-        "postgres-array": "~2.0.0",
-        "postgres-bytea": "~1.0.0",
-        "postgres-date": "~1.0.4",
-        "postgres-interval": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pgpass": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
-      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
-      "license": "MIT",
-      "dependencies": {
-        "split2": "^4.1.0"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "license": "ISC"
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pkg-types": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
-      "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
-      "license": "MIT",
-      "dependencies": {
-        "confbox": "^0.2.2",
-        "exsolve": "^1.0.7",
-        "pathe": "^2.0.3"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.5.6",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
-      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
-      "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.11",
-        "picocolors": "^1.1.1",
-        "source-map-js": "^1.2.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postgres-array": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
-      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postgres-bytea": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
-      "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/postgres-date": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
-      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/postgres-interval": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
-      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "xtend": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/preact": {
-      "version": "10.24.3",
-      "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz",
-      "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==",
-      "license": "MIT",
-      "peer": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/preact"
-      }
-    },
-    "node_modules/preact-render-to-string": {
-      "version": "6.5.11",
-      "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz",
-      "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==",
-      "license": "MIT",
-      "peerDependencies": {
-        "preact": ">=10"
-      }
-    },
-    "node_modules/prop-types": {
-      "version": "15.8.1",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
-      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
-      "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
-      }
-    },
-    "node_modules/prop-types/node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
-      "license": "MIT"
-    },
-    "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==",
-      "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/react": {
-      "version": "19.2.3",
-      "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
-      "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-dom": {
-      "version": "19.2.3",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
-      "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "scheduler": "^0.27.0"
-      },
-      "peerDependencies": {
-        "react": "^19.2.3"
-      }
-    },
-    "node_modules/react-is": {
-      "version": "19.2.3",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz",
-      "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==",
-      "license": "MIT"
-    },
-    "node_modules/react-refresh": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
-      "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-streaming": {
-      "version": "0.4.15",
-      "resolved": "https://registry.npmjs.org/react-streaming/-/react-streaming-0.4.15.tgz",
-      "integrity": "sha512-3/olKmuCRYNLy0nFGXI54ErYKK1cfxJ3UoKn6pPZkknaHSn1APvJHE9MkKow/2s2CG94emxXoj/RMVpGF4Lxzg==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@brillout/import": "^0.2.3",
-        "@brillout/json-serializer": "^0.5.1",
-        "@brillout/picocolors": "^1.0.11",
-        "isbot-fast": "1.2.0"
-      },
-      "peerDependencies": {
-        "react": ">=19",
-        "react-dom": ">=19"
-      }
-    },
-    "node_modules/react-transition-group": {
-      "version": "4.4.5",
-      "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
-      "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5",
-        "dom-helpers": "^5.0.1",
-        "loose-envify": "^1.4.0",
-        "prop-types": "^15.6.2"
-      },
-      "peerDependencies": {
-        "react": ">=16.6.0",
-        "react-dom": ">=16.6.0"
-      }
-    },
-    "node_modules/regexparam": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz",
-      "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve": {
-      "version": "1.22.11",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
-      "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
-      "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": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "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==",
-      "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==",
-      "license": "MIT",
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rolldown": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.51.tgz",
-      "integrity": "sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==",
-      "license": "MIT",
-      "dependencies": {
-        "@oxc-project/types": "=0.98.0",
-        "@rolldown/pluginutils": "1.0.0-beta.51"
-      },
-      "bin": {
-        "rolldown": "bin/cli.mjs"
-      },
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      },
-      "optionalDependencies": {
-        "@rolldown/binding-android-arm64": "1.0.0-beta.51",
-        "@rolldown/binding-darwin-arm64": "1.0.0-beta.51",
-        "@rolldown/binding-darwin-x64": "1.0.0-beta.51",
-        "@rolldown/binding-freebsd-x64": "1.0.0-beta.51",
-        "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.51",
-        "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.51",
-        "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.51",
-        "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.51",
-        "@rolldown/binding-linux-x64-musl": "1.0.0-beta.51",
-        "@rolldown/binding-openharmony-arm64": "1.0.0-beta.51",
-        "@rolldown/binding-wasm32-wasi": "1.0.0-beta.51",
-        "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.51",
-        "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.51",
-        "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.51"
-      }
-    },
-    "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
-      "version": "1.0.0-beta.51",
-      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.51.tgz",
-      "integrity": "sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==",
-      "license": "MIT"
-    },
-    "node_modules/rollup": {
-      "version": "4.54.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz",
-      "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "1.0.8"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.54.0",
-        "@rollup/rollup-android-arm64": "4.54.0",
-        "@rollup/rollup-darwin-arm64": "4.54.0",
-        "@rollup/rollup-darwin-x64": "4.54.0",
-        "@rollup/rollup-freebsd-arm64": "4.54.0",
-        "@rollup/rollup-freebsd-x64": "4.54.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.54.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.54.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.54.0",
-        "@rollup/rollup-linux-arm64-musl": "4.54.0",
-        "@rollup/rollup-linux-loong64-gnu": "4.54.0",
-        "@rollup/rollup-linux-ppc64-gnu": "4.54.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.54.0",
-        "@rollup/rollup-linux-riscv64-musl": "4.54.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.54.0",
-        "@rollup/rollup-linux-x64-gnu": "4.54.0",
-        "@rollup/rollup-linux-x64-musl": "4.54.0",
-        "@rollup/rollup-openharmony-arm64": "4.54.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.54.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.54.0",
-        "@rollup/rollup-win32-x64-gnu": "4.54.0",
-        "@rollup/rollup-win32-x64-msvc": "4.54.0",
-        "fsevents": "~2.3.2"
-      }
-    },
-    "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==",
-      "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/scheduler": {
-      "version": "0.27.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
-      "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
-      "license": "MIT"
-    },
-    "node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/sirv": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
-      "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
-      "license": "MIT",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
-      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "license": "MIT",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/split2": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
-      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
-      "license": "ISC",
-      "engines": {
-        "node": ">= 10.x"
-      }
-    },
-    "node_modules/srvx": {
-      "version": "0.9.8",
-      "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.9.8.tgz",
-      "integrity": "sha512-RZaxTKJEE/14HYn8COLuUOJAt0U55N9l1Xf6jj+T0GoA01EUH1Xz5JtSUOI+EHn+AEgPCVn7gk6jHJffrr06fQ==",
-      "license": "MIT",
-      "bin": {
-        "srvx": "bin/srvx.mjs"
-      },
-      "engines": {
-        "node": ">=20.16.0"
-      }
-    },
-    "node_modules/standaloner": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/standaloner/-/standaloner-0.1.11.tgz",
-      "integrity": "sha512-JeLFj5rKTmy3UJj7/oGUVnmFaBIWmJQVP5Hv3s2D6Ju8kVPZYbGxOhMQS45QiEr2V0ngI83d/Vv4Zh62Ojs/rQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@vercel/nft": "^0.30.3",
-        "acorn": "^8.15.0",
-        "estree-walker": "^3.0.3",
-        "magic-string": "^0.30.21",
-        "rolldown": "1.0.0-beta.51"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
-      "license": "MIT",
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/string-width-cjs": {
-      "name": "string-width",
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "license": "MIT"
-    },
-    "node_modules/string-width-cjs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
-      "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/strip-ansi-cjs": {
-      "name": "strip-ansi",
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/stylis": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
-      "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
-      "license": "MIT"
-    },
-    "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==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/tar": {
-      "version": "7.5.2",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
-      "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "@isaacs/fs-minipass": "^4.0.0",
-        "chownr": "^3.0.0",
-        "minipass": "^7.1.2",
-        "minizlib": "^3.1.0",
-        "yallist": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tar/node_modules/chownr": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
-      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tar/node_modules/yallist": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
-      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/telefunc": {
-      "version": "0.2.17",
-      "resolved": "https://registry.npmjs.org/telefunc/-/telefunc-0.2.17.tgz",
-      "integrity": "sha512-UJxfQUgl8eIOk7xxtpj3kMrXvIxggaiwj0VGXjRnQM2AO9KYAjNREyb6Rz5lEEHlZR+s4yhiCLjuwfm5t4Nx1A==",
-      "license": "MIT",
-      "dependencies": {
-        "@brillout/import": "^0.2.6",
-        "@brillout/json-serializer": "^0.5.20",
-        "@brillout/picocolors": "^1.0.28",
-        "@brillout/vite-plugin-server-entry": "^0.7.15",
-        "es-module-lexer": "^1.7.0",
-        "magic-string": "^0.30.17",
-        "ts-morph": "^26.0.0"
-      },
-      "engines": {
-        "node": ">=12.19.0"
-      },
-      "peerDependencies": {
-        "@babel/core": ">=7.0.0",
-        "@babel/parser": ">=7.0.0",
-        "@babel/types": ">=7.0.0",
-        "react": ">=18.0.0",
-        "react-streaming": ">=0.3.3",
-        "vite": ">=6.3.0"
-      },
-      "peerDependenciesMeta": {
-        "@babel/core": {
-          "optional": true
-        },
-        "@babel/parser": {
-          "optional": true
-        },
-        "@babel/types": {
-          "optional": true
-        },
-        "react": {
-          "optional": true
-        },
-        "react-streaming": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/tinyglobby": {
-      "version": "0.2.15",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
-      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
-      "license": "MIT",
-      "dependencies": {
-        "fdir": "^6.5.0",
-        "picomatch": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/SuperchupuDev"
-      }
-    },
-    "node_modules/tinyglobby/node_modules/fdir": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
-      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "peerDependencies": {
-        "picomatch": "^3 || ^4"
-      },
-      "peerDependenciesMeta": {
-        "picomatch": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/tinyglobby/node_modules/picomatch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
-      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/tldts": {
-      "version": "7.0.19",
-      "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz",
-      "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==",
-      "license": "MIT",
-      "dependencies": {
-        "tldts-core": "^7.0.19"
-      },
-      "bin": {
-        "tldts": "bin/cli.js"
-      }
-    },
-    "node_modules/tldts-core": {
-      "version": "7.0.19",
-      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz",
-      "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==",
-      "license": "MIT"
-    },
-    "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==",
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/totalist": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
-      "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tough-cookie": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz",
-      "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "tldts": "^7.0.5"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "license": "MIT"
-    },
-    "node_modules/ts-deepmerge": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-7.0.3.tgz",
-      "integrity": "sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=14.13.1"
-      }
-    },
-    "node_modules/ts-morph": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz",
-      "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==",
-      "license": "MIT",
-      "dependencies": {
-        "@ts-morph/common": "~0.27.0",
-        "code-block-writer": "^13.0.3"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "license": "0BSD",
-      "optional": true
-    },
-    "node_modules/tsx": {
-      "version": "4.21.0",
-      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
-      "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
-      "license": "MIT",
-      "dependencies": {
-        "esbuild": "~0.27.0",
-        "get-tsconfig": "^4.7.5"
-      },
-      "bin": {
-        "tsx": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
-      "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-arm": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
-      "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
-      "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
-      "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
-      "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/darwin-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
-      "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
-      "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-arm": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
-      "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
-      "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-ia32": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
-      "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-loong64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
-      "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
-      "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
-      "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
-      "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-s390x": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
-      "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
-      "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
-      "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
-      "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
-      "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/sunos-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
-      "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
-      "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-ia32": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
-      "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
-      "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/esbuild": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
-      "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.27.2",
-        "@esbuild/android-arm": "0.27.2",
-        "@esbuild/android-arm64": "0.27.2",
-        "@esbuild/android-x64": "0.27.2",
-        "@esbuild/darwin-arm64": "0.27.2",
-        "@esbuild/darwin-x64": "0.27.2",
-        "@esbuild/freebsd-arm64": "0.27.2",
-        "@esbuild/freebsd-x64": "0.27.2",
-        "@esbuild/linux-arm": "0.27.2",
-        "@esbuild/linux-arm64": "0.27.2",
-        "@esbuild/linux-ia32": "0.27.2",
-        "@esbuild/linux-loong64": "0.27.2",
-        "@esbuild/linux-mips64el": "0.27.2",
-        "@esbuild/linux-ppc64": "0.27.2",
-        "@esbuild/linux-riscv64": "0.27.2",
-        "@esbuild/linux-s390x": "0.27.2",
-        "@esbuild/linux-x64": "0.27.2",
-        "@esbuild/netbsd-arm64": "0.27.2",
-        "@esbuild/netbsd-x64": "0.27.2",
-        "@esbuild/openbsd-arm64": "0.27.2",
-        "@esbuild/openbsd-x64": "0.27.2",
-        "@esbuild/openharmony-arm64": "0.27.2",
-        "@esbuild/sunos-x64": "0.27.2",
-        "@esbuild/win32-arm64": "0.27.2",
-        "@esbuild/win32-ia32": "0.27.2",
-        "@esbuild/win32-x64": "0.27.2"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "5.9.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
-      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=14.17"
-      }
-    },
-    "node_modules/undici-types": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
-      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
-      "devOptional": true,
-      "license": "MIT"
-    },
-    "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==",
-      "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/vike": {
-      "version": "0.4.250",
-      "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.250.tgz",
-      "integrity": "sha512-ZTsVEL3V4JT7hHqRbvjiQotoIGrwWTmh2RIzkbpNtUDhzbrMIVljcFuzLjzAvjpiL86gRL/bHSKS0DSnFPlmqw==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "@babel/core": "^7.28.5",
-        "@babel/types": "^7.28.5",
-        "@brillout/import": "^0.2.6",
-        "@brillout/json-serializer": "^0.5.21",
-        "@brillout/picocolors": "^1.0.30",
-        "@brillout/require-shim": "^0.1.2",
-        "@brillout/vite-plugin-server-entry": "^0.7.15",
-        "cac": "^6.0.0",
-        "es-module-lexer": "^1.0.0",
-        "esbuild": ">=0.19.0",
-        "json5": "^2.0.0",
-        "magic-string": "^0.30.17",
-        "picomatch": "^4.0.2",
-        "semver": "^7.0.0",
-        "sirv": "^3.0.1",
-        "source-map-support": "^0.5.0",
-        "tinyglobby": "^0.2.10",
-        "vite": ">=6.3.0"
-      },
-      "bin": {
-        "vike": "bin.js"
-      },
-      "engines": {
-        "node": ">=20.19.0"
-      },
-      "peerDependencies": {
-        "react-streaming": ">=0.3.42",
-        "vite": ">=6.3.0"
-      },
-      "peerDependenciesMeta": {
-        "react-streaming": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vike-photon": {
-      "version": "0.1.24",
-      "resolved": "https://registry.npmjs.org/vike-photon/-/vike-photon-0.1.24.tgz",
-      "integrity": "sha512-zaF/WvNq0JwNvCbQR6eDuf7pgpNwWu5+ZhLJx2Qr1/ndPZrya9PuO2Me7Q9CFvWvig3zvegZ47ny79zyir+sAw==",
-      "license": "MIT",
-      "dependencies": {
-        "@brillout/picocolors": "^1.0.30",
-        "@brillout/vite-plugin-server-entry": "^0.7.15",
-        "@photonjs/core": "^0.1.20",
-        "@photonjs/runtime": "^0.1.16",
-        "@universal-middleware/compress": "^0.2.34",
-        "@universal-middleware/core": "^0.4.14",
-        "@universal-middleware/sirv": "^0.1.24",
-        "pkg-types": "^2.3.0",
-        "standaloner": "^0.1.11"
-      },
-      "peerDependencies": {
-        "@photonjs/cloudflare": ">=0.0.9",
-        "@photonjs/core": "^0.1.0",
-        "@photonjs/runtime": "^0.1.0",
-        "@photonjs/vercel": "^0.1.1",
-        "vike": ">=0.4.244",
-        "vite": ">=7.1"
-      },
-      "peerDependenciesMeta": {
-        "@photonjs/cloudflare": {
-          "optional": true
-        },
-        "@photonjs/vercel": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vike-react": {
-      "version": "0.6.18",
-      "resolved": "https://registry.npmjs.org/vike-react/-/vike-react-0.6.18.tgz",
-      "integrity": "sha512-kMoRGhdP7nSE59iWMQ3SkC9O4ISdHhnxJlwwH03VUFuUpZp2OgLUCPmlgBeIj7TU0z+P2KHhschmojvcZanL4w==",
-      "license": "MIT",
-      "dependencies": {
-        "react-streaming": "^0.4.15"
-      },
-      "peerDependencies": {
-        "react": ">=19",
-        "react-dom": ">=19",
-        "vike": ">=0.4.250"
-      }
-    },
-    "node_modules/vike/node_modules/picomatch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
-      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/vike/node_modules/semver": {
-      "version": "7.7.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
-      "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/vite": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz",
-      "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
-      "license": "MIT",
-      "peer": true,
-      "dependencies": {
-        "esbuild": "^0.27.0",
-        "fdir": "^6.5.0",
-        "picomatch": "^4.0.3",
-        "postcss": "^8.5.6",
-        "rollup": "^4.43.0",
-        "tinyglobby": "^0.2.15"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^20.19.0 || >=22.12.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^20.19.0 || >=22.12.0",
-        "jiti": ">=1.21.0",
-        "less": "^4.0.0",
-        "lightningcss": "^1.21.0",
-        "sass": "^1.70.0",
-        "sass-embedded": "^1.70.0",
-        "stylus": ">=0.54.8",
-        "sugarss": "^5.0.0",
-        "terser": "^5.16.0",
-        "tsx": "^4.8.1",
-        "yaml": "^2.4.2"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "jiti": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        },
-        "tsx": {
-          "optional": true
-        },
-        "yaml": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
-      "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
-      "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
-      "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
-      "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
-      "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
-      "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
-      "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
-      "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
-      "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
-      "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
-      "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
-      "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
-      "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
-      "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
-      "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
-      "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
-      "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
-      "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
-      "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openharmony-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
-      "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openharmony"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
-      "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
-      "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
-      "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-x64": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
-      "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite/node_modules/esbuild": {
-      "version": "0.27.2",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
-      "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.27.2",
-        "@esbuild/android-arm": "0.27.2",
-        "@esbuild/android-arm64": "0.27.2",
-        "@esbuild/android-x64": "0.27.2",
-        "@esbuild/darwin-arm64": "0.27.2",
-        "@esbuild/darwin-x64": "0.27.2",
-        "@esbuild/freebsd-arm64": "0.27.2",
-        "@esbuild/freebsd-x64": "0.27.2",
-        "@esbuild/linux-arm": "0.27.2",
-        "@esbuild/linux-arm64": "0.27.2",
-        "@esbuild/linux-ia32": "0.27.2",
-        "@esbuild/linux-loong64": "0.27.2",
-        "@esbuild/linux-mips64el": "0.27.2",
-        "@esbuild/linux-ppc64": "0.27.2",
-        "@esbuild/linux-riscv64": "0.27.2",
-        "@esbuild/linux-s390x": "0.27.2",
-        "@esbuild/linux-x64": "0.27.2",
-        "@esbuild/netbsd-arm64": "0.27.2",
-        "@esbuild/netbsd-x64": "0.27.2",
-        "@esbuild/openbsd-arm64": "0.27.2",
-        "@esbuild/openbsd-x64": "0.27.2",
-        "@esbuild/openharmony-arm64": "0.27.2",
-        "@esbuild/sunos-x64": "0.27.2",
-        "@esbuild/win32-arm64": "0.27.2",
-        "@esbuild/win32-ia32": "0.27.2",
-        "@esbuild/win32-x64": "0.27.2"
-      }
-    },
-    "node_modules/vite/node_modules/fdir": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
-      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "peerDependencies": {
-        "picomatch": "^3 || ^4"
-      },
-      "peerDependenciesMeta": {
-        "picomatch": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite/node_modules/picomatch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
-      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "license": "MIT",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs": {
-      "name": "wrap-ansi",
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "license": "MIT"
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "license": "ISC"
-    },
-    "node_modules/zod": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz",
-      "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/colinhacks"
-      }
-    }
-  }
-}
Index: package.json
===================================================================
--- package.json	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ package.json	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -9,41 +9,31 @@
     "drizzle:migrate": "drizzle-kit migrate",
     "drizzle:studio": "drizzle-kit studio",
-    "drizzle:seed": "tsx database/drizzle/util/seed.ts",
-    "drizzle:reports": "tsx database/drizzle/util/reports.ts",
     "prod": "vike build && node ./dist/server/index.mjs"
   },
   "dependencies": {
+    "vike": "^0.4.247",
     "@auth/core": "^0.41.1",
-    "@emotion/react": "^11.14.0",
-    "@emotion/styled": "^11.14.1",
-    "@hono/node-server": "^1.19.7",
-    "@mui/icons-material": "^7.3.6",
-    "@mui/material": "^7.3.6",
+    "@universal-middleware/core": "^0.4.13",
+    "drizzle-kit": "^0.31.8",
+    "drizzle-orm": "^0.45.0",
+    "dotenv": "^17.2.3",
+    "better-sqlite3": "^12.5.0",
     "@photonjs/hono": "^0.1.10",
-    "@universal-middleware/core": "^0.4.13",
-    "bcrypt": "^6.0.0",
-    "dotenv": "^17.2.3",
-    "drizzle-orm": "^0.45.1",
     "hono": "^4.10.7",
-    "pg": "^8.16.3",
+    "vike-photon": "^0.1.22",
     "react": "^19.2.1",
     "react-dom": "^19.2.1",
-    "telefunc": "^0.2.17",
-    "tsx": "^4.21.0",
-    "vike": "^0.4.247",
-    "vike-photon": "^0.1.22",
-    "vike-react": "^0.6.13"
+    "vike-react": "^0.6.13",
+    "telefunc": "^0.2.17"
   },
   "devDependencies": {
+    "typescript": "^5.9.3",
+    "vite": "^7.2.7",
     "@biomejs/biome": "2.3.8",
-    "@types/bcrypt": "^6.0.0",
+    "@types/better-sqlite3": "^7.6.13",
     "@types/node": "^20.19.25",
-    "@types/pg": "^8.16.0",
+    "@vitejs/plugin-react": "^5.1.2",
     "@types/react": "^19.2.7",
-    "@types/react-dom": "^19.2.3",
-    "@vitejs/plugin-react": "^5.1.2",
-    "drizzle-kit": "^0.31.8",
-    "typescript": "^5.9.3",
-    "vite": "^7.2.7"
+    "@types/react-dom": "^19.2.3"
   },
   "type": "module"
Index: pages/+Head.tsx
===================================================================
--- pages/+Head.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/+Head.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,7 @@
+// https://vike.dev/Head
+
+import logoUrl from "../assets/logo.svg";
+
+export function Head() {
+  return <link rel="icon" href={logoUrl} />;
+}
Index: ges/+Layout.telefunc.ts
===================================================================
--- pages/+Layout.telefunc.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,127 +1,0 @@
-import * as drizzleQueries from "../database/drizzle/queries";
-import {ctx, getAuthState, parseSessionUserId, requireUser} from "../server/telefunc/ctx";
-import {Abort} from "telefunc";
-import type {Database} from "../database/drizzle/db";
-import {addNewBuild} from "../database/drizzle/queries";
-
-export async function onGetAuthState() {
-    const context = getAuthState();
-
-    return context;
-}
-
-export async function onGetAllComponents({ componentType, limit, sort, q }
-                                            : { componentType?: string; limit?: number; sort?: string, q?: string }) {
-    const c = ctx();
-
-    const components = await drizzleQueries.getAllComponents(c.db, limit, componentType, sort, q);
-
-    return components;
-}
-
-export async function onSuggestComponent({ link, description, componentType }
-                                               : { link: string; description: string; componentType: string }) {
-    const { c, userId } = requireUser()
-
-    const newSuggestionId = await drizzleQueries.addNewComponentSuggestion(c.db, userId, link, description, componentType);
-
-    if(!newSuggestionId) throw Abort();
-
-    return { success: true };
-}
-
-export async function onGetApprovedBuilds({ limit, sort, q }
-                                                 : { limit?: number; sort?: string; q?: string }) {
-    const context = ctx();
-
-    const approvedBuilds = await drizzleQueries.getApprovedBuilds(context.db, limit, sort, q);
-
-    return approvedBuilds;
-}
-
-export async function onGetComponentDetails({ componentId }
-                                            : { componentId: number }) {
-    const context = ctx();
-
-    if(!Number.isInteger(componentId) || componentId <= 0) throw Abort();
-
-    const componentDetails = await drizzleQueries.getComponentDetails(context.db, componentId);
-
-    if(!componentDetails) throw Abort();
-
-    return componentDetails;
-}
-
-export async function onGetBuildDetails({ buildId }
-                                           : { buildId: number }) {
-    const context = ctx();
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const userId = parseSessionUserId(context.session?.user?.id);
-    const buildDetails = await drizzleQueries.getBuildDetails(context.db, buildId, userId);
-
-    if(!buildDetails) throw Abort();
-
-    return buildDetails;
-}
-
-export async function onToggleFavorite({ buildId }
-                                          : { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const isFavorite = await drizzleQueries.toggleFavoriteBuild(c.db, userId, buildId);
-
-    return isFavorite;
-}
-
-export async function onSetRating({ buildId, value }
-                                     : { buildId: number; value: number }) {
-    const { c, userId } = requireUser()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    if (!Number.isInteger(value) || value < 1 || value > 5) throw Abort();
-
-    const result = await drizzleQueries.setBuildRating(c.db, userId, buildId, value);
-
-    return { success: true };
-}
-
-export async function onSetReview({ buildId, content }
-                                     : { buildId: number; content: string }) {
-    const { c, userId } = requireUser()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const result = await drizzleQueries.setBuildReview(c.db, userId, buildId, content);
-
-    return { success: true };
-}
-
-export async function onCloneBuild({ buildId }
-                                      : { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const clonedBuildId = await drizzleQueries.cloneBuild(c.db, userId, buildId);
-
-    if (!clonedBuildId) throw Abort();
-
-    return clonedBuildId;
-}
-
-export async function onAddNewBuild({ name, description }
-                                          : { name: string; description: string }) {
-    const { c, userId } = requireUser()
-
-    const newBuildId = await drizzleQueries.addNewBuild(c.db, userId, name, description);
-
-    if (!newBuildId) throw Abort();
-
-    return newBuildId;
-}
-
Index: pages/+Layout.tsx
===================================================================
--- pages/+Layout.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ pages/+Layout.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,37 +1,74 @@
-import React from 'react';
-import Navbar from '../components/Navbar';
-import Footer from '../components/Footer';
-import Box from '@mui/material/Box';
-import { ThemeProvider, createTheme } from '@mui/material/styles';
-import CssBaseline from '@mui/material/CssBaseline';
+import "./Layout.css";
 
-const theme = createTheme({
-    palette: {
-        mode: 'dark',
-        primary: { main: '#ff8201' },
-        background: { default: '#121212', paper: '#1e1e1e' },
-    },
-});
+import logoUrl from "../assets/logo.svg";
+import { Link } from "../components/Link";
 
 export default function Layout({ children }: { children: React.ReactNode }) {
-    return (
-        <ThemeProvider theme={theme}>
-            <CssBaseline />
-            <Box
-                sx={{
-                    display: 'flex',
-                    flexDirection: 'column',
-                    minHeight: '100vh',
-                    bgcolor: 'background.default',
-                    color: 'text.primary',
-                }}
-            >
-                <Navbar />
-                <Box component="main" sx={{ flexGrow: 1, py: 3 }}>
-                    {children}
-                </Box>
-                <Footer />
-            </Box>
-        </ThemeProvider>
-    );
+  return (
+    <div
+      style={{
+        display: "flex",
+        maxWidth: 900,
+        margin: "auto",
+      }}
+    >
+      <Sidebar>
+        <Logo />
+        <Link href="/">Welcome</Link>
+        <Link href="/todo">Todo</Link>
+        <Link href="/star-wars">Data Fetching</Link>
+      </Sidebar>
+      <Content>{children}</Content>
+    </div>
+  );
 }
+
+function Sidebar({ children }: { children: React.ReactNode }) {
+  return (
+    <div
+      id="sidebar"
+      style={{
+        padding: 20,
+        flexShrink: 0,
+        display: "flex",
+        flexDirection: "column",
+        lineHeight: "1.8em",
+        borderRight: "2px solid #eee",
+      }}
+    >
+      {children}
+    </div>
+  );
+}
+
+function Content({ children }: { children: React.ReactNode }) {
+  return (
+    <div id="page-container">
+      <div
+        id="page-content"
+        style={{
+          padding: 20,
+          paddingBottom: 50,
+          minHeight: "100vh",
+        }}
+      >
+        {children}
+      </div>
+    </div>
+  );
+}
+
+function Logo() {
+  return (
+    <div
+      style={{
+        marginTop: 20,
+        marginBottom: 10,
+      }}
+    >
+      <a href="/">
+        <img src={logoUrl} height={64} width={64} alt="logo" />
+      </a>
+    </div>
+  );
+}
Index: pages/+config.ts
===================================================================
--- pages/+config.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ pages/+config.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,3 +1,3 @@
-import type {Config} from "vike/types";
+import type { Config } from "vike/types";
 import vikePhoton from "vike-photon/config";
 import vikeReact from "vike-react/config";
@@ -7,13 +7,14 @@
 
 export default {
-    // https://vike.dev/head-tags
-    title: "PC Forge",
-    description: "PC Forge Site",
-    passToClient: ["user"],
-    extends: [vikeReact, vikePhoton],
+  // https://vike.dev/head-tags
+  title: "My Vike App",
+  description: "Demo showcasing Vike",
 
-    // https://vike.dev/vike-photon
-    photon: {
-        server: "../server/entry.ts",
-    },
+  passToClient: ["user"],
+  extends: [vikeReact, vikePhoton],
+
+  // https://vike.dev/vike-photon
+  photon: {
+    server: "../server/entry.ts",
+  },
 } satisfies Config;
Index: ges/Head.tsx
===================================================================
--- pages/Head.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,7 +1,0 @@
-// https://vike.dev/Head
-
-import logoUrl from "../assets/logo.svg";
-
-export function Head() {
-  return <link rel="icon" href={logoUrl} />;
-}
Index: pages/Layout.css
===================================================================
--- pages/Layout.css	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ pages/Layout.css	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,132 +1,29 @@
-html, body {
-    margin: 0;
-    padding: 0;
-    overflow-x: hidden;
-
+/* Links */
+a {
+  text-decoration: none;
+}
+#sidebar a {
+  padding: 2px 10px;
+  margin-left: -10px;
+}
+#sidebar a.is-active {
+  background-color: #eee;
 }
 
+/* Reset */
 body {
-    background: #262636;
+  margin: 0;
+  font-family: sans-serif;
+}
+* {
+  box-sizing: border-box;
 }
 
-#app-shell {
-    min-height: 100vh;
-    display: flex;
-    flex-direction: column;
+/* Page Transition Animation */
+#page-content {
+  opacity: 1;
+  transition: opacity 0.3s ease-in-out;
 }
-
-#page-content {
-    flex: 1;
-    padding: 32px 20px;
-    max-width: 1000px;
-    width: 100%;
-    margin: 0 auto;
+body.page-transition #page-content {
+  opacity: 0;
 }
-
-.navbar {
-    background: black;
-    color: white;
-}
-
-.navbar__logo{
-    height: 32px;
-    width: auto;
-    margin-right: 5px;
-}
-
-.navbar a {
-    color: white;
-    text-decoration: none;
-}
-
-.navbar__inner {
-    width: 100%;
-    margin: 0 auto;
-    padding: 5px 15px;
-    display: flex;
-    flex-direction: column;
-    gap: 10px;
-}
-
-.navbar__top {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    gap: 15px;
-    min-width: 0;
-}
-
-.navbar__bottom {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    gap: 16px;
-    min-width: 0;
-}
-
-.navbar__brand {
-    font-size: 25px;
-    font-weight: 700;
-}
-
-.navbar__auth {
-    display: flex;
-    align-items: center;
-    gap: 10px;
-    font-size: 18px;
-    opacity: 0.95;
-    margin-right: 30px;
-}
-
-.navbar__sep {
-    opacity: 0.5;
-}
-
-.navbar__links {
-    display: flex;
-    flex-wrap: wrap;
-    gap: 20px;
-    font-size: 18px;
-}
-
-.navbar__links a {
-    padding: 6px 8px;
-    border-radius: 8px;
-}
-
-.navbar__links a:hover,
-.navbar__auth a:hover {
-    background: rgba(255, 255, 255, 0.18);
-    color: #ff8201;
-}
-
-.navbar__search input {
-    width: 220px;
-    max-width: 45vw;
-    padding: 8px 10px;
-    border-radius: 10px;
-    border: 1px solid rgba(255, 255, 255, 0.15);
-    background: rgba(255, 255, 255, 0.06);
-    color: #eaeaea;
-    outline: none;
-    margin-right: 30px;
-    min-width: 0;
-
-}
-
-.navbar__search input::placeholder {
-    color: rgba(234, 234, 234, 0.6);
-}
-
-.footer {
-    border-top: 1px solid rgba(255, 255, 255, 0.08);
-    background: black;
-    color: gray;
-}
-
-.footer__inner {
-    width: 100%;
-    margin: 0 auto;
-    padding: 18px 20px;
-    font-size: 14px;
-}
Index: ges/auth/login/+Page.tsx
===================================================================
--- pages/auth/login/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,88 +1,0 @@
-import React, { useState } from "react";
-import { Container, Box, Typography, TextField, Button, Paper, Alert } from "@mui/material";
-
-export default function LoginPage() {
-    const [error, setError] = useState<string | null>(null);
-
-    const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
-        event.preventDefault();
-        setError(null);
-
-        const formData = new FormData(event.currentTarget);
-        const username = formData.get("username");
-        const password = formData.get("password");
-
-        const res = await fetch("/api/auth/callback/credentials", {
-            method: "POST",
-            headers: { "Content-Type": "application/json" },
-            body: JSON.stringify({
-                username,
-                password,
-                csrfToken: await getCsrfToken(),
-            }),
-        });
-
-        if (res.url.includes("error")) {
-            setError("Invalid username or password");
-        } else {
-            window.location.href = "/";
-        }
-    };
-
-    return (
-        <Container component="main" maxWidth="xs">
-            <Box sx={{ marginTop: 8, display: "flex", flexDirection: "column", alignItems: "center" }}>
-                <Paper elevation={3} sx={{ p: 4, width: '100%', display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
-
-                    <Typography component="h1" variant="h5">
-                        Log in
-                    </Typography>
-
-                    {error && (
-                        <Alert severity="error" sx={{ mt: 2, width: '100%' }}>
-                            {error}
-                        </Alert>
-                    )}
-
-                    <Box component="form" onSubmit={handleSubmit} sx={{ mt: 1, width: '100%' }}>
-                        <TextField
-                            margin="normal"
-                            required
-                            fullWidth
-                            id="username"
-                            label="Username"
-                            name="username"
-                            autoComplete="username"
-                            autoFocus
-                        />
-                        <TextField
-                            margin="normal"
-                            required
-                            fullWidth
-                            name="password"
-                            label="Password"
-                            type="password"
-                            id="password"
-                            autoComplete="current-password"
-                        />
-
-                        <Button
-                            type="submit"
-                            fullWidth
-                            variant="contained"
-                            sx={{ mt: 3, mb: 2 }}
-                        >
-                            Sign In
-                        </Button>
-                    </Box>
-                </Paper>
-            </Box>
-        </Container>
-    );
-}
-
-async function getCsrfToken() {
-    const res = await fetch("/api/auth/csrf");
-    const data = await res.json();
-    return data.csrfToken;
-}
Index: ges/auth/register/+Page.tsx
===================================================================
--- pages/auth/register/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,88 +1,0 @@
-import React, {useState} from "react";
-import {Container, Box, Typography, TextField, Button, Paper, Alert, AlertColor} from "@mui/material";
-import {registerNewUser} from "./register.telefunc";
-
-export default function RegisterPage() {
-    const [username, setUsername] = useState("");
-    const [email, setEmail] = useState("");
-    const [password, setPassword] = useState("");
-    const [loading, setLoading] = useState(false);
-    const [message, setMessage] = useState<string | null>(null);
-    const [severity, setSeverity] = useState<AlertColor>("info");
-
-    async function onSubmit(e: React.FormEvent) {
-        e.preventDefault();
-        setLoading(true);
-        setMessage(null);
-
-        try {
-            const result = await registerNewUser({username, email, password});
-            if (result?.success) {
-                setSeverity("success");
-                setMessage("Registration successful! Redirecting...");
-                window.location.href = "/auth/login";
-            } else {
-                setSeverity("error");
-                setMessage("Registration failed.");
-            }
-        } catch (err) {
-            setSeverity("error");
-            setMessage("An error occurred. Please try again.");
-        } finally {
-            setLoading(false);
-        }
-    }
-
-    return (
-        <Container component="main" maxWidth="xs">
-            <Box sx={{marginTop: 8, display: "flex", flexDirection: "column", alignItems: "center", color: "white"}}>
-                <Paper elevation={3} sx={{p: 4, width: '100%'}}>
-                    <Typography component="h1" variant="h5" align="center">
-                        Register
-                    </Typography>
-
-                    <Box component="form" onSubmit={onSubmit} sx={{mt: 3}}>
-                        <TextField
-                            margin="normal"
-                            required
-                            fullWidth
-                            label="Username"
-                            value={username}
-                            onChange={(e) => setUsername(e.target.value)}
-                        />
-                        <TextField
-                            margin="normal"
-                            required
-                            fullWidth
-                            label="Email Address"
-                            type="email"
-                            value={email}
-                            onChange={(e) => setEmail(e.target.value)}
-                        />
-                        <TextField
-                            margin="normal"
-                            required
-                            fullWidth
-                            label="Password"
-                            type="password"
-                            value={password}
-                            onChange={(e) => setPassword(e.target.value)}
-                        />
-
-                        <Button
-                            type="submit"
-                            fullWidth
-                            variant="contained"
-                            disabled={loading}
-                            sx={{mt: 3, mb: 2, color: "white"}}
-                        >
-                            {loading ? "Registering..." : "Register"}
-                        </Button>
-
-                        {message && <Alert severity={severity}>{message}</Alert>}
-                    </Box>
-                </Paper>
-            </Box>
-        </Container>
-    );
-}
Index: ges/auth/register/register.telefunc.ts
===================================================================
--- pages/auth/register/register.telefunc.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import * as drizzleQueries from "../../../database/drizzle/queries/users";
-import { ctx } from "../../../server/telefunc/ctx";
-import { Abort } from "telefunc";
-import bcrypt from "bcrypt";
-
-export async function registerNewUser({ username, email, password }
-                                      : { username: string; email: string; password: string }) {
-    const c = ctx();
-
-    if (c.session?.user?.id) throw Abort();
-
-    if(!username || !email || !password) throw Abort();
-
-    const passwordHash = await bcrypt.hash(password, 8);
-    const trimmedUsername = username.trim();
-    const trimmedEmail = email.trim();
-    const result = await drizzleQueries.createUser(c.db, trimmedUsername, trimmedEmail, passwordHash);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
Index: ges/completed-builds/+Page.tsx
===================================================================
--- pages/completed-builds/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,192 +1,0 @@
-import React, { useEffect, useState } from 'react';
-import {
-    Container, Box, Typography, TextField, MenuItem, Select,
-    Slider, Button, Paper, InputAdornment, CircularProgress
-} from '@mui/material';
-import SearchIcon from '@mui/icons-material/Search';
-import FilterListIcon from '@mui/icons-material/FilterList';
-
-import BuildCard from '../../components/BuildCard';
-import BuildDetailsDialog from '../../components/BuildDetailsDialog';
-import { onGetApprovedBuilds, onGetAuthState } from '../+Layout.telefunc';
-
-export default function CompletedBuildsPage() {
-    const [builds, setBuilds] = useState<any[]>([]);
-    const [loading, setLoading] = useState(true);
-    const [userId, setUserId] = useState<number | null>(null);
-    const [selectedBuildId, setSelectedBuildId] = useState<number | null>(null);
-
-    const [sortBy, setSortBy] = useState('price_asc');
-    const [priceRange, setPriceRange] = useState<number[]>([0, 5000]);
-    const [searchQuery, setSearchQuery] = useState("");
-
-    const loadBuilds = async () => {
-        setLoading(true);
-        try {
-            const [userData, data] = await Promise.all([
-                onGetAuthState(),
-                onGetApprovedBuilds({q: searchQuery})
-            ]);
-            setUserId(userData.userId);
-
-            let sortedData = [...data];
-
-            switch (sortBy) {
-                case 'price_asc':
-                    sortedData.sort((a, b) => Number(a.total_price) - Number(b.total_price));
-                    break;
-                case 'price_desc':
-                    sortedData.sort((a, b) => Number(b.total_price) - Number(a.total_price));
-                    break;
-                case 'rating_desc':
-                    sortedData.sort((a, b) => (Number(b.avgRating) || 0) - (Number(a.avgRating) || 0));
-                    break;
-                case 'oldest':
-                    sortedData.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
-                    break;
-                case 'newest':
-                default:
-                    sortedData.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
-                    break;
-            }
-
-            sortedData = sortedData.filter(b => {
-                const price = Number(b.total_price);
-                return price >= priceRange[0] && price <= priceRange[1];
-            });
-
-            setBuilds(sortedData);
-        } catch (e) {
-            console.error("Failed to load builds", e);
-        } finally {
-            setLoading(false);
-        }
-    };
-
-    useEffect(() => {
-        void loadBuilds();
-    }, [sortBy, searchQuery]);
-
-    return (
-        <Container maxWidth={false} sx={{ mt: 4, mb: 10, px: { xs: 2, md: 4 } }}>
-            <Typography variant="h4" fontWeight="bold" gutterBottom>Completed Builds</Typography>
-            <Typography color="text.secondary" sx={{ mb: 4 }}>
-                Browse community configurations. Filter by price, components, or popularity.
-            </Typography>
-
-            <Box sx={{ display: 'flex', flexDirection: { xs: 'column', md: 'row' }, gap: 4 }}>
-
-                <Box sx={{
-                    width: { xs: '100%', md: '280px' },
-                    flexShrink: 0
-                }}>
-                    <Paper variant="outlined" sx={{ p: 3, position: 'sticky', top: 20 }}>
-                        <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>
-                            <FilterListIcon sx={{ mr: 1 }} />
-                            <Typography variant="h6" fontWeight="bold">Filters</Typography>
-                        </Box>
-
-                        <TextField
-                            fullWidth
-                            size="small"
-                            placeholder="Search builds..."
-                            value={searchQuery}
-                            onChange={(e) => setSearchQuery(e.target.value)}
-                            slotProps={{
-                                input: {
-                                    startAdornment: <InputAdornment position="start"><SearchIcon /></InputAdornment>,
-                                }
-                            }}
-                            sx={{ mb: 3 }}
-                        />
-
-                        <Typography gutterBottom fontWeight="bold">Price Range</Typography>
-                        <Box sx={{ px: 1, mb: 3 }}>
-                            <Slider
-                                value={priceRange}
-                                onChange={(_, newValue) => setPriceRange(newValue as number[])}
-                                valueLabelDisplay="auto"
-                                min={0}
-                                max={5000}
-                                step={100}
-                            />
-                            <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 1 }}>
-                                <Typography variant="caption">${priceRange[0]}</Typography>
-                                <Typography variant="caption">${priceRange[1]}+</Typography>
-                            </Box>
-                        </Box>
-
-                        <Button variant="contained" fullWidth onClick={loadBuilds}>
-                            Apply Filters
-                        </Button>
-                    </Paper>
-                </Box>
-
-                <Box sx={{ flexGrow: 1 }}>
-                    <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 3 }}>
-                        <Typography fontWeight="bold">{builds.length} Builds Found</Typography>
-
-                        <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
-                            <Typography variant="body2" color="text.secondary">Sort by:</Typography>
-                            <Select
-                                size="small"
-                                value={sortBy}
-                                onChange={(e) => setSortBy(e.target.value)}
-                                sx={{ minWidth: 150, bgcolor: 'background.paper' }}
-                            >
-                                <MenuItem value="newest">Newest First</MenuItem>
-                                <MenuItem value="oldest">Oldest First</MenuItem>
-                                <MenuItem value="price_desc">Price: High to Low</MenuItem>
-                                <MenuItem value="price_asc">Price: Low to High</MenuItem>
-                                <MenuItem value="rating_desc">Highest Rated</MenuItem>
-                            </Select>
-                        </Box>
-                    </Box>
-
-                    {loading ? (
-                        <Box sx={{ p: 5, textAlign: 'center' }}>
-                            <CircularProgress />
-                        </Box>
-                    ) : (
-                        <Box
-                            sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    md: 'repeat(3, 1fr)',
-                                    lg: 'repeat(4, 1fr)',
-                                    xl: 'repeat(5, 1fr)'
-                                },
-                                gap: 3,
-                                width: '100%'
-                            }}
-                        >
-                            {builds.map((build) => (
-                                <BuildCard
-                                    key={build.id}
-                                    build={build}
-                                    onClick={() => setSelectedBuildId(build.id)}
-                                />
-                            ))}
-                            {builds.length === 0 && (
-                                <Box sx={{ gridColumn: '1 / -1', p: 5, textAlign: 'center', bgcolor: '#f5f5f5', borderRadius: 2 }}>
-                                    <Typography>No builds found matching your filters.</Typography>
-                                </Box>
-                            )}
-                        </Box>
-                    )}
-                </Box>
-            </Box>
-
-            {/* @ts-ignore */}
-            <BuildDetailsDialog
-                open={!!selectedBuildId}
-                buildId={selectedBuildId}
-                currentUser={userId}
-                onClose={() => setSelectedBuildId(null)}
-            />
-        </Container>
-    );
-
-}
Index: ges/dashboard/admin/+Page.tsx
===================================================================
--- pages/dashboard/admin/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,562 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Container, Paper, Typography, Box, Avatar, Divider, Button,
-    CircularProgress, Table, TableBody, TableCell, TableHead, TableRow,
-    Chip, IconButton, TextField, Dialog, DialogTitle, DialogContent, DialogActions
-} from '@mui/material';
-import AdminPanelSettingsIcon from '@mui/icons-material/AdminPanelSettings';
-import CheckCircleIcon from '@mui/icons-material/CheckCircle';
-import CancelIcon from '@mui/icons-material/Cancel';
-import BuildIcon from '@mui/icons-material/Build';
-import MemoryIcon from '@mui/icons-material/Memory';
-import AddIcon from '@mui/icons-material/Add';
-import DeleteIcon from '@mui/icons-material/Delete';
-
-import {
-    getAdminInfoAndData,
-    onSetBuildApprovalStatus,
-    onSetComponentSuggestionStatus
-} from './adminDashboard.telefunc';
-
-import BuildCard from '../../../components/BuildCard';
-import BuildDetailsDialog from '../../../components/BuildDetailsDialog';
-import {onDeleteBuild} from "../user/userDashboard.telefunc";
-import AddComponentDialog from "../../../components/AddComponentDialog";
-
-export default function AdminDashboard() {
-    const [data, setData] = useState<any>(null);
-    const [loading, setLoading] = useState(true);
-    const [selectedBuildId, setSelectedBuildId] = useState<number | null>(null);
-    const [deleteDialog, setDeleteDialog] = useState<{
-        open: boolean,
-        buildId: number | null,
-        buildName: string
-    }>({open: false, buildId: null, buildName: ''});
-    const [deleteLoading, setDeleteLoading] = useState(false);
-    const [addDialogOpen, setAddDialogOpen] = useState(false);
-
-    const [buildApprovalDialog, setBuildApprovalDialog] = useState<{
-        open: boolean,
-        buildId: number | null,
-        buildName: string
-    }>({open: false, buildId: null, buildName: ''});
-    const [approvalLoading, setApprovalLoading] = useState(false);
-
-    const [suggestionDialog, setSuggestionDialog] = useState<{
-        open: boolean,
-        id: number | null,
-        action: 'approved' | 'rejected'
-    }>({open: false, id: null, action: 'approved'});
-    const [adminComment, setAdminComment] = useState("");
-
-    const [createComponentDialog, setCreateComponentDialog] = useState<{
-        open: boolean;
-        suggestion: any | null;
-    }>({open: false, suggestion: null});
-
-    const loadData = () => {
-        setLoading(true);
-        getAdminInfoAndData()
-            .then(res => {
-                setData(res);
-                setLoading(false);
-            })
-            .catch(err => {
-                console.error(err);
-                alert("Failed to load admin data. Are you an admin?");
-                setLoading(false);
-            });
-    };
-
-    useEffect(() => {
-        loadData();
-    }, []);
-
-    const openBuildApproval = (buildId: number, buildName: string) => {
-        setBuildApprovalDialog({open: true, buildId, buildName});
-    };
-
-    const handleApproveBuild = async () => {
-        if (!buildApprovalDialog.buildId) return;
-        setApprovalLoading(true);
-        try {
-            await onSetBuildApprovalStatus({buildId: buildApprovalDialog.buildId, isApproved: true});
-            setBuildApprovalDialog({open: false, buildId: null, buildName: ''});
-            loadData();
-        } catch (e) {
-            alert("Approve failed");
-        } finally {
-            setApprovalLoading(false);
-        }
-    };
-
-    // const handleRejectBuild = async () => {
-    //     if (!buildApprovalDialog.buildId || !rejectReason.trim()) return;
-    //     setApprovalLoading(true);
-    //     try {
-    //         await onSetBuildApprovalStatus({
-    //             buildId: buildApprovalDialog.buildId,
-    //             isApproved: false,
-    //         });
-    //         setBuildApprovalDialog({open: false, buildId: null, buildName: ''});
-    //         loadData();
-    //     } catch (e) {
-    //         console.error("Reject error:", e); // 🔧 add this
-    //         alert("Reject failed");
-    //     } finally {
-    //         setApprovalLoading(false);
-    //     }
-    // };
-
-    const openSuggestionReview = (id: number, action: 'approved' | 'rejected') => {
-        setSuggestionDialog({open: true, id, action});
-        setAdminComment(action === 'approved' ? "" : "");
-    };
-
-    const submitSuggestionReview = async () => {
-        if (!suggestionDialog.id) return;
-        try {
-            await onSetComponentSuggestionStatus({
-                suggestionId: suggestionDialog.id,
-                status: suggestionDialog.action,
-                adminComment: adminComment
-            });
-            setSuggestionDialog({...suggestionDialog, open: false});
-            loadData();
-        } catch (e) {
-            alert("Failed to update suggestion");
-        }
-    };
-
-    const openDeleteDialog = (buildId: number, buildName: string) => {
-        setDeleteDialog({open: true, buildId, buildName});
-    };
-
-    const handleDelete = async () => {
-        if (!deleteDialog.buildId) return;
-        setDeleteLoading(true);
-        try {
-            await onDeleteBuild({buildId: deleteDialog.buildId});
-            setDeleteDialog({open: false, buildId: null, buildName: ''});
-            loadData();
-            setSelectedBuildId(null);
-        } catch (e) {
-            alert("Failed to delete build");
-        } finally {
-            setDeleteLoading(false);
-        }
-    };
-
-    if (loading) {
-        return (
-            <Container maxWidth="xl" sx={{
-                mt: 4,
-                mb: 10,
-                display: 'flex',
-                justifyContent: 'center',
-                alignItems: 'center',
-                minHeight: '50vh'
-            }}>
-                <CircularProgress/>
-            </Container>
-        );
-    }
-
-    if (!data) {
-        return (
-            <Container maxWidth="xl" sx={{mt: 4, mb: 10, textAlign: 'center', p: 5}}>
-                <Typography variant="h6" color="error">
-                    Access Denied - Admin privileges required
-                </Typography>
-            </Container>
-        );
-    }
-
-    return (
-        <Container maxWidth="xl" sx={{mt: 4, mb: 10}}>
-            <Box sx={{
-                display: 'grid',
-                gridTemplateColumns: {
-                    xs: '1fr',
-                    md: '300px 1fr'
-                },
-                gap: 4
-            }}>
-                <Box>
-                    <Paper elevation={3} sx={{
-                        p: 4,
-                        display: 'flex',
-                        flexDirection: 'column',
-                        alignItems: 'center',
-                        height: '100%',
-                        bgcolor: '#1e1e1e',
-                        color: 'white'
-                    }}>
-                        <Avatar sx={{width: 120, height: 120, mb: 2, bgcolor: 'error.main'}}>
-                            <AdminPanelSettingsIcon sx={{fontSize: 70}}/>
-                        </Avatar>
-                        <Typography variant="h5" fontWeight="bold">{data.admin?.username || 'Admin'}</Typography>
-                        <Typography variant="body2" sx={{opacity: 0.7, mb: 3}}>
-                            {data.admin?.email || 'admin@example.com'}
-                        </Typography>
-
-                        <Chip label="ADMINISTRATOR" color="error" variant="outlined" sx={{fontWeight: 'bold'}}/>
-                        <Divider sx={{width: '100%', my: 3, bgcolor: 'rgba(255,255,255,0.1)'}}/>
-
-                        <Box sx={{width: '100%', textAlign: 'center'}}>
-                            <Typography variant="h3" fontWeight="bold" color="primary.main">
-                                {data.pendingBuilds?.length || 0}
-                            </Typography>
-                            <Typography variant="caption">Pending Builds</Typography>
-                        </Box>
-
-                        <Box sx={{width: '100%', textAlign: 'center', mt: 3}}>
-                            <Button
-                                variant="contained"
-                                color="warning"
-                                size="large"
-                                fullWidth
-                                startIcon={<BuildIcon/>}
-                                onClick={() => setAddDialogOpen(true)}
-                                sx={{mb: 2}}
-                            >
-                                Add Component
-                            </Button>
-                        </Box>
-                    </Paper>
-                </Box>
-
-                <Box sx={{
-                    display: 'flex',
-                    flexDirection: 'column',
-                    gap: 4
-                }}>
-                    <Paper sx={{p: 3, borderLeft: '6px solid #9c27b0'}}>
-                        <Box sx={{display: 'flex', alignItems: 'center', mb: 2}}>
-                            <MemoryIcon color="secondary" sx={{mr: 1}}/>
-                            <Typography variant="h6" fontWeight="bold">
-                                Component Suggestions ({data.componentSuggestions?.length || 0})
-                            </Typography>
-                        </Box>
-
-                        {data.componentSuggestions?.length === 0 ? (
-                            <Typography color="text.secondary">No suggestions.</Typography>
-                        ) : (
-                            <Box sx={{width: '100%', overflowX: 'auto'}}>
-                                <Table size="small">
-                                    <TableHead>
-                                        <TableRow>
-                                            <TableCell>Link/Description</TableCell>
-                                            <TableCell>Type</TableCell>
-                                            <TableCell>User</TableCell>
-                                            <TableCell>Status</TableCell>
-                                            <TableCell align="right">Actions</TableCell>
-                                        </TableRow>
-                                    </TableHead>
-                                    <TableBody>
-                                        {data.componentSuggestions?.map((sug: any) => (
-                                            <TableRow key={sug.id}>
-                                                <TableCell sx={{minWidth: 200, maxWidth: 300}}>
-                                                    <a
-                                                        href={sug.link}
-                                                        target="_blank"
-                                                        rel="noopener noreferrer"
-                                                        title={sug.link}
-                                                        style={{textDecoration: 'none', color: 'inherit'}}
-                                                    >
-                                                        {sug.description || sug.link}
-                                                    </a>
-                                                </TableCell>
-                                                <TableCell sx={{minWidth: 80}}>
-                                                    {sug.componentType?.toUpperCase()}
-                                                </TableCell>
-                                                <TableCell sx={{minWidth: 100}}>
-                                                    {sug.user?.username || `${sug.userId}`}
-                                                </TableCell>
-                                                <TableCell sx={{minWidth: 100}}>
-                                                    <Chip
-                                                        label={sug.status || 'pending'}
-                                                        size="small"
-                                                        color={
-                                                            sug.status === 'approved' ? 'success' :
-                                                                sug.status === 'rejected' ? 'error' :
-                                                                    'default'
-                                                        }
-                                                    />
-                                                </TableCell>
-                                                <TableCell align="right" sx={{minWidth: 150}}>
-                                                    {sug.status === 'pending' ? (
-                                                        <>
-                                                            <IconButton
-                                                                size="small"
-                                                                color="success"
-                                                                onClick={() => openSuggestionReview(sug.id, 'approved')}
-                                                            >
-                                                                <CheckCircleIcon/>
-                                                            </IconButton>
-                                                            <IconButton
-                                                                size="small"
-                                                                color="error"
-                                                                onClick={() => openSuggestionReview(sug.id, 'rejected')}
-                                                            >
-                                                                <CancelIcon/>
-                                                            </IconButton>
-                                                        </>
-                                                    ) : sug.status === 'approved' ? (
-                                                        <Button
-                                                            size="small"
-                                                            variant="contained"
-                                                            color="warning"
-                                                            startIcon={<AddIcon/>}
-                                                            onClick={() => setCreateComponentDialog({
-                                                                open: true,
-                                                                suggestion: sug
-                                                            })}
-                                                        >
-                                                            Create
-                                                        </Button>
-                                                    ) : (
-                                                        <Typography variant="caption" color="text.secondary">
-                                                            {sug.adminComment || 'Rejected'}
-                                                        </Typography>
-                                                    )}
-                                                </TableCell>
-                                            </TableRow>
-                                        ))}
-                                    </TableBody>
-                                </Table>
-                            </Box>
-                        )}
-                    </Paper>
-
-                    <Paper sx={{p: 3, borderLeft: '6px solid #ed6c02', bgcolor: '#121212'}}>
-                        <Box sx={{display: 'flex', alignItems: 'center', mb: 2}}>
-                            <BuildIcon color="warning" sx={{mr: 1}}/>
-                            <Typography variant="h6" fontWeight="bold">
-                                Builds Waiting for Approval ({data.pendingBuilds?.length || 0})
-                            </Typography>
-                        </Box>
-
-                        {data.pendingBuilds?.length === 0 ? (
-                            <Typography color="text.secondary">No pending builds.</Typography>
-                        ) : (
-                            <Box sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    lg: 'repeat(3, 1fr)',
-                                    xl: 'repeat(4, 1fr)'
-                                },
-                                gap: 2
-                            }}>
-                                {data.pendingBuilds.map((build: any) => (
-                                    <Box key={build.id} sx={{
-                                        display: 'flex',
-                                        flexDirection: 'column',
-                                        borderRadius: 2,
-                                        overflow: 'hidden',
-                                        bgcolor: 'background.paper'
-                                    }}>
-                                        <BuildCard
-                                            build={build}
-                                            onClick={() => setSelectedBuildId(build.id)}
-                                        />
-                                        <Button
-                                            variant="contained"
-                                            color="warning"
-                                            size="small"
-                                            fullWidth
-                                            startIcon={<BuildIcon/>}
-                                            onClick={(e) => {
-                                                e.stopPropagation();
-                                                openBuildApproval(build.id, build.name);
-                                            }}
-                                            sx={{borderRadius: 0}}
-                                        >
-                                            Review
-                                        </Button>
-                                    </Box>
-                                ))}
-
-                            </Box>
-                        )}
-                    </Paper>
-
-                    <Paper sx={{p: 3, borderLeft: '6px solid #2e7d32'}}>
-                        <Typography variant="h6" fontWeight="bold" gutterBottom>
-                            My Builds / Sandbox
-                        </Typography>
-                        {data.userBuilds?.length === 0 ? (
-                            <Typography color="text.secondary">No builds created by admin.</Typography>
-                        ) : (
-                            <Box sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    lg: 'repeat(3, 1fr)',
-                                    xl: 'repeat(4, 1fr)'
-                                },
-                                gap: 2
-                            }}>
-                                {data.userBuilds.slice(0, 4).map((build: any) => (
-                                    <Box key={build.id}>
-                                        <BuildCard
-                                            build={build}
-                                            onClick={() => setSelectedBuildId(build.id)}
-                                        />
-                                        <Box sx={{mt: 1, display: 'flex', justifyContent: 'center'}}>
-                                            <Button
-                                                variant="outlined"
-                                                color="error"
-                                                size="small"
-                                                startIcon={<DeleteIcon/>}
-                                                onClick={(e) => {
-                                                    e.stopPropagation();
-                                                    openDeleteDialog(build.id, build.name);
-                                                }}
-                                                fullWidth
-                                            >
-                                                Delete
-                                            </Button>
-                                        </Box>
-                                    </Box>
-                                ))}
-                            </Box>
-                        )}
-                    </Paper>
-                </Box>
-            </Box>
-
-            <Dialog open={suggestionDialog.open}
-                    onClose={() => setSuggestionDialog({...suggestionDialog, open: false})}>
-                <DialogTitle>Review Component Suggestion</DialogTitle>
-                <DialogContent>
-                    <Typography gutterBottom>Status: <b>{suggestionDialog.action.toUpperCase()}</b></Typography>
-                    <TextField
-                        fullWidth
-                        label="Admin Comment"
-                        multiline
-                        rows={3}
-                        value={adminComment}
-                        onChange={(e) => setAdminComment(e.target.value)}
-                        sx={{mt: 2}}
-                    />
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setSuggestionDialog({...suggestionDialog, open: false})}>Cancel</Button>
-                    <Button variant="contained" onClick={submitSuggestionReview}>Submit</Button>
-                </DialogActions>
-            </Dialog>
-
-            <Dialog
-                open={buildApprovalDialog.open}
-                onClose={() => setBuildApprovalDialog({open: false, buildId: null, buildName: ''})}
-            >
-                <DialogTitle>Review Build</DialogTitle>
-                <DialogContent>
-                    <Typography variant="h6" gutterBottom>{buildApprovalDialog.buildName}</Typography>
-                    <Typography color="text.secondary" sx={{mb: 2}}>
-                        Build ID: {buildApprovalDialog.buildId}
-                    </Typography>
-                    {/*<TextField*/}
-                    {/*    fullWidth*/}
-                    {/*    multiline*/}
-                    {/*    rows={2}*/}
-                    {/*    label="Reject reason (optional)"*/}
-                    {/*    value={rejectReason}*/}
-                    {/*    onChange={(e) => setRejectReason(e.target.value)}*/}
-                    {/*    placeholder="Why reject this build?"*/}
-                    {/*    sx={{mt: 1}}*/}
-                    {/*/>*/}
-                </DialogContent>
-                <DialogActions>
-                    <Button
-                        onClick={() => setBuildApprovalDialog({open: false, buildId: null, buildName: ''})}
-                        disabled={approvalLoading}
-                    >
-                        Cancel
-                    </Button>
-                    {/*<Button*/}
-                    {/*    onClick={handleRejectBuild}*/}
-                    {/*    variant="outlined"*/}
-                    {/*    color="error"*/}
-                    {/*    disabled={approvalLoading || !rejectReason.trim()}*/}
-                    {/*>*/}
-                    {/*    {approvalLoading ? <CircularProgress size={20}/> : 'Reject'}*/}
-                    {/*</Button>*/}
-                    <Button
-                        onClick={handleApproveBuild}
-                        variant="contained"
-                        color="success"
-                        disabled={approvalLoading}
-                    >
-                        {approvalLoading ? <CircularProgress size={20}/> : 'Approve'}
-                    </Button>
-                </DialogActions>
-            </Dialog>
-
-            <Dialog
-                open={deleteDialog.open}
-                onClose={() => setDeleteDialog({open: false, buildId: null, buildName: ''})}
-            >
-                <DialogTitle>Delete Build</DialogTitle>
-                <DialogContent>
-                    <Typography variant="h6" gutterBottom>{deleteDialog.buildName}</Typography>
-                    <Typography color="text.secondary">
-                        Are you sure you want to permanently delete this build? This action cannot be undone.
-                    </Typography>
-                </DialogContent>
-                <DialogActions>
-                    <Button
-                        onClick={() => setDeleteDialog({open: false, buildId: null, buildName: ''})}
-                        disabled={deleteLoading}
-                    >
-                        Cancel
-                    </Button>
-                    <Button
-                        onClick={handleDelete}
-                        variant="contained"
-                        color="error"
-                        disabled={deleteLoading}
-                        startIcon={deleteLoading ? <CircularProgress size={20}/> : <DeleteIcon/>}
-                    >
-                        {deleteLoading ? 'Deleting...' : 'Delete Build'}
-                    </Button>
-                </DialogActions>
-            </Dialog>
-
-            <BuildDetailsDialog
-                open={!!selectedBuildId}
-                buildId={selectedBuildId!}
-                currentUser={data.admin}
-                onClose={() => setSelectedBuildId(null)}
-                isDashboardView={true}
-            />
-
-            <AddComponentDialog
-                open={addDialogOpen}
-                onClose={() => setAddDialogOpen(false)}
-                onSuccess={() => {
-                    loadData();
-                    setAddDialogOpen(false);
-                }}
-            />
-
-            <AddComponentDialog
-                open={createComponentDialog.open}
-                onClose={() => setCreateComponentDialog({open: false, suggestion: null})}
-                onSuccess={() => {
-                    loadData();
-                    setCreateComponentDialog({open: false, suggestion: null});
-                }}
-                prefillData={createComponentDialog.suggestion ? {
-                    type: createComponentDialog.suggestion.componentType,
-                    suggestionLink: createComponentDialog.suggestion.link,
-                    suggestionDescription: createComponentDialog.suggestion.description
-                } : undefined}
-            />
-        </Container>
-    );
-}
Index: ges/dashboard/admin/adminDashboard.telefunc.ts
===================================================================
--- pages/dashboard/admin/adminDashboard.telefunc.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,73 +1,0 @@
-import * as drizzleQueries from "../../../database/drizzle/queries";
-import {requireAdmin} from "../../../server/telefunc/ctx";
-import {Abort} from "telefunc";
-import { validateComponentSpecificData } from "../../../database/drizzle/util/componentFieldConfig";
-
-export async function getAdminInfoAndData() {
-    const { c, userId } = await requireAdmin();
-
-    const admin = await drizzleQueries.getUserProfile(c.db, userId);
-
-    if (!admin) throw new Error();
-
-    const pendingBuilds = await drizzleQueries.getPendingBuilds(c.db);
-    const userBuilds = await drizzleQueries.getUserBuilds(c.db, userId);
-    const componentSuggestions = await drizzleQueries.getComponentSuggestions(c.db);
-
-    return {
-        admin,
-        pendingBuilds,
-        userBuilds,
-        componentSuggestions
-    };
-}
-
-export async function onSetBuildApprovalStatus({ buildId, isApproved }
-                                                 : { buildId: number; isApproved: boolean }) {
-    const { c, userId } = await requireAdmin()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const result = await drizzleQueries.setBuildApprovalStatus(c.db, buildId, isApproved);
-
-    if (!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onSetComponentSuggestionStatus({ suggestionId, status, adminComment }
-                                                : { suggestionId: number; status: string; adminComment: string }) {
-    const { c, userId } = await requireAdmin()
-
-
-    if(!Number.isInteger(suggestionId) || suggestionId <= 0) throw Abort();
-
-    const result = await drizzleQueries.setComponentSuggestionStatus(c.db, suggestionId, userId, status, adminComment);
-
-    if (!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onCreateNewComponent({ name, brand, price, imgUrl, type, specificData }
-                                            : { name: string; brand: string; price: number; imgUrl: string; type: string, specificData: any }) {
-
-    const { c, userId } = await requireAdmin()
-
-    if(!validateComponentSpecificData(type, specificData)) throw Abort();
-
-    const newComponentId = await drizzleQueries.addNewComponent(c.db, name, brand, price, imgUrl, type, specificData);
-
-    if(!newComponentId) throw Abort();
-
-    return { success: true };
-}
-
-export async function onGetDetailsForNewComponent({ type }
-                                                  : { type: string }) {
-    const { c, userId } = await requireAdmin()
-
-    const details = await drizzleQueries.getDetailsNewComponent(type);
-
-    return details;
-}
Index: ges/dashboard/user/+Page.tsx
===================================================================
--- pages/dashboard/user/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,364 +1,0 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Container,
-    Paper,
-    Typography,
-    Box,
-    Avatar,
-    Divider,
-    Button,
-    CircularProgress,
-    IconButton,
-    Dialog,
-    DialogTitle,
-    DialogContent,
-    DialogActions
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import DeleteIcon from '@mui/icons-material/Delete';
-
-import PersonIcon from '@mui/icons-material/Person';
-import ComputerIcon from '@mui/icons-material/Computer';
-import FavoriteIcon from '@mui/icons-material/Favorite';
-
-import {getUserInfoAndData, onDeleteBuild} from "./userDashboard.telefunc";
-
-import BuildCard from "../../../components/BuildCard";
-import BuildDetailsDialog from "../../../components/BuildDetailsDialog";
-
-type DashboardData = {
-    user: { username: string; email?: string; [key: string]: any };
-    userBuilds: any[];
-    favoriteBuilds: any[];
-};
-
-export default function UserDashboard() {
-    const [data, setData] = useState<DashboardData | null>(null);
-    const [loading, setLoading] = useState(true);
-    const [error, setError] = useState<string | null>(null);
-    const [openMyBuildsDialog, setOpenMyBuildsDialog] = useState(false);
-    const [openFavoritesDialog, setOpenFavoritesDialog] = useState(false);
-    const [selectedBuildId, setSelectedBuildId] = useState<number | null>(null);
-    const [deleteDialog, setDeleteDialog] = useState<{ open: boolean, buildId: number | null, buildName: string }>({ open: false, buildId: null, buildName: '' });
-    const [deleteLoading, setDeleteLoading] = useState(false);
-
-    const loadData = () => {
-        getUserInfoAndData()
-            .then((result) => {
-                setData(result);
-                setLoading(false);
-            })
-            .catch((err) => {
-                console.error(err);
-                setError("Failed to load dashboard. Please log in.");
-                setLoading(false);
-            });
-    };
-
-    useEffect(() => {
-        loadData();
-    }, []);
-
-    const openDeleteDialog = (buildId: number, buildName: string) => {
-        setDeleteDialog({ open: true, buildId, buildName });
-    };
-
-    const handleDelete = async () => {
-        if (!deleteDialog.buildId) return;
-        setDeleteLoading(true);
-        try {
-            await onDeleteBuild({buildId: deleteDialog.buildId});
-            setDeleteDialog({ open: false, buildId: null, buildName: '' });
-            loadData();
-            setSelectedBuildId(null);
-        } catch (e) {
-            alert("Failed to delete build");
-        } finally {
-            setDeleteLoading(false);
-        }
-    };
-
-    if (loading) return <Box sx={{display: 'flex', justifyContent: 'center', mt: 10}}><CircularProgress/></Box>;
-    if (error || !data) return <Container sx={{mt: 5, textAlign: 'center'}}><Typography color="error" variant="h6">{error}</Typography><Button href="/auth/login" variant="contained">Login</Button></Container>;
-
-    return (
-        <Container maxWidth="xl" sx={{mb: 4, color: 'white'}}>
-            <Box sx={{
-                display: 'grid',
-                gridTemplateColumns: {
-                    xs: '1fr',
-                    md: '280px 1fr'
-                },
-                gap: 2
-            }}>
-                <Box>
-                    <Paper elevation={3} sx={{p: 3, display: 'flex', flexDirection: 'column', alignItems: 'center', height: '100%'}}>
-                        <Avatar sx={{width: 100, height: 100, mb: 2, bgcolor: 'primary.main'}}>
-                            <PersonIcon sx={{fontSize: 60}}/>
-                        </Avatar>
-                        <Typography variant="h5" fontWeight="bold" gutterBottom>{data.user.username}</Typography>
-                        <Typography variant="body2" color="text.secondary" gutterBottom>{data.user.email}</Typography>
-                        <Divider sx={{width: '100%', my: 2}}/>
-                    </Paper>
-                </Box>
-
-                <Box sx={{
-                    display: 'flex',
-                    flexDirection: 'column',
-                    gap: 3
-                }}>
-                    <Paper elevation={3} sx={{p: 3, minHeight: '300px', bgcolor: '#1e1e1e'}}>
-                        <Box sx={{
-                            display: 'flex',
-                            alignItems: 'center',
-                            justifyContent: 'space-between',
-                            mb: 2
-                        }}>
-                            <Box sx={{display: 'flex', alignItems: 'center'}}>
-                                <FavoriteIcon color="error" sx={{mr: 1}}/>
-                                <Typography variant="h6" fontWeight="bold">Favorited Builds</Typography>
-                            </Box>
-
-                            {data.favoriteBuilds.length > 6 && (
-                                <Button
-                                    variant="outlined"
-                                    size="small"
-                                    onClick={() => setOpenFavoritesDialog(true)}
-                                >
-                                    See All ({data.favoriteBuilds.length})
-                                </Button>
-                            )}
-                        </Box>
-                        <Divider sx={{mb: 2}}/>
-
-                        {data.favoriteBuilds.length === 0 ? (
-                            <Typography color="text.secondary" align="center" sx={{mt: 4}}>
-                                You haven't favorited any builds yet.
-                            </Typography>
-                        ) : (
-                            <Box sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    md: 'repeat(3, 1fr)',
-                                    lg: 'repeat(4, 1fr)',
-                                    xl: 'repeat(6, 1fr)'
-                                },
-                                gap: 2
-                            }}>
-                                {data.favoriteBuilds.slice(0, 6).map((build: any) => (
-                                    <BuildCard
-                                        key={build.id}
-                                        build={build}
-                                        onClick={() => setSelectedBuildId(build.id)}
-                                    />
-                                ))}
-                            </Box>
-                        )}
-                    </Paper>
-
-                    <Paper elevation={3} sx={{p: 3, minHeight: '300px', bgcolor: '#1e1e1e'}}>
-                        <Box sx={{
-                            display: 'flex',
-                            alignItems: 'center',
-                            justifyContent: 'space-between',
-                            mb: 2
-                        }}>
-                            <Box sx={{display: 'flex', alignItems: 'center'}}>
-                                <ComputerIcon color="primary" sx={{mr: 1}}/>
-                                <Typography variant="h6" fontWeight="bold">My Builds</Typography>
-                            </Box>
-
-                            {data.userBuilds.length > 6 && (
-                                <Button
-                                    variant="outlined"
-                                    size="small"
-                                    onClick={() => setOpenMyBuildsDialog(true)}
-                                >
-                                    See All ({data.userBuilds.length})
-                                </Button>
-                            )}
-                        </Box>
-                        <Divider sx={{mb: 2}}/>
-
-                        {data.userBuilds.length === 0 ? (
-                            <Box sx={{textAlign: 'center', mt: 4}}>
-                                <Typography color="text.secondary" gutterBottom>
-                                    You haven't created any builds yet.
-                                </Typography>
-                                <Button variant="contained" href="/forge" sx={{color: 'white', fontWeight: 'bolder'}}>
-                                    Start Forging
-                                </Button>
-                            </Box>
-                        ) : (
-                            <Box sx={{
-                                display: 'grid',
-                                gridTemplateColumns: {
-                                    xs: '1fr',
-                                    sm: 'repeat(2, 1fr)',
-                                    md: 'repeat(3, 1fr)',
-                                    lg: 'repeat(4, 1fr)',
-                                    xl: 'repeat(6, 1fr)'
-                                },
-                                gap: 2
-                            }}>
-                                {data.userBuilds.slice(0, 6).map((build: any) => (
-                                    <Box key={build.id} sx={{ display: 'flex', flexDirection: 'column', pb: 2 }}>
-                                        <Box sx={{ flexGrow: 1 }}>
-                                            <BuildCard
-                                                build={build}
-                                                onClick={() => setSelectedBuildId(build.id)}
-                                            />
-                                        </Box>
-                                        <Button
-                                            variant="outlined"
-                                            color="error"
-                                            size="small"
-                                            startIcon={<DeleteIcon/>}
-                                            onClick={(e) => {
-                                                e.stopPropagation();
-                                                openDeleteDialog(build.id, build.name);
-                                            }}
-                                            sx={{ mt: 1, width: '100%' }}
-                                        >
-                                            Delete
-                                        </Button>
-                                    </Box>
-                                ))}
-                            </Box>
-                        )}
-                    </Paper>
-                </Box>
-            </Box>
-
-            <Dialog open={openMyBuildsDialog} onClose={() => setOpenMyBuildsDialog(false)} maxWidth="xl" fullWidth>
-                <DialogTitle sx={{display: 'flex', justifyContent: 'space-between', alignItems: 'center'}}>
-                    All My Builds
-                    <IconButton onClick={() => setOpenMyBuildsDialog(false)}>
-                        <CloseIcon/>
-                    </IconButton>
-                </DialogTitle>
-                <DialogContent dividers>
-                    <Box sx={{
-                        display: 'grid',
-                        gridTemplateColumns: {
-                            xs: '1fr',
-                            sm: 'repeat(2, 1fr)',
-                            md: 'repeat(3, 1fr)',
-                            lg: 'repeat(4, 1fr)',
-                            xl: 'repeat(5, 1fr)'
-                        },
-                        gap: 2,
-                        mt: 1,
-                    }}>
-                        {data.userBuilds.map((build: any) => (
-                            <Box key={build.id} sx={{ pb: 4 }}>
-                                <BuildCard
-                                    build={build}
-                                    onClick={() => {
-                                        setOpenMyBuildsDialog(false);
-                                        setSelectedBuildId(build.id);
-                                    }}
-                                />
-                                <Box sx={{mt: 1, display: 'flex', justifyContent: 'center'}}>
-                                    <Button
-                                        variant="outlined"
-                                        color="error"
-                                        size="small"
-                                        startIcon={<DeleteIcon/>}
-                                        onClick={(e) => {
-                                            e.stopPropagation();
-                                            openDeleteDialog(build.id, build.name);
-                                        }}
-                                        sx={{width: '100%'}}
-                                    >
-                                        Delete
-                                    </Button>
-                                </Box>
-                            </Box>
-                        ))}
-                    </Box>
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setOpenMyBuildsDialog(false)}>Close</Button>
-                </DialogActions>
-            </Dialog>
-
-            <Dialog open={openFavoritesDialog} onClose={() => setOpenFavoritesDialog(false)} maxWidth="xl" fullWidth>
-                <DialogTitle sx={{display: 'flex', justifyContent: 'space-between', alignItems: 'center'}}>
-                    All Favorited Builds
-                    <IconButton onClick={() => setOpenFavoritesDialog(false)}>
-                        <CloseIcon/>
-                    </IconButton>
-                </DialogTitle>
-                <DialogContent dividers>
-                    <Box sx={{
-                        display: 'grid',
-                        gridTemplateColumns: {
-                            xs: '1fr',
-                            sm: 'repeat(2, 1fr)',
-                            md: 'repeat(3, 1fr)',
-                            lg: 'repeat(4, 1fr)',
-                            xl: 'repeat(5, 1fr)'
-                        },
-                        gap: 2,
-                        mt: 1
-                    }}>
-                        {data.favoriteBuilds.map((build: any) => (
-                            <BuildCard
-                                key={build.id}
-                                build={build}
-                                onClick={() => {
-                                    setOpenFavoritesDialog(false);
-                                    setSelectedBuildId(build.id);
-                                }}
-                            />
-                        ))}
-                    </Box>
-                </DialogContent>
-                <DialogActions>
-                    <Button onClick={() => setOpenFavoritesDialog(false)}>Close</Button>
-                </DialogActions>
-            </Dialog>
-
-            <Dialog open={deleteDialog.open} onClose={() => setDeleteDialog({ open: false, buildId: null, buildName: '' })}>
-                <DialogTitle>Delete Build</DialogTitle>
-                <DialogContent>
-                    <Typography variant="h6" gutterBottom>{deleteDialog.buildName}</Typography>
-                    <Typography color="text.secondary">
-                        Are you sure you want to permanently delete this build? This action cannot be undone.
-                    </Typography>
-                </DialogContent>
-                <DialogActions>
-                    <Button
-                        onClick={() => setDeleteDialog({ open: false, buildId: null, buildName: '' })}
-                        disabled={deleteLoading}
-                    >
-                        Cancel
-                    </Button>
-                    <Button
-                        onClick={handleDelete}
-                        variant="contained"
-                        color="error"
-                        disabled={deleteLoading}
-                        startIcon={deleteLoading ? <CircularProgress size={20} /> : <DeleteIcon />}
-                    >
-                        {deleteLoading ? 'Deleting...' : 'Delete Build'}
-                    </Button>
-                </DialogActions>
-            </Dialog>
-
-            <BuildDetailsDialog
-                open={!!selectedBuildId}
-                buildId={selectedBuildId}
-                currentUser={data?.user?.id ? Number(data.user.id) : undefined}
-                onClose={() => {
-                    setSelectedBuildId(null);
-                    loadData();
-                }}
-                isDashboardView={true}
-            />
-        </Container>
-    );
-}
Index: ges/dashboard/user/userDashboard.telefunc.ts
===================================================================
--- pages/dashboard/user/userDashboard.telefunc.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,49 +1,0 @@
-import * as drizzleQueries from "../../../database/drizzle/queries";
-import {requireUser} from "../../../server/telefunc/ctx";
-import {Abort} from "telefunc";
-
-export async function getUserInfoAndData() {
-    const { c, userId } = requireUser()
-
-    const user = await drizzleQueries.getUserProfile(c.db, userId);
-
-    if (!user) throw new Error();
-
-    const userBuilds = await drizzleQueries.getUserBuilds(c.db, userId);
-    const favoriteBuilds = await drizzleQueries.getFavoriteBuilds(c.db, userId);
-
-    return {
-        user: {
-            ...user,
-            id: userId,
-        },
-        userBuilds,
-        favoriteBuilds
-    };
-}
-
-export async function onDeleteBuild({ buildId }
-                                  : { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if (!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const result = await drizzleQueries.deleteBuild(c.db, userId, buildId);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onEditBuild({ buildId }
-                                  : { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const buildToEditId = await drizzleQueries.editBuild(c.db, userId, buildId);
-
-    if(!buildToEditId) throw Abort();
-
-    return buildToEditId;
-}
Index: ges/forge/+Page.tsx
===================================================================
--- pages/forge/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,714 +1,0 @@
-import React, {useState, useEffect, useMemo} from 'react';
-import {
-    Container, Paper, Typography, Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow,
-    Button, IconButton, Avatar, TextField, Chip, CircularProgress,
-    Menu, MenuItem, ListItemIcon, Dialog, DialogTitle, DialogContent, DialogActions
-} from '@mui/material';
-
-import AddIcon from '@mui/icons-material/Add';
-import RemoveIcon from '@mui/icons-material/Remove';
-import DeleteIcon from '@mui/icons-material/Delete';
-import CloseIcon from "@mui/icons-material/Close";
-import AlbumIcon from "@mui/icons-material/Album";
-import CableIcon from "@mui/icons-material/Cable";
-import RouterIcon from "@mui/icons-material/Router";
-import MemoryIcon from "@mui/icons-material/Memory";
-
-import {
-    saveBuildState,
-    onAddComponentToBuild,
-    onRemoveComponentFromBuild,
-    onDeleteBuild,
-    onGetBuildState,
-    onGetBuildComponents
-} from './forge.telefunc';
-
-import ComponentDialog from '../../components/ComponentDialog';
-import ComponentDetailsDialog from '../../components/ComponentDetailsDialog';
-import {onAddNewBuild, onGetAuthState, onGetComponentDetails} from "../+Layout.telefunc";
-import {onEditBuild} from "../dashboard/user/userDashboard.telefunc";
-import {BuildSlot, INITIAL_SLOTS} from "./types/buildTypes";
-import {renderSpecs} from "./utils/RenderSpecs";
-import {
-    getMaxRamSlots,
-    calculateUsedRamSlots,
-    calculateUsedStorageSlots
-} from "./utils/componentCalculations";
-import {Snackbar, Alert} from '@mui/material';
-
-export default function ForgePage() {
-    const [slots, setSlots] = useState<BuildSlot[]>(INITIAL_SLOTS);
-    const [buildId, setBuildId] = useState<number | null>(null);
-    const [buildName, setBuildName] = useState("");
-    const [description, setDescription] = useState("");
-    const [totalPrice, setTotalPrice] = useState(0);
-    const [isSubmitting, setIsSubmitting] = useState(false);
-
-    const [browserOpen, setBrowserOpen] = useState(false);
-    const [activeSlotId, setActiveSlotId] = useState<string | null>(null);
-    const [detailsOpen, setDetailsOpen] = useState<any>(null);
-    const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
-    const [submitDialogOpen, setSubmitDialogOpen] = useState(false);
-    const [tempDescription, setTempDescription] = useState("");
-    const isSubmittedRef = React.useRef(false);
-
-    const [snackbar, setSnackbar] = useState<{
-        open: boolean;
-        message: string;
-        severity: 'error' | 'warning' | 'info' | 'success';
-    }>({
-        open: false,
-        message: '',
-        severity: 'info'
-    });
-
-    useEffect(() => {
-        const price = slots.reduce((sum, slot) => {
-            const quantity = slot.component?.quantity || 1;
-            return sum + (Number(slot.component?.price) || 0) * quantity;
-        }, 0);
-        setTotalPrice(price);
-    }, [slots]);
-
-    useEffect(() => {
-        if (buildId && buildName.trim()) {
-            const timeoutId = setTimeout(() => {
-                saveBuildState({buildId, name: buildName.trim(), description}).catch(() => {
-                });
-            }, 1000);
-
-            return () => clearTimeout(timeoutId);
-        }
-    }, [buildId, buildName, description]);
-
-    useEffect(() => {
-        if (!buildId) return;
-
-        const handleBeforeUnload = () => {
-            if (!isSubmittedRef.current) {
-                onDeleteBuild({buildId}).catch(() => {
-                });
-            }
-        };
-
-        window.addEventListener('beforeunload', handleBeforeUnload);
-
-        return () => {
-            window.removeEventListener('beforeunload', handleBeforeUnload);
-            if (!isSubmittedRef.current) {
-                onDeleteBuild({buildId}).catch(() => {
-                });
-            }
-        };
-    }, [buildId]);
-
-    useEffect(() => {
-        const urlParams = new URLSearchParams(window.location.search);
-        const urlBuildId = urlParams.get('buildId');
-
-        if (urlBuildId && Number.isInteger(Number(urlBuildId)) && Number(urlBuildId) > 0) {
-            const loadBuildId = Number(urlBuildId);
-
-            onGetBuildState({buildId: loadBuildId})
-                .then((buildState) => {
-                    if (buildState) {
-                        setBuildId(loadBuildId);
-                        setBuildName(buildState.build.name);
-                        setDescription(buildState.build.description || "");
-                    }
-                })
-                .catch(() => {
-                })
-                .finally(() => {
-                    onGetBuildComponents({buildId: loadBuildId})
-                        .then(async (components) => {
-                            if (components && components.length > 0) {
-                                const detailedComponents = await Promise.all(
-                                    components.map(async (c: any) => {
-                                        const full = await onGetComponentDetails({componentId: c.id}).catch(() => null);
-                                        return full ? {
-                                            ...c,
-                                            ...full,
-                                            details: full?.details,
-                                            quantity: c.quantity || 1
-                                        } : {...c, quantity: c.quantity || 1};
-                                    })
-                                );
-
-                                const componentMap = new Map();
-                                detailedComponents.forEach((c: any) => componentMap.set(c.type, c));
-
-                                setSlots(prevSlots => prevSlots.map(slot => {
-                                    const match = componentMap.get(slot.type);
-                                    return match ? {...slot, component: match} : slot;
-                                }));
-
-                                window.history.replaceState({}, document.title, "/forge");
-                            }
-                        })
-                        .catch(() => {
-                        });
-                });
-        }
-    }, []);
-
-    const handlePickPart = (slotId: string) => {
-        setActiveSlotId(slotId);
-        setTimeout(() => setBrowserOpen(true), 0);
-    };
-
-    // fix: changed text, new catch and removed setActiveSlotId(null), so the component name doesn't disappear.
-    const handleSelectComponent = async (component: any) => {
-        if (!activeSlotId) return;
-
-        try {
-            let id = buildId;
-            if (!id) {
-                let result;
-                try {
-                    result = await onAddNewBuild({
-                        name: buildName.trim() || "New Build",
-                        description: description || "Work in progress"
-                    });
-                } catch {
-                    setSnackbar({
-                        open: true,
-                        message: 'Please log in first!',
-                        severity: 'warning'
-                    });
-                    return;
-                }
-
-                id = typeof result === 'number' ? result : (result as any)?.buildId;
-                if (!id || !Number.isInteger(id) || id <= 0) {
-                    setSnackbar({
-                        open: true,
-                        message: 'Please log in first!',
-                        severity: 'warning'
-                    });
-                    return;
-                }
-                setBuildId(id);
-            }
-
-            const full = await onGetComponentDetails({componentId: component.id}).catch(() => null);
-            const merged = full ? {...component, ...full, details: full.details, quantity: 1} : {
-                ...component,
-                quantity: 1
-            };
-
-            setSlots(prev => prev.map(slot =>
-                slot.id === activeSlotId ? {...slot, component: merged} : slot
-            ));
-            setBrowserOpen(false);
-
-            await onAddComponentToBuild({buildId: id, componentId: component.id});
-        } catch (e) {
-            setSnackbar({
-                open: true,
-                message: 'Failed to add component to build. Please try again.',
-                severity: 'error'
-            });
-        } finally {
-            // setActiveSlotId(null);
-        }
-    };
-    const handleRemovePart = async (slotId: string) => {
-        const slot = slots.find(s => s.id === slotId);
-        if (!slot?.component || !buildId) return;
-
-        const quantity = slot.component.quantity || 1;
-
-        setSlots(prev => prev.map(s =>
-            s.id === slotId ? {...s, component: null} : s
-        ));
-
-        try {
-            for (let i = 0; i < quantity; i++) {
-                await onRemoveComponentFromBuild({
-                    buildId,
-                    componentId: slot.component.id
-                });
-            }
-        } catch (e) {
-            console.error("Failed to remove component from server", e);
-        }
-    };
-
-    const handleIncrementComponent = async (slotId: string) => {
-        const slot = slots.find(s => s.id === slotId);
-        if (!slot?.component || !buildId) return;
-
-        if (slot.type === 'memory') {
-            const maxSlots = getMaxRamSlots(slots);
-            const currentUsed = calculateUsedRamSlots(slots);
-            const modules = Number(slot.component.details?.modules || slot.component.modules || 1);
-
-            if (maxSlots && (currentUsed + modules > maxSlots)) {
-                setSnackbar({
-                    open: true,
-                    message: `Cannot add more RAM. Motherboard has only ${maxSlots} slots and ${currentUsed} are currently used.`,
-                    severity: 'error'
-                });
-                return;
-            }
-        }
-
-        if (slot.type === 'storage') {
-            const formFactor = slot.component.details?.formFactor || slot.component.formFactor;
-            const maxSlots = 4;
-            const currentUsed = calculateUsedStorageSlots(slots, formFactor);
-
-            if (maxSlots && (currentUsed + 1 > maxSlots)) {
-                setSnackbar({
-                    open: true,
-                    message: `Cannot add more ${formFactor} storage. Motherboard has only ${maxSlots} slots and ${currentUsed} are currently used.`,
-                    severity: 'error'
-                });
-                return;
-            }
-        }
-
-        try {
-            await onAddComponentToBuild({buildId, componentId: slot.component.id});
-
-            setSlots(prev => prev.map(s =>
-                s.id === slotId && s.component
-                    ? {...s, component: {...s.component, quantity: (s.component.quantity || 1) + 1}}
-                    : s
-            ));
-        } catch (e) {
-            setSnackbar({
-                open: true,
-                message: 'Failed to increment component. Please try again.',
-                severity: 'error'
-            });
-        }
-    };
-
-    const handleDecrementComponent = async (slotId: string) => {
-        const slot = slots.find(s => s.id === slotId);
-        if (!slot?.component || !buildId) return;
-
-        const currentQuantity = slot.component.quantity || 1;
-        if (currentQuantity <= 1) return;
-
-        try {
-            await onRemoveComponentFromBuild({buildId, componentId: slot.component.id});
-
-            setSlots(prev => prev.map(s =>
-                s.id === slotId && s.component
-                    ? {...s, component: {...s.component, quantity: (s.component.quantity || 1) - 1}}
-                    : s
-            ));
-        } catch (e) {
-            setSnackbar({
-                open: true,
-                message: 'Failed to decrement component. Please try again.',
-                severity: 'error'
-            });
-        }
-    };
-
-    const handleAddSlot = (type: string, label: string) => {
-        const count = slots.filter(s => s.type === type).length;
-        const newSlot: BuildSlot = {
-            id: `${type}_${count + 1}`,
-            type,
-            label: `${label} ${count > 0 ? count + 1 : ''}`,
-            component: null,
-            required: false
-        };
-        setSlots(prev => [...prev, newSlot]);
-        setAnchorEl(null);
-    };
-
-    const handleDeleteSlot = (slotId: string) => {
-        const slot = slots.find(s => s.id === slotId);
-        if (slot?.component) {
-            handleRemovePart(slotId).catch(() => {
-            });
-        }
-        setSlots(prev => prev.filter(s => s.id !== slotId));
-    };
-
-
-    const [isLoggedIn, setIsLoggedIn] = useState(false);
-    useEffect(() => {
-        onGetAuthState().then(userData => {
-            setIsLoggedIn(!!userData?.userId);
-        });
-    }, []);
-
-
-    const handleSubmit = () => {
-        if (!isLoggedIn) {
-            window.location.href = '/auth/login'
-            return;
-        }
-
-        if (!buildName.trim()) {
-            setSnackbar({
-                open: true,
-                message: 'Please give your build a name!',
-                severity: 'warning'
-            });
-            return;
-        }
-
-        if (!buildId) {
-            setSnackbar({
-                open: true,
-                message: 'Please add at least one component to your build before submitting!',
-                severity: 'warning'
-            });
-            return;
-        }
-
-        setTempDescription(description || "");
-        setSubmitDialogOpen(true);
-    };
-
-    const handleSubmitConfirm = async () => {
-        if (!buildId) return;
-
-        setIsSubmitting(true);
-        setSubmitDialogOpen(false);
-
-        try {
-            await saveBuildState({buildId, name: buildName.trim(), description: tempDescription});
-            const result = await onEditBuild({buildId});
-            if (!result) throw new Error("Failed to save build");
-
-            isSubmittedRef.current = true;
-            window.location.href = "/dashboard/user";
-        } catch (e) {
-            console.error(e);
-            setSnackbar({
-                open: true,
-                message: 'Failed to save build. Please try again.',
-                severity: 'error'
-            });
-            return;
-        } finally {
-            setIsSubmitting(false);
-        }
-    };
-
-    const activeSlotType = useMemo(() => {
-        if (!activeSlotId) return null;
-        return slots.find(s => s.id === activeSlotId)?.type || null;
-    }, [slots, activeSlotId]);
-
-    return (
-        <Container maxWidth="xl" sx={{mt: 0, mb: 10}}>
-            <Paper sx={{p: 4, mb: 0, bgcolor: '#ff8201', border: '1px solid #1e1e1e', color: 'white'}}>
-                <Typography variant="h4" align="center" fontWeight="bold">Forge Your Machine</Typography>
-                <Box sx={{display: 'flex', justifyContent: 'center', mt: 2}}>
-                    <TextField
-                        label="Build Name *"
-                        value={buildName}
-                        onChange={e => setBuildName(e.target.value)}
-                        sx={{bgcolor: '#1e1e1e', textAlign: 'center', borderRadius: 1, color: 'white', width: '200px'}}
-                    />
-                </Box>
-
-            </Paper>
-
-            <TableContainer component={Paper} elevation={3}>
-                <Table sx={{minWidth: 650}}>
-                    <TableHead sx={{bgcolor: '#1e1e1e'}}>
-                        <TableRow>
-                            <TableCell sx={{color: 'white', fontWeight: 'bold'}}>Component</TableCell>
-                            <TableCell sx={{color: 'white', fontWeight: 'bold'}}>Selection & Specs</TableCell>
-                            <TableCell sx={{color: 'white', fontWeight: 'bold'}}>Price</TableCell>
-                            <TableCell sx={{color: 'white', fontWeight: 'bold'}} align="right">Actions</TableCell>
-                        </TableRow>
-                    </TableHead>
-                    <TableBody>
-                        {slots.map((slot) => (
-                            <TableRow key={slot.id} hover>
-                                <TableCell width="15%" sx={{
-                                    fontWeight: 'bold',
-                                    bgcolor: '#1e1e1e',
-                                    color: 'white',
-                                    verticalAlign: 'top',
-                                    pt: 3,
-                                    borderRight: '1px solid #333'
-                                }}>
-                                    {slot.label}
-                                    {slot.required &&
-                                        <Chip label="Required" size="small" color="error" sx={{ml: 1, height: 20}}/>}
-                                </TableCell>
-
-                                <TableCell>
-                                    {slot.component ? (
-                                        <Box sx={{display: 'flex', gap: 2, alignItems: 'flex-start'}}>
-                                            <Avatar
-                                                variant="rounded"
-                                                src={slot.component.imgUrl || slot.component.img_url}
-                                                sx={{width: 60, height: 60, bgcolor: '#eee'}}
-                                            >
-                                                {slot.component.brand?.[0]}
-                                            </Avatar>
-                                            <Box>
-                                                <Typography
-                                                    variant="subtitle1"
-                                                    fontWeight="bold"
-                                                    sx={{cursor: 'pointer', color: 'primary.main'}}
-                                                    onClick={() => setDetailsOpen(slot.component)}
-                                                >
-                                                    {slot.component.name}
-                                                </Typography>
-                                                <Box sx={{display: 'flex', flexWrap: 'wrap', gap: 1, mt: 0.5}}>
-                                                    {renderSpecs(slot.component, slot.type)}
-                                                </Box>
-                                            </Box>
-                                        </Box>
-                                    ) : (
-                                        <Button
-                                            variant="outlined"
-                                            startIcon={<AddIcon/>}
-                                            onClick={() => handlePickPart(slot.id)}
-                                            sx={{textTransform: 'none', color: '#666', borderColor: '#ccc'}}
-                                        >
-                                            Choose {slot.label}
-                                        </Button>
-                                    )}
-                                </TableCell>
-
-                                <TableCell width="10%" sx={{verticalAlign: 'top', pt: 3}}>
-                                    {slot.component ? (
-                                        <>
-                                            ${(Number(slot.component.price) * (slot.component.quantity || 1)).toFixed(2)}
-                                            {(slot.component.quantity || 1) > 1 && (
-                                                <Typography variant="caption" display="block" color="text.secondary">
-                                                    ${Number(slot.component.price).toFixed(2)} each
-                                                </Typography>
-                                            )}
-                                        </>
-                                    ) : '-'}
-                                </TableCell>
-
-                                <TableCell align="right" width="15%" sx={{verticalAlign: 'top', pt: 2}}>
-                                    <Box sx={{
-                                        display: 'flex',
-                                        gap: 1,
-                                        justifyContent: 'flex-end',
-                                        alignItems: 'center'
-                                    }}>
-                                        {slot.component && (
-                                            <>
-                                                {(slot.type === 'memory' || slot.type === 'storage') && (
-                                                    <>
-                                                        <IconButton
-                                                            size="small"
-                                                            color="primary"
-                                                            onClick={() => handleDecrementComponent(slot.id)}
-                                                            disabled={(slot.component.quantity || 1) <= 1}
-                                                            sx={{
-                                                                bgcolor: 'action.hover',
-                                                                '&:disabled': {bgcolor: 'action.disabledBackground'}
-                                                            }}
-                                                        >
-                                                            <RemoveIcon/>
-                                                        </IconButton>
-
-                                                        <Typography
-                                                            variant="body2"
-                                                            sx={{
-                                                                minWidth: '20px',
-                                                                textAlign: 'center',
-                                                                fontWeight: 'bold'
-                                                            }}
-                                                        >
-                                                            {slot.component.quantity || 1}
-                                                        </Typography>
-
-                                                        <IconButton
-                                                            size="small"
-                                                            color="primary"
-                                                            onClick={() => handleIncrementComponent(slot.id)}
-                                                            sx={{bgcolor: 'action.hover'}}
-                                                        >
-                                                            <AddIcon/>
-                                                        </IconButton>
-                                                    </>
-                                                )}
-
-                                                <IconButton
-                                                    color="error"
-                                                    onClick={() => handleRemovePart(slot.id)}
-                                                >
-                                                    <DeleteIcon/>
-                                                </IconButton>
-                                            </>
-                                        )}
-
-                                        {!slot.required && (
-                                            <IconButton
-                                                color="warning"
-                                                onClick={() => handleDeleteSlot(slot.id)}
-                                            >
-                                                <CloseIcon/>
-                                            </IconButton>
-                                        )}
-                                    </Box>
-                                </TableCell>
-                            </TableRow>
-                        ))}
-                    </TableBody>
-                </Table>
-            </TableContainer>
-
-            <Box sx={{mt: 4, display: 'flex', justifyContent: 'center'}}>
-                <Button variant="outlined" startIcon={<AddIcon/>} onClick={(e) => setAnchorEl(e.currentTarget)}
-                        sx={{mr: 2}}>
-                    Add Optional Component
-                </Button>
-                <Menu
-                    anchorEl={anchorEl}
-                    open={Boolean(anchorEl)}
-                    onClose={() => setAnchorEl(null)}
-                    anchorReference="none"
-                    sx={{
-                        display: 'flex',
-                        alignItems: 'center',
-                        justifyContent: 'center',
-                    }}
-                    slotProps={{
-                        paper: {
-                            sx: {
-                                position: 'absolute',
-                                top: '46%',
-                                // left: '50%',
-                                // transform: 'translate(50%, +50%)',
-                            }
-                        }
-                    }}
-                >
-                    {/*Removed RAM & Storage from optional components*/}
-                    <Typography sx={{px: 2, py: 1, display: 'block', color: 'text.secondary'}}>
-                        Accessories
-                    </Typography>
-                    <MenuItem onClick={() => handleAddSlot('optical_drive', 'Optical Drive')}>
-                        <ListItemIcon><AlbumIcon/></ListItemIcon>
-                        Optical Drive
-                    </MenuItem>
-                    <MenuItem onClick={() => handleAddSlot('cables', 'Cable')}>
-                        <ListItemIcon><CableIcon/></ListItemIcon>
-                        Cables
-                    </MenuItem>
-
-                    <Typography sx={{px: 2, py: 1, display: 'block', color: 'text.secondary', mt: 1}}>
-                        Expansion Cards
-                    </Typography>
-                    <MenuItem onClick={() => handleAddSlot('memory_card', 'Storage Card')}>
-                        <ListItemIcon><MemoryIcon/></ListItemIcon>
-                        Storage Card
-                    </MenuItem>
-                    <MenuItem onClick={() => handleAddSlot('sound_card', 'Sound Card')}>
-                        <ListItemIcon><RouterIcon/></ListItemIcon>
-                        Sound Card
-                    </MenuItem>
-                    <MenuItem onClick={() => handleAddSlot('network_card', 'Network Card')}>
-                        <ListItemIcon><RouterIcon/></ListItemIcon>
-                        Network Card
-                    </MenuItem>
-                    <MenuItem onClick={() => handleAddSlot('network_adapter', 'WiFi Adapter')}>
-                        <ListItemIcon><RouterIcon/></ListItemIcon>
-                        WiFi Adapter
-                    </MenuItem>
-                </Menu>
-            </Box>
-
-            <Box sx={{mt: 4, p: 4, bgcolor: '#1e1e1e', textAlign: 'center', borderRadius: 2}}>
-                <Typography variant="h5" sx={{mb: 2, fontWeight: 'bold', color: 'white'}}>
-                    Total: ${totalPrice.toFixed(2)}
-                </Typography>
-                <Button
-                    variant="contained"
-                    color="primary"
-                    size="large"
-                    onClick={handleSubmit}
-                    disabled={isSubmitting}
-                >
-                    {isSubmitting ? <CircularProgress size={24}/> : 'Save Build'}
-                </Button>
-            </Box>
-
-            <ComponentDialog
-                open={browserOpen}
-                category={activeSlotType}
-                onClose={() => {
-                    setBrowserOpen(false);
-                    setActiveSlotId(null);
-                }}
-                mode="forge"
-                onSelect={handleSelectComponent}
-                currentBuildId={buildId}
-            />
-
-            <ComponentDetailsDialog
-                open={!!detailsOpen}
-                component={detailsOpen}
-                onClose={() => setDetailsOpen(null)}
-            />
-
-            <Dialog open={submitDialogOpen} onClose={() => setSubmitDialogOpen(false)} maxWidth="sm" fullWidth>
-                <DialogTitle sx={{bgcolor: '#ff8201', color: 'white', fontWeight: 'bold'}}>
-                    Build Description
-                </DialogTitle>
-                <DialogContent sx={{p: 3}}>
-                    <Typography variant="body1" sx={{mb: 2, color: 'text.secondary'}}>
-                        Add some notes about your build (optional):
-                    </Typography>
-                    <TextField
-                        fullWidth
-                        multiline
-                        rows={4}
-                        placeholder="e.g. Workstation monster, great for crunching numbers!"
-                        value={tempDescription}
-                        onChange={(e) => setTempDescription(e.target.value)}
-                        variant="outlined"
-                    />
-                </DialogContent>
-                <DialogActions sx={{p: 3, pt: 0}}>
-                    <Button onClick={() => setSubmitDialogOpen(false)}>
-                        Cancel
-                    </Button>
-                    <Button
-                        variant="contained"
-                        color="primary"
-                        onClick={handleSubmitConfirm}
-                        disabled={isSubmitting}
-                    >
-                        {isSubmitting ? (
-                            <>
-                                <CircularProgress size={20} sx={{mr: 1}}/>
-                                Submitting...
-                            </>
-                        ) : (
-                            'Submit Build'
-                        )}
-                    </Button>
-                </DialogActions>
-            </Dialog>
-            <Snackbar
-                open={snackbar.open}
-                autoHideDuration={4000}
-                onClose={() => setSnackbar(prev => ({...prev, open: false}))}
-                anchorOrigin={{vertical: 'bottom', horizontal: 'center'}}
-            >
-                <Alert
-                    onClose={() => setSnackbar(prev => ({...prev, open: false}))}
-                    severity={snackbar.severity}
-                    variant="filled"
-                    sx={{width: '100%'}}
-                >
-                    {snackbar.message}
-                </Alert>
-            </Snackbar>
-        </Container>
-    );
-}
Index: ges/forge/forge.telefunc.ts
===================================================================
--- pages/forge/forge.telefunc.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,90 +1,0 @@
-import * as drizzleQueries from "../../database/drizzle/queries";
-import {ctx, getAuthState, requireUser} from "../../server/telefunc/ctx";
-import {Abort} from "telefunc";
-import type {Database} from "../../database/drizzle/db";
-import {removeComponentFromBuild} from "../../database/drizzle/queries";
-
-export async function onRemoveComponentFromBuild({ buildId, componentId }
-                                                 : { buildId: number, componentId: number }) {
-    const { c, userId } = requireUser()
-
-    const result = await drizzleQueries.removeComponentFromBuild(c.db, userId, buildId, componentId);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onAddComponentToBuild({ buildId, componentId }: { buildId: number, componentId: number }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-    if(!Number.isInteger(componentId) || componentId <= 0) throw Abort();
-
-    const result = await drizzleQueries.addComponentToBuild(c.db, userId, buildId, componentId);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onDeleteBuild({ buildId }: { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    const result = await drizzleQueries.deleteBuild(c.db, userId, buildId);
-    if(!result) throw Abort();
-
-    return { success: true };
-}
-
-export async function onGetBuildComponents({ buildId }
-                                           : { buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const buildComponents = await drizzleQueries.getBuildComponents(c.db, buildId);
-
-    if(!buildComponents) throw Abort();
-
-    return buildComponents;
-}
-
-export async function onGetCompatibleComponents({ buildId, componentType, limit, sort }
-                                                : { buildId: number, componentType: string, limit?: number, sort?: string }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const compatibleComponents = await drizzleQueries.getCompatibleComponents(c.db, buildId, componentType, limit, sort);
-
-    if(!compatibleComponents) throw Abort();
-
-    return compatibleComponents;
-}
-
-export async function onGetBuildState({ buildId }
-                                      :{ buildId: number }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const buildState = await drizzleQueries.getBuildState(c.db, userId, buildId);
-
-    if(!buildState) throw Abort();
-
-    return buildState;
-}
-
-export async function saveBuildState({ buildId, name, description }
-                                     :{ buildId: number, name: string, description: string }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-
-    const result = await drizzleQueries.saveBuildState(c.db, userId, buildId, name, description);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
Index: ges/forge/types/buildTypes.ts
===================================================================
--- pages/forge/types/buildTypes.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,18 +1,0 @@
-export type BuildSlot = {
-    id: string;
-    type: string;
-    label: string;
-    component: any | null;
-    required: boolean;
-};
-
-export const INITIAL_SLOTS: BuildSlot[] = [
-    {id: 'cpu', type: 'cpu', label: 'CPU', component: null, required: true},
-    {id: 'cooler', type: 'cooler', label: 'CPU Cooler', component: null, required: true},
-    {id: 'motherboard', type: 'motherboard', label: 'Motherboard', component: null, required: true},
-    {id: 'memory_1', type: 'memory', label: 'Memory', component: null, required: true},
-    {id: 'gpu', type: 'gpu', label: 'Video Card', component: null, required: true},
-    {id: 'storage_1', type: 'storage', label: 'Storage', component: null, required: true},
-    {id: 'powersupply', type: 'power_supply', label: 'Power Supply', component: null, required: true},
-    {id: 'case', type: 'case', label: 'Case', component: null, required: true},
-];
Index: ges/forge/utils/RenderSpecs.tsx
===================================================================
--- pages/forge/utils/RenderSpecs.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,97 +1,0 @@
-import {Chip, Typography} from '@mui/material';
-import React from "react";
-
-export function renderSpecs(c: any, type: string) {
-    if (!c) return null;
-    const data = {...c, ...(c.details || {})};
-    const chipStyle = {height: 24, fontSize: '0.75rem', bgcolor: 'rgba(0,0,0,0.05)'};
-    const specs: string[] = [];
-    const val = (k: string) => data[k] || data[k.toLowerCase()] || data[k.replace('_', '')];
-
-    switch (type) {
-
-        case 'cpu':
-            if (val('socket')) specs.push(`Socket: ${val('socket')}`);
-            if (val('cores')) specs.push(`${val('cores')} Cores / ${val('threads')} Threads`);
-            const base = data.baseclock || data.baseClock || data.base_clock;
-            const boost = data.boostclock || data.boostClock || data.boost_clock;
-            if (base) specs.push(`Base Clock Speed: ${base}GHz`);
-            if (boost) specs.push(`Boost Clock Speed: ${boost}GHz`);
-            break;
-        case 'gpu':
-            if (val('vram')) specs.push(`VRAM: ${val('vram')}GB`);
-            if (val('tdp')) specs.push(`Card TDP: ${val('tdp')}W`);
-            if (val('length')) specs.push(`Length: ${val('length')}mm`);
-            if (val('baseClock')) specs.push(`Base Clock Speed: ${val('baseClock')}GHz`);
-            if (val('boostClock')) specs.push(`Boost Clock Speed: ${val('boostClock')}GHz`);
-            break;
-        case 'motherboard':
-            if (val('socket')) specs.push(`Socket: ${val('socket')}`);
-            if (val('formFactor')) specs.push(`Form Factor: ${val('formFactor')}`);
-            if (val('ramType')) specs.push(`RAM Type: ${val('ramType')}`);
-            if (val('numRamSlots')) specs.push(`RAM Slots: ${val('numRamSlots')}`);
-            if (val('maxRamCapacity')) specs.push(`Max Ram Caacity: ${val('maxRamCapacity')}GB`);
-            break;
-        case 'memory':
-            if (val('capacity')) specs.push(`Size Per Stick: ${val('capacity')}GB`);
-            if (val('type')) specs.push(`RAM Type: ${val('type')}`);
-            if (val('speed')) specs.push(`RAM Speed: ${val('speed')} MHz`);
-            if (val('modules')) specs.push(`Modules: ${val('modules')}`);
-            break;
-        case 'storage':
-            if (val('capacity')) specs.push(`Capacity: ${val('capacity')}GB`);
-            if (val('type')) specs.push(`Type: ${val('type')}`);
-            break;
-        case 'power_supply':
-            if (val('wattage')) specs.push(`Wattage: ${val('wattage')}W`);
-            if (val('type')) specs.push(`Type: ${val('type')}`);
-            if (val('formFactor')) specs.push(`Form Factor: ${val('formFactor')}`);
-            break;
-        case 'case':
-            if (val('gpuMaxLength')) specs.push(`Max GPU Length: ${val('gpuMaxLength')}mm`);
-            if (val('coolerMaxHeight')) specs.push(`Max CPU Cooler Height: ${val('coolerMaxHeight')}mm`);
-            break;
-        case 'cooler':
-            if (val('type')) specs.push(`Cooler Type: ${val('type')} Cooler`);
-            if (val('height')) specs.push(`Height: ${val('height')}mm`);
-            if (val('maxTdpSupported')) specs.push(`Max TDP: ${val('maxTdpSupported')}W`);
-            break;
-        case 'network_card':
-            if (val('interface')) specs.push(`Interface: ${val('interface')}`);
-            if (val('numPorts')) specs.push(`Number of Ports: ${val('numPorts')}`);
-            if (val('speed')) specs.push(`Speed: ${val('speed')}Mbps`);
-            break;
-        case 'network_adapter':
-            if (val('interface')) specs.push(`Interface: ${val('interface')}`);
-            if (val('numAntennas')) specs.push(`Number of Antennas: ${val('numAntennas')}`);
-            if (val('wifiVersion')) specs.push(`Wi-Fi Version: ${val('wifiVersion')}`);
-            break;
-        case 'sound_card':
-            if (val('interface')) specs.push(`Interface: ${val('interface')}`);
-            if (val('chipset')) specs.push(`Chipset: ${val('chipset')}`);
-            if (val('channel')) specs.push(`Channels: ${val('channel')}`);
-            break;
-        case 'memory_card':
-            if (val('interface')) specs.push(`Interface: ${val('interface')}`);
-            if (val('numSlots')) specs.push(`Number of Slots: ${val('numSlots')}`);
-            break;
-        case 'optical_drive':
-            if (val('interface')) specs.push(`Interface: ${val('interface')}`);
-            if (val('type')) specs.push(`Type: ${val('type')}`);
-            if (val('formFactor')) specs.push(`Form Factor: ${val('formFactor')}`);
-            break;
-        case 'cables':
-            if (val('type')) specs.push(`Type of Cables: ${val('type')}`);
-            if (val('lengthCm')) specs.push(`Length: ${val('lengthCm')}cm`);
-            break;
-        default:
-            if (data.brand) specs.push(data.brand);
-    }
-
-    if (specs.length === 0) {
-        if (data.brand) return <Chip label={data.brand} sx={chipStyle}/>;
-        return <Typography variant="caption" color="text.secondary">...</Typography>;
-    }
-
-    return specs.map((label, i) => <Chip key={i} label={label} sx={chipStyle}/>);
-}
Index: ges/forge/utils/componentCalculations.ts
===================================================================
--- pages/forge/utils/componentCalculations.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,54 +1,0 @@
-// Helper Functions
-import {BuildSlot} from "../types/buildTypes";
-
-export function calculateUsedRamSlots(slots: BuildSlot[]): number {
-    return slots
-        .filter(s => s.type === 'memory' && s.component)
-        .reduce((sum, s) => {
-            const modules = Number(s.component?.details?.modules || s.component?.modules || 1);
-            const quantity = Number(s.component?.quantity || 1);
-            return sum + (modules * quantity);
-        }, 0);
-}
-
-export function getMaxRamSlots(slots: BuildSlot[]): number | null {
-    const mobo = slots.find(s => s.type === 'motherboard' && s.component);
-    if (!mobo?.component?.details?.numRamSlots) return null;
-    return Number(mobo.component.details.numRamSlots);
-}
-
-export function calculateUsedStorageSlots(slots: BuildSlot[], formFactor: string): number {
-    return slots
-        .filter(s => s.type === 'storage' && s.component)
-        .reduce((sum, s) => {
-            const componentFormFactor = s.component?.details?.formFactor || s.component?.details?.form_factor || s.component?.formFactor;
-            if (componentFormFactor?.trim().toLowerCase() === formFactor?.trim().toLowerCase()) {
-                return sum + Number(s.component?.quantity || 1);
-            }
-            return sum;
-        }, 0);
-}
-
-export function getMaxStorageSlots(slots: BuildSlot[], formFactor: string): number | null {
-    const pcCase = slots.find(s => s.type === 'case' && s.component);
-    if (!pcCase?.component?.details?.storageFormFactors) return null;
-
-    const storageFormFactors = pcCase.component.details.storageFormFactors;
-
-    if (!Array.isArray(storageFormFactors)) {
-        return null;
-    }
-
-    const storageFF = storageFormFactors.find((sf: any) => {
-        const sfFormFactor = sf.formFactor || sf.form_factor;
-        return sfFormFactor?.trim().toLowerCase() === formFactor?.trim().toLowerCase();
-    });
-
-    if (!storageFF) {
-        return null;
-    }
-
-    const numSlots = storageFF.numSlots || storageFF.num_slots;
-
-    return Number(numSlots) || null;
-}
Index: pages/index/+Page.tsx
===================================================================
--- pages/index/+Page.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ pages/index/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,210 +1,16 @@
-import React, {useEffect, useState} from 'react';
-import {
-    Container, Box, Typography, Button, IconButton, Dialog, DialogTitle, DialogContent
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh';
-import ListIcon from '@mui/icons-material/List';
+import { Counter } from "./Counter.js";
 
-import BuildDetailsDialog from '../../components/BuildDetailsDialog';
-import BuildCard from '../../components/BuildCard';
-
-import {onGetApprovedBuilds, onGetAuthState} from '../+Layout.telefunc';
-
-export default function HomePage() {
-    const [data, setData] = useState<any>(null);
-    const [allRanked, setAllRanked] = useState<any[]>([]);
-
-    const [selectedBuildId, setSelectedBuildId] = useState<number | null>(null);
-    const [openRankedPopup, setOpenRankedPopup] = useState(false);
-
-    useEffect(() => {
-        async function loadSite() {
-            try {
-                const [
-                    authData,
-                    highestRankedBuilds,
-                    communityBuilds,
-                    fullRankedList
-                ] = await Promise.all([
-                    onGetAuthState(),
-                    onGetApprovedBuilds({limit: 5, sort: 'rating_desc'}),
-                    onGetApprovedBuilds({limit: 12}),
-                    onGetApprovedBuilds({limit: 20, sort: 'rating_desc'})
-                ]);
-
-                setData({
-                    isLoggedIn: authData.isLoggedIn,
-                    userId: authData.userId,
-                    prebuilts: highestRankedBuilds,
-                    communityBuilds: communityBuilds
-                });
-                setAllRanked(fullRankedList);
-            } catch (error) {
-                console.error("Error loading homepage data:", error);
-            }
-        }
-
-        void loadSite();
-    }, []);
-
-    if (!data) return <Box sx={{p: 10, textAlign: 'center'}}>Loading Forge...</Box>;
-
-    return (
-        <Box>
-            <Box sx={{
-                position: 'relative', height: '500px',
-                display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'white',
-                '&::before': {
-                    content: '""', position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',
-                    backgroundColor: 'rgba(0,0,0,0.6)'
-                }
-            }}>
-                <Box sx={{position: 'relative', textAlign: 'center', zIndex: 1, p: 2}}>
-                    <Typography variant="h2" fontWeight="bold" gutterBottom>Forge Your Ultimate Machine</Typography>
-                    <Typography variant="h5" sx={{maxWidth: '800px', mx: 'auto', mb: 1}}>
-                        Build, share, discuss, and discover custom PC configurations.
-                    </Typography>
-                    <Button variant="contained" size="large" href="/forge" startIcon={<AutoFixHighIcon/>}
-                            sx={{fontSize: '1.2rem', px: 4, py: 1.5, mt: 2}}>
-                        Start Forging
-                    </Button>
-                </Box>
-            </Box>
-
-            <Container maxWidth="xl" sx={{mt: 6, mb: 10}}>
-                <Box sx={{
-                    mb: 2, borderLeft: '5px solid #ff8201', pl: 1,
-                    display: 'flex', justifyContent: 'space-between', alignItems: 'end'
-                }}>
-                    <Box>
-                        <Typography variant="h4" fontWeight="bold">Hall of Fame</Typography>
-                        <Typography variant="subtitle1" color="text.secondary">
-                            The highest rated configurations from across the community.
-                        </Typography>
-                    </Box>
-                    <Button variant="outlined" startIcon={<ListIcon/>} onClick={() => setOpenRankedPopup(true)}>
-                        Show All Top Ranked
-                    </Button>
-                </Box>
-                <Box
-                    sx={{
-                        display: 'grid',
-                        gridTemplateColumns: {
-                            xs: '1fr',
-                            sm: 'repeat(2, 1fr)',
-                            md: 'repeat(3, 1fr)',
-                            lg: 'repeat(4, 1fr)',
-                            xl: 'repeat(5, 1fr)',
-                        },
-                        gap: 3,
-                        width: '100%',
-                        mb: 8
-                    }}
-                >
-                    {data.prebuilts.map((build: any) => (
-                        <BuildCard
-                            key={build.id}
-                            build={build}
-                            onClick={() => setSelectedBuildId(build.id)}
-                        />
-                    ))}
-                </Box>
-
-                <Box sx={{
-                    mb: 2, mt: 2, borderLeft: '5px solid #ff8201', pl: 1,
-                }}>
-                    <Typography variant="h4" fontWeight="bold" color="text.primary">Community Forge</Typography>
-                    <Typography variant="subtitle1" color="text.secondary" sx={{mb: 2}}>Fresh builds from users around the world.</Typography>
-                </Box>
-                <Box
-                    sx={{
-                        display: 'grid',
-                        gridTemplateColumns: {
-                            xs: '1fr',
-                            sm: 'repeat(2, 1fr)',
-                            md: 'repeat(3, 1fr)',
-                            lg: 'repeat(4, 1fr)',
-                            xl: 'repeat(5, 1fr)',
-                        },
-                        gap: 3,
-                        width: '100%',
-                    }}
-                >
-                    {data.communityBuilds.map((build: any) => (
-                        <BuildCard
-                            key={build.id}
-                            build={build}
-                            onClick={() => setSelectedBuildId(build.id)}
-                        />
-                    ))}
-                </Box>
-
-                <Box sx={{display: 'flex', justifyContent: 'center', mt: 6}}>
-                    <Button variant="outlined" size="large" href="/completed-builds">View All Community Builds</Button>
-                </Box>
-            </Container>
-
-            <BuildDetailsDialog
-                open={!!selectedBuildId}
-                buildId={selectedBuildId}
-                currentUser={data.userId}
-                onClose={() => setSelectedBuildId(null)}
-            />
-
-            <Dialog open={openRankedPopup} onClose={() => setOpenRankedPopup(false)} maxWidth="xl" fullWidth scroll="paper">
-                <DialogTitle sx={{display: 'flex', justifyContent: 'space-between', alignItems: 'center'}}>
-                    Hall of Fame (Top Rated)
-                    <IconButton onClick={() => setOpenRankedPopup(false)}><CloseIcon/></IconButton>
-                </DialogTitle>
-                <DialogContent dividers sx={{p: 3}}>
-                    <Box
-                        sx={{
-                            display: 'grid',
-                            gridTemplateColumns: {
-                                xs: '1fr',
-                                sm: 'repeat(2, 1fr)',
-                                md: 'repeat(3, 1fr)',
-                                lg: 'repeat(4, 1fr)',
-                                xl: 'repeat(5, 1fr)',
-                            },
-                            gap: 3,
-                            width: '100%'
-                        }}
-                    >
-                        {allRanked.map((build: any, index: number) => (
-                            <Box key={`ranked-${build.id}`} sx={{position: 'relative', width: '100%'}}>
-                                <Box sx={{
-                                    position: 'absolute',
-                                    top: -10,
-                                    left: -10,
-                                    zIndex: 1,
-                                    width: 35,
-                                    height: 35,
-                                    borderRadius: '50%',
-                                    bgcolor: index < 3 ? '#ff8201' : 'grey.800',
-                                    color: 'white',
-                                    display: 'flex',
-                                    alignItems: 'center',
-                                    justifyContent: 'center',
-                                    fontWeight: 'bold',
-                                    border: '2px solid white',
-                                    boxShadow: 2,
-                                }}>
-                                    #{index + 1}
-                                </Box>
-                                <BuildCard
-                                    build={build}
-                                    onClick={() => {
-                                        setOpenRankedPopup(false);
-                                        setSelectedBuildId(build.id);
-                                    }}
-                                />
-                            </Box>
-                        ))}
-                    </Box>
-                </DialogContent>
-            </Dialog>
-        </Box>
-    );
+export default function Page() {
+  return (
+    <>
+      <h1>My Vike app</h1>
+      <p>This page is:</p>
+      <ul>
+        <li>Rendered to HTML.</li>
+        <li>
+          Interactive. <Counter />
+        </li>
+      </ul>
+    </>
+  );
 }
Index: pages/index/Counter.tsx
===================================================================
--- pages/index/Counter.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/index/Counter.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,11 @@
+import { useState } from "react";
+
+export function Counter() {
+  const [count, setCount] = useState(0);
+
+  return (
+    <button type="button" onClick={() => setCount((count) => count + 1)}>
+      Counter {count}
+    </button>
+  );
+}
Index: pages/star-wars/@id/+Page.tsx
===================================================================
--- pages/star-wars/@id/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/star-wars/@id/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,16 @@
+import { useData } from "vike-react/useData";
+import type { Data } from "./+data.js";
+
+export default function Page() {
+  const { movie } = useData<Data>();
+  return (
+    <>
+      <h1>{movie.title}</h1>
+      Release Date: {movie.release_date}
+      <br />
+      Director: {movie.director}
+      <br />
+      Producer: {movie.producer}
+    </>
+  );
+}
Index: pages/star-wars/@id/+data.ts
===================================================================
--- pages/star-wars/@id/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/star-wars/@id/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,31 @@
+// https://vike.dev/data
+
+import type { PageContextServer } from "vike/types";
+import { useConfig } from "vike-react/useConfig";
+import type { MovieDetails } from "../types.js";
+
+export type Data = Awaited<ReturnType<typeof data>>;
+
+export async function data(pageContext: PageContextServer) {
+  // https://vike.dev/useConfig
+  const config = useConfig();
+
+  const response = await fetch(`https://brillout.github.io/star-wars/api/films/${pageContext.routeParams.id}.json`);
+  let movie = (await response.json()) as MovieDetails;
+
+  config({
+    // Set <title>
+    title: movie.title,
+  });
+
+  // We remove data we don't need because the data is passed to
+  // the client; we should minimize what is sent over the network.
+  movie = minimize(movie);
+
+  return { movie };
+}
+
+function minimize(movie: MovieDetails): MovieDetails {
+  const { id, title, release_date, director, producer } = movie;
+  return { id, title, release_date, director, producer };
+}
Index: pages/star-wars/index/+Page.tsx
===================================================================
--- pages/star-wars/index/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/star-wars/index/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,21 @@
+import { useData } from "vike-react/useData";
+import type { Data } from "./+data.js";
+
+export default function Page() {
+  const { movies } = useData<Data>();
+  return (
+    <>
+      <h1>Star Wars Movies</h1>
+      <ol>
+        {movies.map(({ id, title, release_date }) => (
+          <li key={id}>
+            <a href={`/star-wars/${id}`}>{title}</a> ({release_date})
+          </li>
+        ))}
+      </ol>
+      <p>
+        Source: <a href="https://brillout.github.io/star-wars">brillout.github.io/star-wars</a>.
+      </p>
+    </>
+  );
+}
Index: pages/star-wars/index/+data.ts
===================================================================
--- pages/star-wars/index/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/star-wars/index/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,32 @@
+// https://vike.dev/data
+
+import { useConfig } from "vike-react/useConfig";
+import type { Movie, MovieDetails } from "../types.js";
+
+export type Data = Awaited<ReturnType<typeof data>>;
+
+export async function data() {
+  // https://vike.dev/useConfig
+  const config = useConfig();
+
+  const response = await fetch("https://brillout.github.io/star-wars/api/films.json");
+  const moviesData = (await response.json()) as MovieDetails[];
+
+  config({
+    // Set <title>
+    title: `${moviesData.length} Star Wars Movies`,
+  });
+
+  // We remove data we don't need because the data is passed to the client; we should
+  // minimize what is sent over the network.
+  const movies = minimize(moviesData);
+
+  return { movies };
+}
+
+function minimize(movies: MovieDetails[]): Movie[] {
+  return movies.map((movie) => {
+    const { title, release_date, id } = movie;
+    return { title, release_date, id };
+  });
+}
Index: pages/star-wars/types.ts
===================================================================
--- pages/star-wars/types.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/star-wars/types.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,10 @@
+export type Movie = {
+  id: string;
+  title: string;
+  release_date: string;
+};
+
+export type MovieDetails = Movie & {
+  director: string;
+  producer: string;
+};
Index: pages/todo/+Page.tsx
===================================================================
--- pages/todo/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/todo/+Page.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,10 @@
+import { TodoList } from "./TodoList.js";
+
+export default function Page() {
+  return (
+    <>
+      <h1>To-do List</h1>
+      <TodoList />
+    </>
+  );
+}
Index: pages/todo/+config.ts
===================================================================
--- pages/todo/+config.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/todo/+config.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,3 @@
+export const config = {
+  prerender: false,
+};
Index: pages/todo/+data.ts
===================================================================
--- pages/todo/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/todo/+data.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,12 @@
+// https://vike.dev/data
+
+import * as drizzleQueries from "../../database/drizzle/queries/todos";
+import type { PageContextServer } from "vike/types";
+
+export type Data = Awaited<ReturnType<typeof data>>;
+
+export async function data(_pageContext: PageContextServer) {
+  const todoItemsInitial = await drizzleQueries.getAllTodos(_pageContext.db);
+
+  return { todoItemsInitial };
+}
Index: pages/todo/TodoList.telefunc.ts
===================================================================
--- pages/todo/TodoList.telefunc.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/todo/TodoList.telefunc.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,9 @@
+// We use Telefunc (https://telefunc.com) for data mutations.
+
+import * as drizzleQueries from "../../database/drizzle/queries/todos";
+import { getContext } from "telefunc";
+
+export async function onNewTodo({ text }: { text: string }) {
+  const context = getContext();
+  await drizzleQueries.insertTodo(context.db, text);
+}
Index: pages/todo/TodoList.tsx
===================================================================
--- pages/todo/TodoList.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
+++ pages/todo/TodoList.tsx	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -0,0 +1,36 @@
+import type { Data } from "./+data";
+import { onNewTodo } from "./TodoList.telefunc";
+import { useState } from "react";
+import { useData } from "vike-react/useData";
+
+export function TodoList() {
+  const { todoItemsInitial } = useData<Data>();
+  const [todoItems, setTodoItems] = useState<{ text: string }[]>(todoItemsInitial);
+  const [newTodo, setNewTodo] = useState("");
+  return (
+    <>
+      <ul>
+        {todoItems.map((todoItem, index) => (
+          // biome-ignore lint: example
+          <li key={index}>{todoItem.text}</li>
+        ))}
+      </ul>
+      <div>
+        <form
+          onSubmit={async (ev) => {
+            ev.preventDefault();
+
+            const text = newTodo;
+            setTodoItems((prev) => [...prev, { text }]);
+            setNewTodo("");
+
+            await onNewTodo({ text });
+          }}
+        >
+          <input type="text" onChange={(ev) => setNewTodo(ev.target.value)} value={newTodo} />
+          <button type="submit">Add to-do</button>
+        </form>
+      </div>
+    </>
+  );
+}
Index: nderer/PageShell.tsx
===================================================================
--- renderer/PageShell.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,58 +1,0 @@
-import React from 'react';
-import { PageContextProvider } from './usePageContext';
-import { CacheProvider } from '@emotion/react';
-import { ThemeProvider, createTheme } from '@mui/material/styles';
-import CssBaseline from '@mui/material/CssBaseline';
-import { EmotionCache } from '@emotion/cache';
-import Box from '@mui/material/Box';
-import Navbar from '../components/Navbar';
-import Footer from '../components/Footer';
-
-const theme = createTheme({
-    palette: {
-        mode: 'dark',
-        primary: {
-            main: '#90caf9',
-        },
-        background: {
-            default: '#121212',
-            paper: '#1e1e1e',
-        },
-    },
-    typography: {
-        fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
-    },
-});
-
-export function PageShell({children, pageContext, emotionCache,}: {
-    children: React.ReactNode;
-    pageContext: any;
-    emotionCache: EmotionCache;
-}) {
-    return (
-        <React.StrictMode>
-            <PageContextProvider pageContext={pageContext}>
-                <CacheProvider value={emotionCache}>
-                    <ThemeProvider theme={theme}>
-                        <CssBaseline />
-                        <Box
-                            sx={{
-                                display: 'flex',
-                                flexDirection: 'column',
-                                minHeight: '100vh',
-                                bgcolor: 'background.default',
-                                color: 'text.primary',
-                            }}
-                        >
-                            <Navbar />
-                            <Box component="main" sx={{ flexGrow: 1, py: 3 }}>
-                                {children}
-                            </Box>
-                            <Footer />
-                        </Box>
-                    </ThemeProvider>
-                </CacheProvider>
-            </PageContextProvider>
-        </React.StrictMode>
-    );
-}
Index: nderer/createEmotionCache.ts
===================================================================
--- renderer/createEmotionCache.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,5 +1,0 @@
-import createCache from '@emotion/cache';
-
-export default function createEmotionCache() {
-    return createCache({ key: 'css' });
-}
Index: nderer/types.ts
===================================================================
--- renderer/types.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,9 +1,0 @@
-export type PageProps = Record<string, unknown>;
-
-declare global {
-    namespace Vike {
-        interface PageContext {
-            pageProps?: PageProps;
-        }
-    }
-}
Index: nderer/usePageContext.tsx
===================================================================
--- renderer/usePageContext.tsx	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,32 +1,0 @@
-// renderer/usePageContext.tsx
-import React, { useContext } from 'react';
-
-export type PageContext = {
-    Page: any;
-    pageProps?: any;
-    urlPathname: string;
-    exports: {
-        documentProps?: {
-            title?: string;
-            description?: string;
-        };
-    };
-    session?: any;
-};
-
-const Context = React.createContext<PageContext>(undefined as any);
-
-export function PageContextProvider({
-                                        pageContext,
-                                        children,
-                                    }: {
-    pageContext: PageContext;
-    children: React.ReactNode;
-}) {
-    return <Context.Provider value={pageContext}>{children}</Context.Provider>;
-}
-
-export function usePageContext() {
-    const pageContext = useContext(Context);
-    return pageContext;
-}
Index: server/authjs-handler.ts
===================================================================
--- server/authjs-handler.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/authjs-handler.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -3,92 +3,34 @@
 import type { Session } from "@auth/core/types";
 import { enhance, type UniversalHandler, type UniversalMiddleware } from "@universal-middleware/core";
-import {eq, or} from "drizzle-orm";
-import { db } from "../database/drizzle/db";
-import {adminsTable, usersTable} from "../database/drizzle/schema";
-import bcrypt from "bcrypt";
-import { AuthDrizzleAdapter } from "./drizzle/auth-adapter";
 
 const authjsConfig = {
   basePath: "/api/auth",
   trustHost: true,
-  secret: process.env.AUTH_SECRET,
-  adapter: AuthDrizzleAdapter(),
-  session: {
-    strategy: "jwt",
-  },
+  // TODO: Replace secret {@see https://authjs.dev/reference/core#secret}
+  secret: "MY_SECRET",
   providers: [
+    // TODO: Choose and implement providers
     CredentialsProvider({
       name: "Credentials",
       credentials: {
-        username: { label: "Username", type: "text" },
+        username: { label: "Username", type: "text", placeholder: "jsmith" },
         password: { label: "Password", type: "password" },
       },
-      async authorize(credentials) {
-        const username = typeof credentials?.username === "string" ? credentials.username : null;
-        const password = typeof credentials?.password === "string" ? credentials.password : null;
+      async authorize() {
+        // Add logic here to look up the user from the credentials supplied
+        const user = { id: "1", name: "J Smith", email: "jsmith@example.com" };
 
-        if(!username || !password || typeof username !== 'string' || typeof password !== 'string') { return null; }
-        
-        const trimmedUsername = username.trim();
-
-        const user = await db.query.usersTable.findFirst({
-            where: or(
-                eq(usersTable.username, trimmedUsername),
-                eq(usersTable.email, trimmedUsername)
-            ),
-          });
-
-        if(!user) return null;
-
-        let isPasswordValid = false;
-
-        if (user.passwordHash.startsWith('$2b$') || user.passwordHash.startsWith('$2a$')) {
-            isPasswordValid = await bcrypt.compare(password, user.passwordHash);
-        } else {
-            isPasswordValid = password === user.passwordHash;
-        }
-
-        if(!isPasswordValid) return null;
-
-          const admin = await db.query.adminsTable.findFirst({
-              where: eq(adminsTable.userId, user.id),
-          });
-
-        return {
-            id: String(user.id),
-            username: user.username,
-            email: user.email,
-            isAdmin: !!admin
-        }
+        // Any object returned will be saved in `user` property of the JWT
+        // If you return null then an error will be displayed advising the user to check their details.
+        // You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter
+        return user ?? null;
       },
     }),
   ],
-
-  callbacks: {
-      async jwt({ token, user }) {
-          if (user) {
-              token.sub = user.id;
-
-              const customUser = user as any;
-              token.username = customUser.username;
-              token.email = customUser.email;
-              token.isAdmin = customUser.isAdmin;
-          }
-          return token;
-      },
-      async session({ session, token }) {
-          if (session.user) {
-              session.user.id = token.sub!;
-              session.user.name = token.username as string;
-
-              const customToken = token as any;
-              session.user.email = customToken.email;
-              session.user.isAdmin = customToken.isAdmin;
-          }
-          return session;
-      },
-  },
 } satisfies Omit<AuthConfig, "raw">;
 
+/**
+ * Retrieve Auth.js session from Request
+ */
 export async function getSession(req: Request, config: Omit<AuthConfig, "raw">): Promise<Session | null> {
   setEnvDefaults(process.env, config);
@@ -107,4 +49,8 @@
 }
 
+/**
+ * Add Auth.js session to context
+ * @link {@see https://authjs.dev/getting-started/session-management/get-session}
+ **/
 export const authjsSessionMiddleware: UniversalMiddleware = enhance(
   async (request, context) => {
@@ -123,9 +69,13 @@
   },
   {
-    name: "pc-forge:authjs-middleware",
+    name: "my-app:authjs-middleware",
     immutable: false,
   },
 );
 
+/**
+ * Auth.js route
+ * @link {@see https://authjs.dev/getting-started/installation}
+ **/
 export const authjsHandler = enhance(
   async (request) => {
@@ -133,5 +83,5 @@
   },
   {
-    name: "pc-forge:authjs-handler",
+    name: "my-app:authjs-handler",
     path: "/api/auth/**",
     method: ["GET", "POST"],
Index: server/db-middleware.ts
===================================================================
--- server/db-middleware.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/db-middleware.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,4 +1,3 @@
-import { db } from "../database/drizzle/db";
-import type { Database } from "../database/drizzle/db";
+import { dbSqlite } from "../database/drizzle/db";
 import { enhance, type UniversalMiddleware } from "@universal-middleware/core";
 
@@ -6,15 +5,21 @@
   namespace Universal {
     interface Context {
-      db: Database;
+      db: ReturnType<typeof dbSqlite>;
     }
   }
 }
+
+// Add `db` to the Context
 export const dbMiddleware: UniversalMiddleware = enhance(
-  async (_request, context) => ({
-    ...context,
-          db,
-  }),
+  async (_request, context, _runtime) => {
+    const db = dbSqlite();
+
+    return {
+      ...context,
+      db: db,
+    };
+  },
   {
-    name: "pc-forge:db-middleware",
+    name: "my-app:db-middleware",
     immutable: false,
   },
Index: rver/drizzle/auth-adapter.ts
===================================================================
--- server/drizzle/auth-adapter.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,64 +1,0 @@
-import type { Adapter } from "@auth/core/adapters";
-import { db } from "../../database/drizzle/db";
-import { usersTable, adminsTable } from "../../database/drizzle/schema";
-import { eq } from "drizzle-orm";
-
-export function AuthDrizzleAdapter(): Adapter {
-    return {
-        async getUser(id) {
-            const userId = parseInt(id);
-            if (isNaN(userId)) return null;
-
-            const user = await db.query.usersTable.findFirst({
-                where: eq(usersTable.id, userId),
-            });
-
-            if (!user) return null;
-
-            const admin = await db.query.adminsTable.findFirst({
-                where: eq(adminsTable.userId, user.id),
-            });
-
-            return {
-                id: String(user.id),
-                email: user.email,
-                name: user.username,
-                emailVerified: null,
-                isAdmin: !!admin,
-            };
-        },
-
-        async getUserByEmail(email) {
-            const user = await db.query.usersTable.findFirst({
-                where: eq(usersTable.email, email),
-            });
-
-            if (!user) return null;
-
-            const admin = await db.query.adminsTable.findFirst({
-                where: eq(adminsTable.userId, user.id),
-            });
-
-            return {
-                id: String(user.id),
-                email: user.email,
-                name: user.username,
-                emailVerified: null,
-                isAdmin: !!admin,
-            };
-        },
-
-        async createUser() { return null as any; },
-        async updateUser() { return null as any; },
-        async deleteUser() {},
-        async getUserByAccount() { return null; },
-        async createSession() { return null as any; },
-        async getSessionAndUser() { return null; },
-        async updateSession() { return null; },
-        async deleteSession() {},
-        async linkAccount() { return null as any; },
-        async unlinkAccount() {},
-        async createVerificationToken() { return null as any; },
-        async useVerificationToken() { return null; },
-    };
-}
Index: server/entry.ts
===================================================================
--- server/entry.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/entry.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -2,5 +2,5 @@
 import { authjsHandler, authjsSessionMiddleware } from "./authjs-handler";
 import { dbMiddleware } from "./db-middleware";
-import telefuncHandler from "./telefunc-handler";
+import { telefuncHandler } from "./telefunc-handler";
 import { apply, serve } from "@photonjs/hono";
 import { Hono } from "hono";
@@ -14,10 +14,14 @@
 
   apply(app, [
+    // Make database available in Context as `context.db`
     dbMiddleware,
 
+    // Append Auth.js session to context
     authjsSessionMiddleware,
 
+    // Auth.js route. See https://authjs.dev/getting-started/installation
     authjsHandler,
 
+    // Telefunc route. See https://telefunc.com
     telefuncHandler,
   ]);
@@ -25,5 +29,4 @@
   return serve(app, {
     port,
-      hostname: '0.0.0.0',
   });
 }
Index: server/telefunc-handler.ts
===================================================================
--- server/telefunc-handler.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/telefunc-handler.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,8 +1,7 @@
-import type { Database } from "../database/drizzle/db";
+import type { dbSqlite } from "../database/drizzle/db";
 import { enhance, type UniversalHandler } from "@universal-middleware/core";
 import { telefunc } from "telefunc";
-import type { Session } from "@auth/core/types";
 
-const telefuncHandler: UniversalHandler = enhance(
+export const telefuncHandler: UniversalHandler = enhance(
   async (request, context, runtime) => {
     const httpResponse = await telefunc({
@@ -11,9 +10,7 @@
       body: await request.text(),
       context: {
-          ...(context as { db: Database; session?: Session | null }),
-          ...runtime,
-          session: (context as { session?: Session | null }).session ?? null,
-          request,
-      }
+        ...(context as { db: ReturnType<typeof dbSqlite> }),
+        ...runtime,
+      },
     });
     const { body, statusCode, contentType } = httpResponse;
@@ -26,5 +23,5 @@
   },
   {
-    name: "pc-forge:telefunc-handler",
+    name: "my-app:telefunc-handler",
     path: `/_telefunc`,
     method: ["GET", "POST"],
@@ -32,3 +29,2 @@
   },
 );
-export default telefuncHandler
Index: rver/telefunc/ctx.ts
===================================================================
--- server/telefunc/ctx.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,42 +1,0 @@
-import { Abort, getContext } from "telefunc";
-import * as drizzleQueries from "../../database/drizzle/queries";
-
-export function ctx() {
-    return getContext();
-}
-
-export function parseSessionUserId(sessionUserId: unknown): number | undefined {
-    if (typeof sessionUserId !== "string" && typeof sessionUserId !== "number") return undefined;
-    const n = Number(sessionUserId);
-    return Number.isInteger(n) && n > 0 ? n : undefined;
-}
-
-export function getAuthState() {
-    const c = ctx();
-    const userId = parseSessionUserId(c.session?.user?.id);
-    return {
-        isLoggedIn: Boolean(userId),
-        userId: userId ?? null,
-        username: c.session?.user?.name ?? null,
-        isAdmin: c.session?.user?.isAdmin,
-        session: c.session,
-    };
-}
-
-export function requireUser() {
-    const c = ctx();
-    const userId = parseSessionUserId(c.session?.user?.id);
-    if (!userId) throw Abort();
-    return { c, userId };
-}
-
-export async function requireAdmin() {
-    const { c, userId } = requireUser();
-
-    if(!c.session?.user?.isAdmin) throw Abort();
-
-    const isAdmin = await drizzleQueries.isAdmin(c.db, userId);
-    if (!isAdmin) throw Abort();
-
-    return { c, userId };
-}
Index: tsconfig.json
===================================================================
--- tsconfig.json	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ tsconfig.json	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -22,8 +22,4 @@
   "exclude": [
     "dist"
-  ],
-  "include": [
-    "./**/*",
-    "./emotion-server.d.ts"
   ]
 }
