From 3cb4ebc2616c30c2f6a59033f08232d8b205052e Mon Sep 17 00:00:00 2001 From: Medicopter117 Date: Thu, 7 May 2026 17:46:19 +0200 Subject: [PATCH] feat: implement full-stack CMS with MariaDB backend, content management dashboard, and media handling --- config/config.yaml | 1 + config/example.env | 2 +- main.py | 6 + mxmariadb/__init__.py | 2 + mxmariadb/cms_db.py | 267 ++ mxmariadb/connector.py | 4 +- package-lock.json | 4219 +++++++++++------ package.json | 4 +- .../cms/cb01ea7ef5d24d3f82a526cf026df293.webp | Bin 0 -> 75382 bytes requirements/req.txt | 2 + scratch/check_db.py | 19 + scratch/migrate_cms.py | 30 + src/api/dashboard/cms_routes.py | 346 ++ src/api/dashboard/routes.py | 10 +- src/api/dashboard/settings_routes.py | 2 +- src/api/dashboard/user_routes.py | 2 +- src/bot/cogs/guild/globalchat.py | 65 +- src/bot/core/database.py | 2 +- src/web/App.tsx | 5 + src/web/components/layout/Navbar.tsx | 1 + src/web/dashboard/CMSChangelogTab.tsx | 103 + src/web/dashboard/CMSMediaTab.tsx | 192 + src/web/dashboard/CMSPage.tsx | 64 + src/web/dashboard/CMSPostEditor.tsx | 397 ++ src/web/dashboard/CMSPostsTab.tsx | 205 + src/web/dashboard/cmsTypes.ts | 61 + src/web/pages/BlogPage.tsx | 348 ++ 27 files changed, 4865 insertions(+), 1494 deletions(-) create mode 100644 mxmariadb/cms_db.py create mode 100644 public/uploads/cms/cb01ea7ef5d24d3f82a526cf026df293.webp create mode 100644 scratch/check_db.py create mode 100644 scratch/migrate_cms.py create mode 100644 src/api/dashboard/cms_routes.py create mode 100644 src/web/dashboard/CMSChangelogTab.tsx create mode 100644 src/web/dashboard/CMSMediaTab.tsx create mode 100644 src/web/dashboard/CMSPage.tsx create mode 100644 src/web/dashboard/CMSPostEditor.tsx create mode 100644 src/web/dashboard/CMSPostsTab.tsx create mode 100644 src/web/dashboard/cmsTypes.ts create mode 100644 src/web/pages/BlogPage.tsx diff --git a/config/config.yaml b/config/config.yaml index 392a288..a3376d2 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -34,6 +34,7 @@ api: port: 8040 log_level: "error" cors_origins: ["*"] + localhost_bypass: true # set on true for localhost testing, on false for production (will need token). # Translation Settings translation: diff --git a/config/example.env b/config/example.env index fad97a0..20e086e 100644 --- a/config/example.env +++ b/config/example.env @@ -21,4 +21,4 @@ DB_HOST=https://database.my-super-discord-bot.com DB_PORT=3306 DB_USER=managerx DB_PASSWORD=abc123 -DB_DATABASE=managerx \ No newline at end of file +DB_NAME=managerx \ No newline at end of file diff --git a/main.py b/main.py index 3ef3eac..55daac0 100644 --- a/main.py +++ b/main.py @@ -21,6 +21,7 @@ from fastapi import FastAPI, Response from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import PlainTextResponse +from fastapi.staticfiles import StaticFiles from uvicorn import Server, Config # Logger (muss existieren!) @@ -91,6 +92,11 @@ app.include_router(dashboard_main_router) app.include_router(router_public) +# CMS Media Uploads als statische Dateien bereitstellen +_uploads_dir = BASEDIR / "public" / "uploads" / "cms" +_uploads_dir.mkdir(parents=True, exist_ok=True) +app.mount("/uploads/cms", StaticFiles(directory=str(_uploads_dir)), name="cms_uploads") + @app.get("/robots.txt", response_class=PlainTextResponse) async def robots(): """Disallow all crawlers for the API.""" diff --git a/mxmariadb/__init__.py b/mxmariadb/__init__.py index 0987c1b..6d9baad 100644 --- a/mxmariadb/__init__.py +++ b/mxmariadb/__init__.py @@ -20,3 +20,5 @@ from .welcome_db import WelcomeDatabase from .profile_db import ProfileDB from .economy_db import EconomyDatabase +from .management_db import ManagementDatabase +from .cms_db import CMSDatabase diff --git a/mxmariadb/cms_db.py b/mxmariadb/cms_db.py new file mode 100644 index 0000000..74abf16 --- /dev/null +++ b/mxmariadb/cms_db.py @@ -0,0 +1,267 @@ +# Copyright (c) 2025 OPPRO.NET Network +import aiomysql +import logging +from mxmariadb.connector import MariaConnector + +logger = logging.getLogger(__name__) + +class CMSDatabase(MariaConnector): + """MariaDB class for the CMS (Dev Blog, Tutorials, Changelog, News, Announcements).""" + + def __init__(self): + super().__init__() + + async def init_db(self): + """Initialize CMS tables.""" + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + # Main posts table + await cur.execute(""" + CREATE TABLE IF NOT EXISTS cms_posts ( + id INT AUTO_INCREMENT PRIMARY KEY, + post_type VARCHAR(20) NOT NULL DEFAULT 'dev', + title VARCHAR(255) NOT NULL, + slug VARCHAR(255) UNIQUE NOT NULL, + content LONGTEXT NOT NULL, + excerpt TEXT NULL, + cover_image VARCHAR(500) NULL, + author_id BIGINT NOT NULL, + author_name VARCHAR(100), + tags VARCHAR(500), + is_published BOOLEAN DEFAULT FALSE, + scheduled_at TIMESTAMP NULL DEFAULT NULL, + view_count INT DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + INDEX(post_type, is_published), + INDEX(slug) + ) + """) + + # Add new columns to existing table (safe migration) + for col_def in [ + "ALTER TABLE cms_posts ADD COLUMN IF NOT EXISTS excerpt TEXT NULL", + "ALTER TABLE cms_posts ADD COLUMN IF NOT EXISTS cover_image VARCHAR(500) NULL", + "ALTER TABLE cms_posts ADD COLUMN IF NOT EXISTS view_count INT DEFAULT 0", + ]: + try: + await cur.execute(col_def) + except Exception: + pass # Column already exists or unsupported syntax + + # Media/uploads table + await cur.execute(""" + CREATE TABLE IF NOT EXISTS cms_media ( + id INT AUTO_INCREMENT PRIMARY KEY, + filename VARCHAR(255) NOT NULL UNIQUE, + original_name VARCHAR(255) NOT NULL, + mime_type VARCHAR(100) NOT NULL, + size_bytes INT NOT NULL, + uploader_id BIGINT NOT NULL, + uploader_name VARCHAR(100), + uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX(uploader_id) + ) + """) + + # Revision history table + await cur.execute(""" + CREATE TABLE IF NOT EXISTS cms_revisions ( + id INT AUTO_INCREMENT PRIMARY KEY, + post_id INT NOT NULL, + title VARCHAR(255) NOT NULL, + content LONGTEXT NOT NULL, + excerpt TEXT NULL, + cover_image VARCHAR(500) NULL, + tags VARCHAR(500), + changed_by_id BIGINT NOT NULL, + changed_by_name VARCHAR(100), + change_note VARCHAR(255), + changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (post_id) REFERENCES cms_posts(id) ON DELETE CASCADE, + INDEX(post_id) + ) + """) + + await conn.commit() + logger.info("CMS tables initialized in MariaDB") + + # ───────────────────────────────────────── + # POSTS + # ───────────────────────────────────────── + + async def create_post(self, post_type: str, title: str, slug: str, content: str, + author_id: int, author_name: str, tags: str = "", + is_published: bool = False, scheduled_at: str = None, + excerpt: str = None, cover_image: str = None): + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute(""" + INSERT INTO cms_posts + (post_type, title, slug, content, excerpt, cover_image, + author_id, author_name, tags, is_published, scheduled_at) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, (post_type, title, slug, content, excerpt, cover_image, + author_id, author_name, tags, is_published, scheduled_at)) + await conn.commit() + return True + + async def get_posts(self, post_type: str = None, published_only: bool = True): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + query = "SELECT * FROM cms_posts" + conditions = [] + params = [] + + if post_type: + conditions.append("post_type = %s") + params.append(post_type) + + if published_only: + conditions.append("(is_published = TRUE AND (scheduled_at IS NULL OR scheduled_at <= CURRENT_TIMESTAMP))") + + if conditions: + query += " WHERE " + " AND ".join(conditions) + + query += " ORDER BY created_at DESC" + + await cur.execute(query, tuple(params)) + return await cur.fetchall() + + async def get_post_by_slug(self, slug: str): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute("SELECT * FROM cms_posts WHERE slug = %s", (slug,)) + return await cur.fetchone() + + async def get_post_by_id(self, post_id: int): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute("SELECT * FROM cms_posts WHERE id = %s", (post_id,)) + return await cur.fetchone() + + async def increment_view_count(self, post_id: int): + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute("UPDATE cms_posts SET view_count = view_count + 1 WHERE id = %s", (post_id,)) + await conn.commit() + + async def update_post(self, post_id: int, **kwargs): + if not kwargs: + return False + + # Felder die nicht direkt gesetzt werden dürfen + protected = {'id', 'created_at', 'updated_at'} + kwargs = {k: v for k, v in kwargs.items() if k not in protected} + + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + fields = [] + params = [] + for key, value in kwargs.items(): + fields.append(f"{key} = %s") + params.append(value) + + params.append(post_id) + query = f"UPDATE cms_posts SET {', '.join(fields)} WHERE id = %s" + await cur.execute(query, tuple(params)) + await conn.commit() + return True + + async def delete_post(self, post_id: int): + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute("DELETE FROM cms_posts WHERE id = %s", (post_id,)) + await conn.commit() + return True + + # ───────────────────────────────────────── + # REVISIONS + # ───────────────────────────────────────── + + async def save_revision(self, post_id: int, title: str, content: str, + tags: str, cover_image: str, excerpt: str, + changed_by_id: int, changed_by_name: str, + change_note: str = None): + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute(""" + INSERT INTO cms_revisions + (post_id, title, content, excerpt, cover_image, tags, + changed_by_id, changed_by_name, change_note) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) + """, (post_id, title, content, excerpt, cover_image, tags, + changed_by_id, changed_by_name, change_note)) + await conn.commit() + + async def get_revisions(self, post_id: int, limit: int = 20): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute(""" + SELECT id, post_id, title, changed_by_name, change_note, changed_at + FROM cms_revisions + WHERE post_id = %s + ORDER BY changed_at DESC + LIMIT %s + """, (post_id, limit)) + return await cur.fetchall() + + async def get_revision_by_id(self, revision_id: int): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute("SELECT * FROM cms_revisions WHERE id = %s", (revision_id,)) + return await cur.fetchone() + + # ───────────────────────────────────────── + # MEDIA + # ───────────────────────────────────────── + + async def create_media(self, filename: str, original_name: str, mime_type: str, + size_bytes: int, uploader_id: int, uploader_name: str): + async with self.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute(""" + INSERT INTO cms_media + (filename, original_name, mime_type, size_bytes, uploader_id, uploader_name) + VALUES (%s, %s, %s, %s, %s, %s) + """, (filename, original_name, mime_type, size_bytes, uploader_id, uploader_name)) + await conn.commit() + return True + + async def get_media(self, limit: int = 100): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute(""" + SELECT * FROM cms_media ORDER BY uploaded_at DESC LIMIT %s + """, (limit,)) + return await cur.fetchall() + + async def delete_media(self, media_id: int): + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute("SELECT filename FROM cms_media WHERE id = %s", (media_id,)) + row = await cur.fetchone() + async with conn.cursor() as cur: + await cur.execute("DELETE FROM cms_media WHERE id = %s", (media_id,)) + await conn.commit() + return row["filename"] if row else None + + # ───────────────────────────────────────── + # CHANGELOG + # ───────────────────────────────────────── + + async def get_changelog(self, limit: int = 50): + """Get published changelog entries, sorted by date.""" + async with self.pool.acquire() as conn: + async with conn.cursor(aiomysql.DictCursor) as cur: + await cur.execute(""" + SELECT id, title, slug, excerpt, content, tags, author_name, + cover_image, created_at, updated_at + FROM cms_posts + WHERE post_type = 'changelog' + AND is_published = TRUE + AND (scheduled_at IS NULL OR scheduled_at <= CURRENT_TIMESTAMP) + ORDER BY created_at DESC + LIMIT %s + """, (limit,)) + return await cur.fetchall() diff --git a/mxmariadb/connector.py b/mxmariadb/connector.py index 06434d4..f5d2d21 100644 --- a/mxmariadb/connector.py +++ b/mxmariadb/connector.py @@ -6,7 +6,9 @@ from dotenv import load_dotenv from pathlib import Path -env_path = Path(__file__).parent.parent / 'config' / '.env' +env_path = (Path(__file__).parent.parent / 'config' / '.env').resolve() +if not env_path.exists(): + print(f"[CRITICAL] .env file not found at {env_path}") load_dotenv(dotenv_path=env_path) logger = logging.getLogger(__name__) diff --git a/package-lock.json b/package-lock.json index 10b41fb..459bb76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vite_react_shadcn_ts", - "version": "0.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vite_react_shadcn_ts", - "version": "0.0.0", + "version": "2.0.0", "dependencies": { "@hookform/resolvers": "5.2.2", "@radix-ui/react-accordion": "1.2.12", @@ -51,9 +51,10 @@ "react-dom": "19.2.4", "react-helmet-async": "3.0.0", "react-hook-form": "7.71.2", + "react-markdown": "^10.1.0", "react-resizable-panels": "4.7.2", "react-router-dom": "7.13.1", - "recharts": "3.8.0", + "remark-gfm": "^4.0.1", "sonner": "2.0.7", "tailwind-merge": "3.5.0", "tailwindcss-animate": "1.0.7", @@ -69,7 +70,7 @@ "@types/node": "24.12.0", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react-swc": "4.3.0", + "@vitejs/plugin-react-swc": "4.2.3", "autoprefixer": "10.4.27", "eslint": "10.0.3", "eslint-plugin-react-hooks": "7.0.1", @@ -80,8 +81,8 @@ "tailwindcss": "4.2.1", "typescript": "5.9.3", "typescript-eslint": "8.57.0", - "vite": "8.0.0", - "vitest": "4.1.0" + "vite": "7.3.1", + "vitest": "4.0.18" } }, "node_modules/@acemir/cssom": { @@ -587,642 +588,773 @@ "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", "license": "MIT" }, - "node_modules/@emnapi/core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", - "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/runtime": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", - "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", - "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.3", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=18" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", - "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.1.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=18" } }, - "node_modules/@eslint/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", - "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@eslint/object-schema": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", - "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=18" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.1.1", - "levn": "^0.4.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=18" } }, - "node_modules/@exodus/bytes": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.11.0.tgz", - "integrity": "sha512-wO3vd8nsEHdumsXrjGO/v4p6irbg7hy9kvIeR6i2AwylZSk4HJdWgL0FNaVquW1+AweJcdvU1IEpuIWk/WaPnA==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@hookform/resolvers": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", - "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } }, - "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==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@oxc-project/runtime": { - "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", - "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@oxc-project/types": { - "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", - "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "license": "MIT", + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "license": "MIT", + "node_modules/@eslint/config-helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", + "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@eslint/core": "^1.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/json-schema": "^7.0.15" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "eslint": "^10.0.0" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "eslint": { "optional": true } } }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", - "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", - "license": "MIT", + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "node_modules/@exodus/bytes": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.11.0.tgz", + "integrity": "sha512-wO3vd8nsEHdumsXrjGO/v4p6irbg7hy9kvIeR6i2AwylZSk4HJdWgL0FNaVquW1+AweJcdvU1IEpuIWk/WaPnA==", + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/hashes": "^1.8.0 || ^2.0.0" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "@noble/hashes": { "optional": true } } }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "react-hook-form": "^7.55.0" } }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -1239,14 +1371,16 @@ } } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", "license": "MIT", "dependencies": { + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, @@ -1265,7 +1399,7 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", @@ -1283,48 +1417,59 @@ } } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", + "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", @@ -1341,26 +1486,17 @@ } } }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", + "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1377,14 +1513,11 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -1395,22 +1528,261 @@ } } }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dismissable-layer": { + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", @@ -2599,63 +2971,31 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, - "node_modules/@reduxjs/toolkit": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", - "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^11.0.0", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz", - "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", "cpu": [ "arm64" ], @@ -2663,16 +3003,27 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", + "cpu": [ + "arm64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", "cpu": [ "x64" ], @@ -2681,15 +3032,26 @@ "optional": true, "os": [ "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", + "cpu": [ + "arm64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", "cpu": [ "x64" ], @@ -2698,15 +3060,26 @@ "optional": true, "os": [ "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", + "cpu": [ + "arm" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", - "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", "cpu": [ "arm" ], @@ -2715,15 +3088,26 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", + "cpu": [ + "arm64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", "cpu": [ "arm64" ], @@ -2732,32 +3116,54 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", + "cpu": [ + "loong64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", - "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", "cpu": [ - "arm64" + "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", + "cpu": [ + "ppc64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", "cpu": [ "ppc64" ], @@ -2766,32 +3172,54 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", + "cpu": [ + "riscv64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", "cpu": [ - "s390x" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", + "cpu": [ + "s390x" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", "cpu": [ "x64" ], @@ -2800,15 +3228,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", - "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", "cpu": [ "x64" ], @@ -2817,15 +3242,26 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", + "cpu": [ + "x64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", "cpu": [ "arm64" ], @@ -2834,49 +3270,40 @@ "optional": true, "os": [ "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", - "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", "cpu": [ - "wasm32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } + "os": [ + "win32" + ] }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", "cpu": [ - "arm64" + "ia32" ], "dev": true, "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-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", "cpu": [ "x64" ], @@ -2885,22 +3312,27 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + ] }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", - "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, "license": "MIT" }, "node_modules/@standard-schema/utils": { @@ -3566,17 +3998,6 @@ } } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -3588,69 +4009,15 @@ "assertion-error": "^2.0.1" } }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", "dependencies": { - "@types/d3-path": "*" + "@types/ms": "*" } }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -3669,9 +4036,26 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3679,6 +4063,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.12.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", @@ -3709,10 +4108,10 @@ "@types/react": "^19.2.0" } }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -3945,35 +4344,41 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, "node_modules/@vitejs/plugin-react-swc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.3.0.tgz", - "integrity": "sha512-mOkXCII839dHyAt/gpoSlm28JIVDwhZ6tnG6wJxUy2bmOx7UaPjvOyIDf3SFv5s7Eo7HVaq6kRcu6YMEzt5Z7w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.3.tgz", + "integrity": "sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.7", + "@rolldown/pluginutils": "1.0.0-rc.2", "@swc/core": "^1.15.11" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4 || ^5 || ^6 || ^7 || ^8" + "vite": "^4 || ^5 || ^6 || ^7" } }, "node_modules/@vitest/expect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", - "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.1.0", + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", - "chai": "^6.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, "funding": { @@ -3981,13 +4386,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", - "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.0", + "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -3996,7 +4401,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -4008,9 +4413,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", - "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -4021,13 +4426,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", - "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.0", + "@vitest/utils": "4.0.18", "pathe": "^2.0.3" }, "funding": { @@ -4035,14 +4440,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", - "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -4051,9 +4455,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", - "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -4061,14 +4465,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", - "convert-source-map": "^2.0.0", + "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" }, "funding": { @@ -4194,6 +4597,16 @@ "postcss": "^8.1.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.9.15", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", @@ -4292,6 +4705,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -4302,16 +4725,56 @@ "node": ">=18" } }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { - "url": "https://polar.sh/cva" + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" } }, "node_modules/clsx": { @@ -4339,6 +4802,16 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4441,127 +4914,6 @@ "dev": true, "license": "MIT" }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -4596,7 +4948,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4617,11 +4968,18 @@ "dev": true, "license": "MIT" }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/deep-is": { "version": "0.1.4", @@ -4634,7 +4992,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4656,6 +5013,19 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -4726,21 +5096,53 @@ } }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "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==", "dev": true, "license": "MIT" }, - "node_modules/es-toolkit": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", - "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } }, "node_modules/escalade": { "version": "3.2.0", @@ -4937,6 +5339,16 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -4957,12 +5369,6 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -4973,6 +5379,12 @@ "node": ">=12.0.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5171,6 +5583,46 @@ "dev": true, "license": "ISC" }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -5201,6 +5653,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -5239,16 +5701,6 @@ "node": ">= 4" } }, - "node_modules/immer": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", - "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5269,6 +5721,12 @@ "node": ">=8" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, "node_modules/input-otp": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", @@ -5279,15 +5737,6 @@ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5297,6 +5746,40 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5320,6 +5803,28 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -5730,62 +6235,927 @@ "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "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==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "micromark-util-types": "^2.0.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.577.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", - "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "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==", - "dev": true, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true, - "license": "CC0-1.0" + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, "node_modules/min-indent": { "version": "1.0.1", @@ -5832,7 +7202,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5939,6 +7308,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", @@ -6059,6 +7453,16 @@ "node": ">= 0.8.0" } }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6148,27 +7552,31 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", "license": "MIT", "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" } }, "node_modules/react-remove-scroll": { @@ -6288,36 +7696,6 @@ } } }, - "node_modules/recharts": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.0.tgz", - "integrity": "sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ==", - "license": "MIT", - "workspaces": [ - "www" - ], - "dependencies": { - "@reduxjs/toolkit": "^1.9.0 || 2.x.x", - "clsx": "^2.1.1", - "decimal.js-light": "^2.5.1", - "es-toolkit": "^1.39.3", - "eventemitter3": "^5.0.1", - "immer": "^10.1.1", - "react-redux": "8.x.x || 9.x.x", - "reselect": "5.1.1", - "tiny-invariant": "^1.3.3", - "use-sync-external-store": "^1.2.2", - "victory-vendor": "^37.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -6332,19 +7710,70 @@ "node": ">=8" } }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/require-from-string": { @@ -6357,52 +7786,50 @@ "node": ">=0.10.0" } }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "license": "MIT" - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", - "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "node_modules/rollup": { + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.115.0", - "@rolldown/pluginutils": "1.0.0-rc.9" + "@types/estree": "1.0.8" }, "bin": { - "rolldown": "bin/cli.mjs" + "rollup": "dist/bin/rollup" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.9", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", - "@rolldown/binding-darwin-x64": "1.0.0-rc.9", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" - } - }, - "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", - "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", - "dev": true, - "license": "MIT" + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", + "fsevents": "~2.3.2" + } }, "node_modules/saxes": { "version": "6.0.0", @@ -6498,6 +7925,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -6506,12 +7943,26 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -6525,6 +7976,24 @@ "node": ">=8" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -6572,12 +8041,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -6613,9 +8076,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -6668,6 +8131,26 @@ "node": ">=20" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -6731,30 +8214,117 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.21.0.tgz", + "integrity": "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/undici": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.21.0.tgz", - "integrity": "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==", - "dev": true, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", - "engines": { - "node": ">=20.18.1" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": 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", @@ -6868,40 +8438,46 @@ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/victory-vendor": { - "version": "37.3.6", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", - "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/vite": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", - "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/runtime": "0.115.0", - "lightningcss": "^1.32.0", + "esbuild": "^0.27.0", + "fdir": "^6.5.0", "picomatch": "^4.0.3", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.9", + "postcss": "^8.5.6", + "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "bin": { @@ -6918,10 +8494,9 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.0.0-alpha.31", - "esbuild": "^0.27.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", @@ -6934,18 +8509,15 @@ "@types/node": { "optional": true }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, "jiti": { "optional": true }, "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -6969,293 +8541,32 @@ } } }, - "node_modules/vite/node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/vite/node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/vitest": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", - "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.0", - "@vitest/mocker": "4.1.0", - "@vitest/pretty-format": "4.1.0", - "@vitest/runner": "4.1.0", - "@vitest/snapshot": "4.1.0", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", + "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -7271,13 +8582,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.0", - "@vitest/browser-preview": "4.1.0", - "@vitest/browser-webdriverio": "4.1.0", - "@vitest/ui": "4.1.0", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "jsdom": "*" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -7306,9 +8616,6 @@ }, "jsdom": { "optional": true - }, - "vite": { - "optional": false } } }, @@ -7461,6 +8768,16 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index bbc78d9..bf1263d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vite_react_shadcn_ts", "private": true, - "version": "2.0.0", + "version": "2.1.0", "type": "module", "scripts": { "dev": "vite", @@ -56,8 +56,10 @@ "react-dom": "19.2.4", "react-helmet-async": "3.0.0", "react-hook-form": "7.71.2", + "react-markdown": "^10.1.0", "react-resizable-panels": "4.7.2", "react-router-dom": "7.13.1", + "remark-gfm": "^4.0.1", "sonner": "2.0.7", "tailwind-merge": "3.5.0", "tailwindcss-animate": "1.0.7", diff --git a/public/uploads/cms/cb01ea7ef5d24d3f82a526cf026df293.webp b/public/uploads/cms/cb01ea7ef5d24d3f82a526cf026df293.webp new file mode 100644 index 0000000000000000000000000000000000000000..9bbdbf516988f067f1f012284a827f4f8c820987 GIT binary patch literal 75382 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 Mgd1VV0kHr809=ae=Kufz literal 0 HcmV?d00001 diff --git a/requirements/req.txt b/requirements/req.txt index 4bc0048..22363d3 100644 --- a/requirements/req.txt +++ b/requirements/req.txt @@ -12,6 +12,7 @@ starlette>=0.52.1 PyJWT>=2.10.1 # --- Async & Performance --- +aiofiles>=23.2.1 aiocache>=0.12.3 aiohappyeyeballs>=2.6.1 aiohttp>=3.13.3 @@ -44,6 +45,7 @@ certifi>=2026.2.25 charset-normalizer>=3.4.5 idna>=3.11 rfc3986>=1.5.0 +python-multipart>=0.0.27 # --- UI, Imaging & Logging --- beautifulsoup4>=4.14.3 diff --git a/scratch/check_db.py b/scratch/check_db.py new file mode 100644 index 0000000..3e00a01 --- /dev/null +++ b/scratch/check_db.py @@ -0,0 +1,19 @@ +import asyncio +import sys +import os +sys.path.append(os.getcwd()) +from mxmariadb import CMSDatabase + +async def check(): + db = CMSDatabase() + await db.ensure_connection() + async with db.pool.acquire() as conn: + async with conn.cursor() as cur: + await cur.execute("DESCRIBE cms_posts") + cols = await cur.fetchall() + for col in cols: + print(col) + await db.close() + +if __name__ == "__main__": + asyncio.run(check()) diff --git a/scratch/migrate_cms.py b/scratch/migrate_cms.py new file mode 100644 index 0000000..ed8366b --- /dev/null +++ b/scratch/migrate_cms.py @@ -0,0 +1,30 @@ +import asyncio +import sys +import os + +# Pfad hinzufügen, damit mxmariadb gefunden wird +sys.path.append(os.getcwd()) + +from mxmariadb import CMSDatabase + +async def update(): + db = CMSDatabase() + try: + await db.ensure_connection() + async with db.pool.acquire() as conn: + async with conn.cursor() as cur: + # Prüfen ob Spalte existiert (MariaDB 10.5+ unterstützt ADD COLUMN IF NOT EXISTS) + try: + await cur.execute("ALTER TABLE cms_posts ADD COLUMN scheduled_at TIMESTAMP NULL DEFAULT NULL AFTER is_published") + print("Spalte 'scheduled_at' hinzugefügt.") + except Exception as e: + if "Duplicate column name" in str(e): + print("Spalte existiert bereits.") + else: + print(f"Fehler beim Hinzufügen: {e}") + await conn.commit() + finally: + await db.close() + +if __name__ == "__main__": + asyncio.run(update()) diff --git a/src/api/dashboard/cms_routes.py b/src/api/dashboard/cms_routes.py new file mode 100644 index 0000000..1fc1c0b --- /dev/null +++ b/src/api/dashboard/cms_routes.py @@ -0,0 +1,346 @@ +from fastapi import APIRouter, Request, HTTPException, Depends, UploadFile, File +from fastapi.responses import JSONResponse +from src.api.dashboard.auth_routes import get_current_user +from mxmariadb import CMSDatabase +from src.bot.core.config import BotConfig +import re +import uuid +import os +import aiofiles +from pathlib import Path + +# Upload-Verzeichnis +UPLOAD_DIR = Path(__file__).resolve().parents[3] / "public" / "uploads" / "cms" +UPLOAD_DIR.mkdir(parents=True, exist_ok=True) + +ALLOWED_MIME_TYPES = { + "image/jpeg", "image/png", "image/gif", "image/webp", + "image/svg+xml", "video/mp4", "application/pdf" +} +MAX_FILE_SIZE = 10 * 1024 * 1024 # 10 MB + +router = APIRouter( + prefix="/cms", + tags=["cms"] +) + +# ───────────────────────────────────────── +# HELPERS +# ───────────────────────────────────────── + +def slugify(text: str) -> str: + """Simple slugify function.""" + text = text.lower() + text = re.sub(r'[^\w\s-]', '', text) + text = re.sub(r'[-\s]+', '-', text) + return text.strip('-') + +async def get_maybe_user(request: Request): + """Optional JWT user – returns None if unauthenticated.""" + auth_header = request.headers.get("Authorization") + if not auth_header or not auth_header.startswith("Bearer "): + return None + try: + return get_current_user(request) + except Exception: + return None + +def is_admin(request: Request, user: dict = None) -> bool: + """Check if the requester is a bot owner or CMS admin.""" + bypass_enabled = getattr(BotConfig.api, 'localhost_bypass', False) + client_ip = request.client.host + + if bypass_enabled and client_ip in ["127.0.0.1", "localhost"]: + x_user_id = request.headers.get("X-User-ID") + if x_user_id: + user_id = int(x_user_id) + owners = getattr(BotConfig.security, 'bot_owners', []) + if user_id in owners: + print(f"[DEBUG] CMS Access granted via Localhost Bypass for ID {user_id}") + return True + + if not user: + return False + + user_id = int(user["id"]) + owners = getattr(BotConfig.security, 'bot_owners', []) + cms_admins = getattr(BotConfig, 'cms', {}).get('admins', []) if hasattr(BotConfig, 'cms') else [] + return user_id in owners or user_id in cms_admins + +def get_requester_info(request: Request, user: dict) -> tuple[int, str]: + """Returns (user_id, username) from JWT or fallback header.""" + if user: + return int(user["id"]), user.get("username", "Unknown") + x_user_id = request.headers.get("X-User-ID") + return int(x_user_id) if x_user_id else 0, "Admin" + +async def get_cms_db() -> CMSDatabase: + db = CMSDatabase() + await db.ensure_connection() + return db + +# ───────────────────────────────────────── +# PUBLIC ENDPOINTS +# ───────────────────────────────────────── + +@router.get("/posts") +async def get_public_posts(post_type: str = None, db: CMSDatabase = Depends(get_cms_db)): + """Get all published posts, optionally filtered by type.""" + try: + posts = await db.get_posts(post_type=post_type, published_only=True) + return {"success": True, "data": posts} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/posts/by-slug/{slug}") +async def get_post_by_slug(slug: str, db: CMSDatabase = Depends(get_cms_db)): + """Get a single published post by slug and increment view count.""" + try: + post = await db.get_post_by_slug(slug) + if not post: + raise HTTPException(status_code=404, detail="Post not found") + await db.increment_view_count(post["id"]) + return {"success": True, "data": post} + except HTTPException: + raise + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/changelog") +async def get_public_changelog(limit: int = 50, db: CMSDatabase = Depends(get_cms_db)): + """Public changelog feed.""" + try: + entries = await db.get_changelog(limit=limit) + return {"success": True, "data": entries} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +# ───────────────────────────────────────── +# ADMIN – POSTS +# ───────────────────────────────────────── + +@router.get("/admin/posts") +async def get_admin_posts(request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: list ALL posts (drafts + published).""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + try: + posts = await db.get_posts(published_only=False) + return {"success": True, "data": posts} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.post("/posts") +async def create_post(request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: create a new post. Automatically saves a revision on creation.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + + data = await request.json() + title = data.get("title") + content = data.get("content") + if not title or not content: + raise HTTPException(status_code=400, detail="Title and content are required") + + post_type = data.get("post_type", "dev") + is_published = data.get("is_published", False) + tags = data.get("tags", "") + slug = data.get("slug") or slugify(title) + scheduled_at = data.get("scheduled_at") + excerpt = data.get("excerpt") + cover_image = data.get("cover_image") + + user_id, username = get_requester_info(request, user) + + try: + await db.create_post( + post_type=post_type, title=title, slug=slug, content=content, + author_id=user_id, author_name=username, tags=tags, + is_published=is_published, scheduled_at=scheduled_at, + excerpt=excerpt, cover_image=cover_image + ) + return {"success": True} + except Exception as e: + if "Duplicate entry" in str(e): + raise HTTPException(status_code=400, detail="Slug already exists") + raise HTTPException(status_code=500, detail=str(e)) + +@router.put("/posts/{post_id}") +async def update_post(post_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: update a post and save a revision snapshot.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + + data = await request.json() + user_id, username = get_requester_info(request, user) + + # Save revision BEFORE update (if substantial fields changed) + revision_fields = {"title", "content", "tags", "cover_image", "excerpt"} + if revision_fields & set(data.keys()): + old_post = await db.get_post_by_id(post_id) + if old_post: + try: + await db.save_revision( + post_id=post_id, + title=old_post.get("title", ""), + content=old_post.get("content", ""), + tags=old_post.get("tags", ""), + cover_image=old_post.get("cover_image"), + excerpt=old_post.get("excerpt"), + changed_by_id=user_id, + changed_by_name=username, + change_note=data.get("change_note") + ) + except Exception as rev_err: + print(f"[WARN] Revision save failed: {rev_err}") + + try: + await db.update_post(post_id, **data) + return {"success": True} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.delete("/posts/{post_id}") +async def delete_post(post_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: delete a post (cascades to revisions).""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + try: + await db.delete_post(post_id) + return {"success": True} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +# ───────────────────────────────────────── +# ADMIN – REVISIONS +# ───────────────────────────────────────── + +@router.get("/posts/{post_id}/revisions") +async def get_revisions(post_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: get revision history for a post.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + try: + revisions = await db.get_revisions(post_id) + return {"success": True, "data": revisions} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.get("/revisions/{revision_id}") +async def get_single_revision(revision_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: get full content of a specific revision.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + rev = await db.get_revision_by_id(revision_id) + if not rev: + raise HTTPException(status_code=404, detail="Revision not found") + return {"success": True, "data": rev} + +@router.post("/posts/{post_id}/restore/{revision_id}") +async def restore_revision(post_id: int, revision_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: restore a post to a specific revision.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + + rev = await db.get_revision_by_id(revision_id) + if not rev or rev["post_id"] != post_id: + raise HTTPException(status_code=404, detail="Revision not found for this post") + + user_id, username = get_requester_info(request, user) + + # Save current state as a revision first + old = await db.get_post_by_id(post_id) + if old: + await db.save_revision( + post_id=post_id, + title=old["title"], content=old["content"], + tags=old.get("tags", ""), cover_image=old.get("cover_image"), + excerpt=old.get("excerpt"), + changed_by_id=user_id, changed_by_name=username, + change_note=f"Auto-saved before restoring revision #{revision_id}" + ) + + await db.update_post( + post_id, + title=rev["title"], + content=rev["content"], + tags=rev.get("tags", ""), + cover_image=rev.get("cover_image"), + excerpt=rev.get("excerpt") + ) + return {"success": True, "message": f"Restored to revision #{revision_id}"} + +# ───────────────────────────────────────── +# ADMIN – MEDIA +# ───────────────────────────────────────── + +@router.post("/upload") +async def upload_media( + request: Request, + file: UploadFile = File(...), + user: dict = Depends(get_maybe_user), + db: CMSDatabase = Depends(get_cms_db) +): + """Admin: upload a media file. Returns the public URL.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + + # Validate MIME type + if file.content_type not in ALLOWED_MIME_TYPES: + raise HTTPException(status_code=415, detail=f"Unsupported file type: {file.content_type}") + + # Read file (with size check) + content = await file.read() + if len(content) > MAX_FILE_SIZE: + raise HTTPException(status_code=413, detail="File too large (max 10 MB)") + + # Generate unique filename preserving extension + ext = Path(file.filename).suffix.lower() if file.filename else "" + unique_name = f"{uuid.uuid4().hex}{ext}" + file_path = UPLOAD_DIR / unique_name + + async with aiofiles.open(file_path, "wb") as f: + await f.write(content) + + user_id, username = get_requester_info(request, user) + + await db.create_media( + filename=unique_name, + original_name=file.filename or unique_name, + mime_type=file.content_type, + size_bytes=len(content), + uploader_id=user_id, + uploader_name=username + ) + + public_url = f"/uploads/cms/{unique_name}" + return {"success": True, "url": public_url, "filename": unique_name} + +@router.get("/media") +async def list_media(request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: list all uploaded media files.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + try: + media = await db.get_media() + # Enrich with public URLs + for m in media: + m["url"] = f"/uploads/cms/{m['filename']}" + return {"success": True, "data": media} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@router.delete("/media/{media_id}") +async def delete_media(media_id: int, request: Request, user: dict = Depends(get_maybe_user), db: CMSDatabase = Depends(get_cms_db)): + """Admin: delete a media file from DB and disk.""" + if not is_admin(request, user): + raise HTTPException(status_code=403, detail="Not authorized") + try: + filename = await db.delete_media(media_id) + if filename: + file_path = UPLOAD_DIR / filename + if file_path.exists(): + file_path.unlink() + return {"success": True} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/src/api/dashboard/routes.py b/src/api/dashboard/routes.py index c7c3aaa..5b9b130 100644 --- a/src/api/dashboard/routes.py +++ b/src/api/dashboard/routes.py @@ -12,6 +12,7 @@ from .settings_routes import router as settings_router from .user_routes import router as user_router from .management_routes import router as management_router +from .cms_routes import router as cms_router # Wir erstellen einen Router, den wir später in die Haupt-App einbinden router_public = APIRouter( @@ -81,7 +82,7 @@ async def get_leaderboard(limit: int = 50): """ Fetches the global leaderboard from StatsDB and enriches it with Discord data. """ - from mx_devtools import StatsDB + from mxmariadb import StatsDB if bot_instance is None: raise HTTPException(status_code=503, detail="Bot-Verbindung nicht verfügbar") @@ -120,8 +121,8 @@ async def get_leaderboard(limit: int = 50): @router_public.get("/version") async def get_version(request: Request): return { - "pypi_version": "1.2026.2.26", - "bot_version": "v2.0.0-open-beta" + "pypi_version": "1.2026.5.7", + "bot_version": "v2.1.0-open-beta" } @@ -421,7 +422,7 @@ async def get_mega_data(guild_id: int, user: dict = Depends(get_current_user)): stats = {} # 2. Fetch Settings & Module Status - from mx_devtools import WelcomeDatabase, AntiSpamDatabase, GlobalChatDatabase, LevelDatabase, LoggingDatabase + from mxmariadb import WelcomeDatabase, AntiSpamDatabase, GlobalChatDatabase, LevelDatabase, LoggingDatabase # Check Level System try: @@ -527,5 +528,6 @@ async def get_mega_data(guild_id: int, user: dict = Depends(get_current_user)): dashboard_main_router.include_router(settings_router) dashboard_main_router.include_router(user_router) dashboard_main_router.include_router(management_router) +dashboard_main_router.include_router(cms_router) # dashboard_main_router.include_router(router_public) # Move to main.py for root access diff --git a/src/api/dashboard/settings_routes.py b/src/api/dashboard/settings_routes.py index c89a02c..028ce62 100644 --- a/src/api/dashboard/settings_routes.py +++ b/src/api/dashboard/settings_routes.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Request, HTTPException, Security, status, Depends from src.api.dashboard.auth_routes import get_current_user -from mx_devtools import WelcomeDatabase, AntiSpamDatabase, GlobalChatDatabase, LevelDatabase, LoggingDatabase, AutoDeleteDB, AutoRoleDatabase, TempVCDatabase +from mxmariadb import WelcomeDatabase, AntiSpamDatabase, GlobalChatDatabase, LevelDatabase, LoggingDatabase, AutoDeleteDB, AutoRoleDatabase, TempVCDatabase import discord from datetime import datetime diff --git a/src/api/dashboard/user_routes.py b/src/api/dashboard/user_routes.py index ca14f26..fd252c5 100644 --- a/src/api/dashboard/user_routes.py +++ b/src/api/dashboard/user_routes.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Request, HTTPException, Depends from src.api.dashboard.auth_routes import get_current_user -from mx_devtools import SettingsDB, StatsDB, EconomyDatabase +from mxmariadb import SettingsDB, StatsDB, EconomyDatabase import discord import sqlite3 import os diff --git a/src/bot/cogs/guild/globalchat.py b/src/bot/cogs/guild/globalchat.py index 78e1460..4411be4 100644 --- a/src/bot/cogs/guild/globalchat.py +++ b/src/bot/cogs/guild/globalchat.py @@ -187,7 +187,7 @@ async def create_message_embed(self, message: discord.Message, settings: Dict, a embed = discord.Embed(description=description, color=embed_color, timestamp=message.created_at) author_text, badges = self._build_author_info(message.author) - from mx_devtools import EconomyDatabase + from mxmariadb import EconomyDatabase eco_db = EconomyDatabase() overrides = eco_db.get_equipped_overrides(message.author.id) if 'color' in overrides: @@ -429,39 +429,8 @@ async def _get_all_active_channels(self) -> List[int]: self._cached_channels = await self._fetch_all_channels() return self._cached_channels -class GlobalChatReportView(discord.ui.View): - def __init__(self, message_id: int, author_id: int, guild_id: int): - super().__init__(timeout=None) - self.message_id = message_id - self.author_id = author_id - self.guild_id = guild_id - - @discord.ui.button(label="Melden", style=discord.ButtonStyle.secondary, emoji="🚩", custom_id="gc_report") - async def report_button(self, button: discord.ui.Button, interaction: discord.Interaction): - # Notify staff (owners) - owners = [1093555256689959005, 1427994077332373554] - embed = discord.Embed( - title="⚠️ GlobalChat Meldung", - description=f"Eine Nachricht wurde gemeldet.\n" - f"**Sender ID:** `{self.author_id}`\n" - f"**Nachricht ID:** `{self.message_id}`\n" - f"**Server ID:** `{self.guild_id}`", - color=discord.Color.orange(), - timestamp=discord.utils.utcnow() - ) - embed.set_footer(text=f"Gemeldet von: {interaction.user} ({interaction.user.id})") - - for owner_id in owners: - try: - owner = await interaction.client.fetch_user(owner_id) - await owner.send(embed=embed) - except: pass - - await interaction.response.send_message("✅ Danke! Die Nachricht wurde an das Moderations-Team weitergeleitet.", ephemeral=True) - async def _fetch_all_channels(self) -> List[int]: try: - # ✅ await hinzugefügt return await db.get_all_channels() except Exception as e: logger.error(f"❌ Fehler beim Abrufen aller Channel-IDs: {e}", exc_info=True) @@ -517,6 +486,36 @@ async def _send_to_channel(self, channel_id: int, embed: discord.Embed, attachme logger.error(f"❌ Generischer Fehler im _send_to_channel: {e}", exc_info=True) return False +class GlobalChatReportView(discord.ui.View): + def __init__(self, message_id: int, author_id: int, guild_id: int): + super().__init__(timeout=None) + self.message_id = message_id + self.author_id = author_id + self.guild_id = guild_id + + @discord.ui.button(label="Melden", style=discord.ButtonStyle.secondary, emoji="🚩", custom_id="gc_report") + async def report_button(self, button: discord.ui.Button, interaction: discord.Interaction): + # Notify staff (owners) + owners = [1093555256689959005, 1427994077332373554] + embed = discord.Embed( + title="⚠️ GlobalChat Meldung", + description=f"Eine Nachricht wurde gemeldet.\n" + f"**Sender ID:** `{self.author_id}`\n" + f"**Nachricht ID:** `{self.message_id}`\n" + f"**Server ID:** `{self.guild_id}`", + color=discord.Color.orange(), + timestamp=discord.utils.utcnow() + ) + embed.set_footer(text=f"Gemeldet von: {interaction.user} ({interaction.user.id})") + + for owner_id in owners: + try: + owner = await interaction.client.fetch_user(owner_id) + await owner.send(embed=embed) + except: pass + + await interaction.response.send_message("✅ Danke! Die Nachricht wurde an das Moderations-Team weitergeleitet.", ephemeral=True) + async def send_global_message(self, message: discord.Message, attachment_data: List[Tuple[str, bytes, str]] = None) -> Tuple[int, int]: settings = await db.get_guild_settings(message.guild.id) embed, files_to_upload = await self.embed_builder.create_message_embed(message, settings, attachment_data) @@ -612,7 +611,7 @@ async def on_message(self, message: discord.Message): pass return - from mx_devtools import EconomyDatabase + from mxmariadb import EconomyDatabase eco_db = EconomyDatabase() user_info = eco_db.get_user_economy_info(message.author.id) last_msg_raw = user_info.get('last_message_at') diff --git a/src/bot/core/database.py b/src/bot/core/database.py index eb86ef3..749d711 100644 --- a/src/bot/core/database.py +++ b/src/bot/core/database.py @@ -9,7 +9,7 @@ from logger import logger, Category try: - from mx_devtools import SettingsDB, StatsDB + from mxmariadb import SettingsDB, StatsDB except ImportError as e: logger.critical(Category.DATABASE, f"Database Imports fehlgeschlagen: {e}") SettingsDB = None diff --git a/src/web/App.tsx b/src/web/App.tsx index de29f2d..d2527f6 100644 --- a/src/web/App.tsx +++ b/src/web/App.tsx @@ -23,6 +23,8 @@ const SettingsPage = lazy(() => import("./dashboard/SettingsPage")); const UserSettingsPage = lazy(() => import("./dashboard/UserSettingsPage")); const GuildSelectionPage = lazy(() => import("./dashboard/GuildSelectionPage")); const AuthCallback = lazy(() => import("./pages/AuthCallback")); +const BlogPage = lazy(() => import("./pages/BlogPage")); +const CMSPage = lazy(() => import("./dashboard/CMSPage")); const queryClient = new QueryClient(); @@ -110,6 +112,9 @@ const MainRoutes = () => { } /> } /> } /> + } /> + } /> + } /> } /> } /> } /> diff --git a/src/web/components/layout/Navbar.tsx b/src/web/components/layout/Navbar.tsx index c5b19e7..855c7e7 100644 --- a/src/web/components/layout/Navbar.tsx +++ b/src/web/components/layout/Navbar.tsx @@ -19,6 +19,7 @@ const dropdownLinks = [ { label: "Team", href: "/team", icon: Users }, { label: "Plugins", href: "/plugins", icon: Puzzle }, { label: "Status", href: "/status", icon: Activity }, + { label: "Blog", href: "/blog", icon: Newspaper }, ]; function NavDropdown({ label, links, location }: { label: string, links: any[], location: any }) { diff --git a/src/web/dashboard/CMSChangelogTab.tsx b/src/web/dashboard/CMSChangelogTab.tsx new file mode 100644 index 0000000..6f98e63 --- /dev/null +++ b/src/web/dashboard/CMSChangelogTab.tsx @@ -0,0 +1,103 @@ +import { useState, useEffect } from "react"; +import { BookOpen, Calendar, User as UserIcon, ExternalLink, RefreshCw } from "lucide-react"; +import { toast } from "sonner"; +import { API_URL } from "../lib/api"; +import { useAuth } from "../components/core/AuthProvider"; + +interface ChangelogEntry { + id: number; + title: string; + slug: string; + excerpt: string | null; + author_name: string; + created_at: string; +} + +export default function CMSChangelogTab() { + const { user, token } = useAuth(); + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(true); + + const fetchChangelog = async () => { + setLoading(true); + try { + const res = await fetch(`${API_URL}/dashboard/cms/changelog`, { + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + } + }); + const data = await res.json(); + if (data.success) { + setEntries(data.data); + } + } catch (err) { + toast.error("Fehler beim Laden des Changelogs"); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchChangelog(); + }, [token, user]); + + return ( +
+
+
+

Changelog Vorschau

+

Diese Einträge werden öffentlich im Changelog-Feed angezeigt.

+
+ +
+ + {loading ? ( +
+ ); +} diff --git a/src/web/dashboard/CMSMediaTab.tsx b/src/web/dashboard/CMSMediaTab.tsx new file mode 100644 index 0000000..3421c42 --- /dev/null +++ b/src/web/dashboard/CMSMediaTab.tsx @@ -0,0 +1,192 @@ +import { useState, useEffect } from "react"; +import { Image as ImageIcon, Trash2, Upload, Link, FileText, Film, File as FileIcon, Search } from "lucide-react"; +import { toast } from "sonner"; +import { API_URL } from "../lib/api"; +import { useAuth } from "../components/core/AuthProvider"; +import { cn } from "../lib/utils"; +import { MediaItem } from "./cmsTypes"; + +export default function CMSMediaTab() { + const { user, token } = useAuth(); + const [media, setMedia] = useState([]); + const [loading, setLoading] = useState(true); + const [uploading, setUploading] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + + const fetchMedia = async () => { + try { + const res = await fetch(`${API_URL}/dashboard/cms/media`, { + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + } + }); + const data = await res.json(); + if (data.success) { + setMedia(data.data); + } + } catch (err) { + toast.error("Fehler beim Laden der Medien"); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchMedia(); + }, [token, user]); + + const handleUpload = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + const formData = new FormData(); + formData.append("file", file); + + setUploading(true); + try { + const res = await fetch(`${API_URL}/dashboard/cms/upload`, { + method: "POST", + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + }, + body: formData + }); + const data = await res.json(); + if (data.success) { + toast.success("Datei hochgeladen"); + fetchMedia(); + } else { + toast.error(data.detail || "Upload fehlgeschlagen"); + } + } catch (err) { + toast.error("Upload fehlgeschlagen"); + } finally { + setUploading(false); + } + }; + + const handleDelete = async (id: number) => { + if (!confirm("Datei wirklich löschen?")) return; + try { + const res = await fetch(`${API_URL}/dashboard/cms/media/${id}`, { + method: "DELETE", + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + } + }); + const data = await res.json(); + if (data.success) { + toast.success("Datei gelöscht"); + fetchMedia(); + } + } catch (err) { + toast.error("Fehler beim Löschen"); + } + }; + + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text); + toast.success("URL kopiert!"); + }; + + const getFileIcon = (mime: string) => { + if (mime.startsWith('image/')) return ; + if (mime.startsWith('video/')) return ; + if (mime === 'application/pdf') return ; + return ; + }; + + const filteredMedia = media.filter(m => + m.original_name.toLowerCase().includes(searchQuery.toLowerCase()) || + m.mime_type.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + return ( +
+
+
+

Mediathek

+

Verwalte deine hochgeladenen Bilder und Dateien.

+
+ +
+
+ + setSearchQuery(e.target.value)} + className="w-full bg-white/5 border border-white/10 rounded-xl py-2 pl-9 pr-4 text-xs focus:ring-1 focus:ring-primary outline-none transition-all" + /> +
+ + +
+
+ + {loading ? ( +
+
+
+ ) : filteredMedia.length > 0 ? ( +
+ {filteredMedia.map((item) => ( +
+ {item.mime_type.startsWith('image/') ? ( + {item.original_name} + ) : ( +
+ {getFileIcon(item.mime_type)} + {item.original_name} +
+ )} + +
+

{item.original_name}

+
+ + +
+
+ {(item.size_bytes / 1024 / 1024).toFixed(2)} MB +
+
+
+ ))} +
+ ) : ( +
+ +

Keine Medien gefunden

+
+ )} +
+ ); +} diff --git a/src/web/dashboard/CMSPage.tsx b/src/web/dashboard/CMSPage.tsx new file mode 100644 index 0000000..01b7cef --- /dev/null +++ b/src/web/dashboard/CMSPage.tsx @@ -0,0 +1,64 @@ +import { useState } from "react"; +import { motion } from "framer-motion"; +import { LayoutDashboard, FileText, Image, BookOpen } from "lucide-react"; +import { cn } from "../lib/utils"; +import CMSPostsTab from "./CMSPostsTab"; +import CMSMediaTab from "./CMSMediaTab"; +import CMSChangelogTab from "./CMSChangelogTab"; + +const TABS = [ + { id: "posts", label: "Beiträge", icon: FileText }, + { id: "media", label: "Mediathek", icon: Image }, + { id: "changelog", label: "Changelog", icon: BookOpen }, +] as const; +type Tab = typeof TABS[number]["id"]; + +export default function CMSPage() { + const [tab, setTab] = useState("posts"); + + return ( +
+
+
+
+ + ADMINISTRATION +
+

+ CONTENT MANAGEMENT +

+
+ + {/* Tabs */} +
+ {TABS.map(({ id, label, icon: Icon }) => ( + + ))} +
+ + + {tab === "posts" && } + {tab === "media" && } + {tab === "changelog" && } + +
+
+ ); +} diff --git a/src/web/dashboard/CMSPostEditor.tsx b/src/web/dashboard/CMSPostEditor.tsx new file mode 100644 index 0000000..94aad0c --- /dev/null +++ b/src/web/dashboard/CMSPostEditor.tsx @@ -0,0 +1,397 @@ +import { useState, useEffect } from "react"; +import { X, Save, Globe, Eye, History, Image as ImageIcon, Sparkles, Hash, Clock, FileText } from "lucide-react"; +import { toast } from "sonner"; +import { API_URL } from "../lib/api"; +import { useAuth } from "../components/core/AuthProvider"; +import { cn } from "../lib/utils"; +import { Post, POST_TYPES, slugify, Revision } from "./cmsTypes"; +import ReactMarkdown from "react-markdown"; + +interface CMSPostEditorProps { + post: Partial; + onClose: () => void; + onSave: () => void; +} + +export default function CMSPostEditor({ post: initialPost, onClose, onSave }: CMSPostEditorProps) { + const { user, token } = useAuth(); + const [formData, setFormData] = useState>(initialPost); + const [activeTab, setActiveTab] = useState<'edit' | 'preview' | 'revisions'>('edit'); + const [revisions, setRevisions] = useState([]); + const [saving, setSaving] = useState(false); + const [loadingRevisions, setLoadingRevisions] = useState(false); + + useEffect(() => { + if (initialPost.id) { + fetchRevisions(); + } + }, [initialPost.id]); + + const fetchRevisions = async () => { + if (!initialPost.id) return; + setLoadingRevisions(true); + try { + const res = await fetch(`${API_URL}/dashboard/cms/posts/${initialPost.id}/revisions`, { + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + } + }); + const data = await res.json(); + if (data.success) { + setRevisions(data.data); + } + } catch (err) { + console.error("Failed to fetch revisions"); + } finally { + setLoadingRevisions(false); + } + }; + + const handleTitleChange = (title: string) => { + const updates: Partial = { title }; + if (!initialPost.id || !formData.slug) { + updates.slug = slugify(title); + } + setFormData(prev => ({ ...prev, ...updates })); + }; + + const handleSave = async () => { + if (!formData.title || !formData.content) { + toast.error("Titel und Inhalt sind erforderlich"); + return; + } + + setSaving(true); + try { + const method = initialPost.id ? "PUT" : "POST"; + const url = initialPost.id + ? `${API_URL}/dashboard/cms/posts/${initialPost.id}` + : `${API_URL}/dashboard/cms/posts`; + + const res = await fetch(url, { + method, + headers: { + "Authorization": `Bearer ${token}`, + "Content-Type": "application/json", + "X-User-ID": user?.id || "1427994077332373554" + }, + body: JSON.stringify(formData) + }); + + const data = await res.json(); + if (data.success) { + toast.success(initialPost.id ? "Beitrag aktualisiert" : "Beitrag erstellt"); + onSave(); + } else { + toast.error(data.detail || "Fehler beim Speichern"); + } + } catch (err) { + toast.error("Verbindungsfehler zum Server"); + } finally { + setSaving(false); + } + }; + + const restoreRevision = async (revId: number) => { + if (!confirm("Diesen Stand wirklich wiederherstellen? Aktuelle Änderungen gehen verloren.")) return; + try { + const res = await fetch(`${API_URL}/dashboard/cms/posts/${initialPost.id}/restore/${revId}`, { + method: "POST", + headers: { + "Authorization": `Bearer ${token}`, + "X-User-ID": user?.id || "1427994077332373554" + } + }); + const data = await res.json(); + if (data.success) { + toast.success("Revision wiederhergestellt"); + onSave(); // Reload everything + } + } catch (err) { + toast.error("Fehler beim Wiederherstellen"); + } + }; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

+ {initialPost.id ? "Beitrag bearbeiten" : "Neuer Beitrag"} +

+

+ {formData.post_type} • {formData.title ? "Draft" : "Unbenannt"} +

+
+
+ +
+
+ + + {initialPost.id && ( + + )} +
+ + + +
+
+ + {/* Content */} +
+ {activeTab === 'edit' && ( +
+ {/* Main Fields */} +
+
+ + handleTitleChange(e.target.value)} + placeholder="Einen packenden Titel wählen..." + className="w-full bg-white/5 border border-white/10 rounded-2xl px-6 py-4 text-lg font-bold focus:ring-1 focus:ring-primary outline-none transition-all placeholder:text-white/20 italic" + /> +
+ +
+
+ + Wörter: {formData.content?.split(/\s+/).filter(Boolean).length || 0} +
+