diff --git a/.gitignore b/.gitignore index fe7243c..68729d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,2 @@ -.venv/ -venv/ -__pycache__/ .idea/ -.DS_Store -*.db -store/ \ No newline at end of file +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 64513c6..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Ситуация - -На свелте мне нравится что получается что-то, но пока не нравится что получается. -Как будто бы надо будет сделать больбшой рефакторинг, но пока пускай будет хоть что-то. \ No newline at end of file diff --git a/backend/api.py b/backend/api.py deleted file mode 100644 index 70282e4..0000000 --- a/backend/api.py +++ /dev/null @@ -1,70 +0,0 @@ -from typing import Annotated -from fastapi import FastAPI, File, HTTPException -from fastapi.middleware.cors import CORSMiddleware - -from vntypes import * -from utils import * -from db import VNDB - -app = FastAPI() -database = VNDB() - -origins = [ - "http://localhost", - "http://localhost:5173", -] - -app.add_middleware( - CORSMiddleware, - allow_origins=origins, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -@app.get("/api/queue") -def get_post_queue() -> list[FullNovel]: - raise HTTPException(status_code=501, detail="Method is not implemented yet!") - - -@app.get("/api/posts/{post_id}") -def get_post(post_id: int): - raise HTTPException(status_code=501, detail="Method is not implemented yet!") - - -@app.post("/api/posts/{post_id}") -def new_post(novel: FullNovel): - print(novel) - return "yay!" - - -@app.patch("/api/posts/{post_id}") -def edit_post(novel: FullNovel): - print(novel) - return "yay!" - - -@app.post("/api/mark") -def new_mark(mark: Mark): - database.insert_mark(mark.type, mark.value) - return "yay!" - - -@app.post("/api/marks") -def search_marks(query: Mark): - return database.search_mark(query) - - -@app.post("/api/thumb") -async def upload_thumb(thumb: Annotated[bytes, File()], filename: str): - return {"file_size": save_image(thumb, "thumbs", filename)} - - -@app.post("/api/screenshot") -async def upload_screenshot(scrshot: Annotated[bytes, File()], filename: str): - return {"file_size": save_image(scrshot, "screens", filename)} - - -@app.post("/api/file") -async def upload_file(file: Annotated[bytes, File()], filename: str): - return {"file_size": save_file(file, "files", filename)} diff --git a/backend/db.py b/backend/db.py deleted file mode 100644 index b0b5f0f..0000000 --- a/backend/db.py +++ /dev/null @@ -1,111 +0,0 @@ -from datetime import datetime -import sqlite3 -import json - -from utils import asset -from vntypes import * - -class VNDB: - - def __init__(self, db_name=asset('vn_database.db')): - self.__db_name = db_name - with sqlite3.connect(self.__db_name) as connection: - cursor = connection.cursor() - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS marks ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - type TEXT NOT NULL, - value TEXT NOT NULL, - UNIQUE(id, value) - ); - ''') - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS authors ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - title TEXT NOT NULL, - description TEXT NOT NULL, - thumbnail TEXT NOT NULL, - UNIQUE(id, title, description, thumbnail) - ); - ''') - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS novels ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - title TEXT NOT NULL, - author INTEGER NOT NULL, - UNIQUE(id, title, author) - ); - ''') - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS posts_log ( - novel INTEGER NOT NULL, - channel INTEGER NOT NULL, - marks JSON NOT NULL, - title TEXT NOT NULL, - description TEXT NOT NULL, - author INTEGER NOT NULL, - files_on_disk JSON NOT NULL, - post_info JSON, - post_at INTEGER NOT NULL, - created_at INTEGER NOT NULL - ); - ''') - - connection.commit() - - def __execute(self, sql: str, params: tuple = ()): - with sqlite3.connect(self.__db_name) as connection: - connection.cursor().execute(sql, params) - connection.commit() - - def __fetch(self, sql: str, params: tuple = ()): - with sqlite3.connect(self.__db_name) as connection: - cursor = connection.cursor() - cursor.execute(sql, params) - return cursor.fetchall() - - def search_author(self, title: str): - return self.__fetch("SELECT * FROM authors " - "WHERE title LIKE ?", (title,)) - - def search_mark(self, mark: Mark): - return self.__fetch("SELECT * FROM marks " - "WHERE value LIKE ? " - "AND type = ?", ('%'+mark.value+'%',mark.type)) - - def search_novel(self, title: str): - return self.__fetch("SELECT * FROM novels " - "WHERE title LIKE ? ", (title,)) - - def insert_author(self, title: str, desc: str, thumb: str): - self.__execute("INSERT INTO authors (title, description, thumbnail) " - "VALUES (?, ?, ?)", (title, desc, thumb)) - - def insert_mark(self, type: str, value: str): - self.__execute("INSERT INTO marks (type, value) " - "VALUES (?, ?)", (type, value)) - - def insert_novel(self, novel: Novel): - self.__execute("INSERT INTO novels (title, author) " - f"SELECT {novel.title}, {novel.author_id} " - f"WHERE NOT EXISTS(SELECT 1 FROM novels WHERE title = {novel.title} AND author = {novel.author_id});") - - # FIXME: SQL Types - def insert_post(self, full_novel: FullNovel): - self.insert_novel(full_novel.data) - self.__execute("INSERT INTO posts_log (novel, channel, marks, title, description, author, files_on_disk, post_at, created_at) " - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", - (self.search_novel(full_novel.data.title)[0], - full_novel.data.tg_channel, - json.dumps(full_novel.data.marks), - full_novel.data.title, - full_novel.data.description, - full_novel.data.author_id, - json.dumps(full_novel.files), - full_novel.data.post_at, - datetime.now())) - diff --git a/backend/utils.py b/backend/utils.py deleted file mode 100644 index 7b1405b..0000000 --- a/backend/utils.py +++ /dev/null @@ -1,34 +0,0 @@ -from PIL import Image, UnidentifiedImageError -from fastapi import HTTPException -from pathlib import Path -import io - -def asset(path: str) -> Path: - return Path("store", path) - - -def image_normalize(img: bytes) -> bytes: - try: - byte_arr = io.BytesIO() - img = Image.open(io.BytesIO(img)) - img.save(byte_arr, format='WEBP') - return byte_arr.getvalue() - except UnidentifiedImageError: - raise HTTPException(status_code=500, detail="Image file cannot be readed!") - - -def save_image(img: bytes, dir: str, name: str) -> int: - path = asset(dir) - path.mkdir(exist_ok=True) - img = image_normalize(img) - with open(Path(path, name+'.jpg'), "wb") as file: - file.write(img) - return len(img) - - -def save_file(file_b: bytes, dir: str, name: str) -> int: - path = asset(dir) - path.mkdir(exist_ok=True) - with open(Path(path, name+'.jpg'), "wb") as file: - file.write(file_b) - return len(file_b) \ No newline at end of file diff --git a/backend/vntypes.py b/backend/vntypes.py deleted file mode 100644 index fd36c15..0000000 --- a/backend/vntypes.py +++ /dev/null @@ -1,33 +0,0 @@ - -from pydantic import BaseModel -from datetime import datetime -from typing import Literal - -class Mark(BaseModel): - type: Literal["tag", "badge", "genre"] - value: str - -class NovelFile(BaseModel): - filename: str - platform: Literal["android", "ios", "windows", "linux", "macos"] - -class Novel(BaseModel): - title: str - description: str - author_id: int - - vndb: int | None = None - hours_to_read: int - - marks: list[Mark] - - tg_channel: int # maybe not here - tg_post: str | None = None #url::Url - post_at: datetime | None = None - -class FullNovel(BaseModel): - data: Novel - - #upload_queue: list[str] - files: list[NovelFile] - screenshots: list[str] diff --git a/frontend/.gitignore b/frontend/.gitignore deleted file mode 100644 index 3b462cb..0000000 --- a/frontend/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -node_modules - -# Output -.output -.vercel -.netlify -.wrangler -/.svelte-kit -/build - -# OS -.DS_Store -Thumbs.db - -# Env -.env -.env.* -!.env.example -!.env.test - -# Vite -vite.config.js.timestamp-* -vite.config.ts.timestamp-* diff --git a/frontend/.npmrc b/frontend/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/frontend/README.md b/frontend/README.md deleted file mode 100644 index 75842c4..0000000 --- a/frontend/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# sv - -Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). - -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! - -```sh -# create a new project in the current directory -npx sv create - -# create a new project in my-app -npx sv create my-app -``` - -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```sh -npm run dev - -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` - -## Building - -To create a production version of your app: - -```sh -npm run build -``` - -You can preview the production build with `npm run preview`. - -> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json deleted file mode 100644 index 0b2d886..0000000 --- a/frontend/jsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "moduleResolution": "bundler" - } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in -} diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index 0d46b78..0000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,1554 +0,0 @@ -{ - "name": "vnshed", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "vnshed", - "version": "0.0.1", - "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", - "vite": "^7.0.4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "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==", - "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/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", - "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.0.tgz", - "integrity": "sha512-shOuLI5D2s+0zTv2ab5M5PqfknXqWbKi+0UwB9yLTRIdzsK1R93JOO8jNhIYSHdW+IYXIYnLniu+JZqXs7h9Wg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.39.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.39.1.tgz", - "integrity": "sha512-NdgBGHcf/3tXYzPRyQuvsmjI5d3Qp6uhgmlN3uurhyEMN0hMFhdUG83zmWBH8u/QXj6VBmPrKvUn0QXf+Q3/lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/cookie": "^0.6.0", - "acorn": "^8.14.1", - "cookie": "^0.6.0", - "devalue": "^5.3.2", - "esm-env": "^1.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - } - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.0.tgz", - "integrity": "sha512-nJsV36+o7rZUDlrnSduMNl11+RoDE1cKqOI0yUEBCcqFoAZOk47TwD3dPKS2WmRutke9StXnzsPBslY7prDM9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "debug": "^4.4.1", - "deepmerge": "^4.3.1", - "magic-string": "^0.30.17", - "vitefu": "^1.1.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", - "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", - "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", - "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svelte": { - "version": "5.38.10", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.38.10.tgz", - "integrity": "sha512-UY+OhrWK7WI22bCZ00P/M3HtyWgwJPi9IxSRkoAE2MeAy6kl7ZlZWJZ8RaB+X4KD/G+wjis+cGVnVYaoqbzBqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "esm-env": "^1.2.1", - "esrap": "^2.1.0", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.1.tgz", - "integrity": "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/vite": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", - "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index 39beed7..0000000 --- a/frontend/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "vnshed", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" - }, - "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", - "vite": "^7.0.4" - } -} diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts deleted file mode 100644 index da08e6d..0000000 --- a/frontend/src/app.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// See https://svelte.dev/docs/kit/types#app.d.ts -// for information about these interfaces -declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface PageState {} - // interface Platform {} - } -} - -export {}; diff --git a/frontend/src/app.html b/frontend/src/app.html deleted file mode 100644 index f273cc5..0000000 --- a/frontend/src/app.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - %sveltekit.head% - - -
%sveltekit.body%
- - diff --git a/frontend/src/lib/assets/favicon.svg b/frontend/src/lib/assets/favicon.svg deleted file mode 100644 index cc5dc66..0000000 --- a/frontend/src/lib/assets/favicon.svg +++ /dev/null @@ -1 +0,0 @@ -svelte-logo \ No newline at end of file diff --git a/frontend/src/lib/components/add_button.svelte b/frontend/src/lib/components/add_button.svelte deleted file mode 100644 index 550f0f3..0000000 --- a/frontend/src/lib/components/add_button.svelte +++ /dev/null @@ -1,79 +0,0 @@ - - -{#if type == "button"} - -{:else if type == "image"} - - -{:else} - - -{/if} - - \ No newline at end of file diff --git a/frontend/src/lib/components/calendar.svelte b/frontend/src/lib/components/calendar.svelte deleted file mode 100644 index 434202c..0000000 --- a/frontend/src/lib/components/calendar.svelte +++ /dev/null @@ -1,255 +0,0 @@ - - -
-
- -
- - -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/containers/files.svelte b/frontend/src/lib/components/containers/files.svelte deleted file mode 100644 index 98a8c03..0000000 --- a/frontend/src/lib/components/containers/files.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - -
- {#each files as file} - - {/each} - -
\ No newline at end of file diff --git a/frontend/src/lib/components/containers/images.svelte b/frontend/src/lib/components/containers/images.svelte deleted file mode 100644 index 17b1ed1..0000000 --- a/frontend/src/lib/components/containers/images.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - -
- -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/containers/marks.svelte b/frontend/src/lib/components/containers/marks.svelte deleted file mode 100644 index 16c27bb..0000000 --- a/frontend/src/lib/components/containers/marks.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - -
-

{label}

- - {#each items as item} - - {/each} - { - items.push(""); - value = items; - }} /> - -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/containers/queue.svelte b/frontend/src/lib/components/containers/queue.svelte deleted file mode 100644 index f5b7461..0000000 --- a/frontend/src/lib/components/containers/queue.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - -
- - -
\ No newline at end of file diff --git a/frontend/src/lib/components/create_button.svelte b/frontend/src/lib/components/create_button.svelte deleted file mode 100644 index 44f051f..0000000 --- a/frontend/src/lib/components/create_button.svelte +++ /dev/null @@ -1,69 +0,0 @@ - - - -
- -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/file.svelte b/frontend/src/lib/components/file.svelte deleted file mode 100644 index ec0c931..0000000 --- a/frontend/src/lib/components/file.svelte +++ /dev/null @@ -1,67 +0,0 @@ - - -
-

{data.name}

-

{size_str(data.size)}

-
- - \ No newline at end of file diff --git a/frontend/src/lib/components/image.svelte b/frontend/src/lib/components/image.svelte deleted file mode 100644 index b1fd568..0000000 --- a/frontend/src/lib/components/image.svelte +++ /dev/null @@ -1,52 +0,0 @@ - - -
- - -
- - diff --git a/frontend/src/lib/components/img_button.svelte b/frontend/src/lib/components/img_button.svelte deleted file mode 100644 index 14dcd9c..0000000 --- a/frontend/src/lib/components/img_button.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - -
- {name} -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/mark.svelte b/frontend/src/lib/components/mark.svelte deleted file mode 100644 index 164e881..0000000 --- a/frontend/src/lib/components/mark.svelte +++ /dev/null @@ -1,94 +0,0 @@ - - -
- - {#if compl_data} - - {/if} -
- - \ No newline at end of file diff --git a/frontend/src/lib/components/queue_item.svelte b/frontend/src/lib/components/queue_item.svelte deleted file mode 100644 index 17a8ec7..0000000 --- a/frontend/src/lib/components/queue_item.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - -
-

{date}

-

{name}

- - -
- - \ No newline at end of file diff --git a/frontend/src/lib/css/global.css b/frontend/src/lib/css/global.css deleted file mode 100644 index f5d1aec..0000000 --- a/frontend/src/lib/css/global.css +++ /dev/null @@ -1,92 +0,0 @@ -@font-face { - font-family: 'Inter'; - src: url('/font/Inter-Light.woff2') format('woff2'); - font-weight: normal; - font-style: normal; - font-display: swap; -} - -/* Шрифт для всей страницы */ -* { - font-family: Inter; - font-size: large; -} - -body { - margin: 0; -} - -button { - border: 0; -} - -/* Все элементы для ввода данных (input, textarea, собственные) */ -.input { - border: 0; - resize: none; - padding: 0.5rem; -} - -/* Круглый элемент */ -.round { - border-radius: 100%; - overflow: hidden; -} - -/* Закруглённый элемент */ -.rounded { - border-radius: 0.75rem; - overflow: hidden; -} - -/* Поле с обложкой */ -.cover { - padding: 2rem; - text-align: center; - align-content: center; -} - -/* Поле с заполняемыми полями */ -.fields { - height: fit-content; - display: flex; - flex-direction: column; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - padding: 1rem; - padding-bottom: 5rem; -} - -/* Отступ между полями */ -.fields .input { - margin: 0; - margin-bottom: 1rem; -} - -.fields p { - margin: 0; - margin-bottom: 1rem; - margin-left: 0.25rem; -} - -.horisontal-bar { - display: flex; - align-content: center; - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.horisontal-bar p { - margin: 0; - margin-right: 0.5rem; - align-content: center; - margin-bottom: 1rem; -} - -/* Текст с троеточием в конце */ -.ellipsis { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} \ No newline at end of file diff --git a/frontend/src/lib/css/themes.css b/frontend/src/lib/css/themes.css deleted file mode 100644 index ddc0a8d..0000000 --- a/frontend/src/lib/css/themes.css +++ /dev/null @@ -1,53 +0,0 @@ -@media (prefers-color-scheme: light) { - body { - background-color: #EFEFF3; - } - - p { - color: black; - } - - .input { - background-color: #F4F4F4; - color: black; - } - - .input::placeholder { - color: black; - } - - .cover .img-div { - background-color: white; - } - - .fields { - background-color: white; - } -} - -@media (prefers-color-scheme: dark) { - body { - background-color: #0F1011; - } - - p { - color: white; - } - - .input { - background-color: #192431; - color: white; - } - - .input::placeholder { - color: white; - } - - .cover .img-div { - background-color: #131A22; - } - - .fields { - background-color: #131A22; - } -} \ No newline at end of file diff --git a/frontend/src/lib/functions.js b/frontend/src/lib/functions.js deleted file mode 100644 index 8276ad9..0000000 --- a/frontend/src/lib/functions.js +++ /dev/null @@ -1,46 +0,0 @@ -export function makeid(length) { - var result = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - var charactersLength = characters.length; - for ( var i = 0; i < length; i++ ) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} - -// const imageTypes = { -// types: [ -// { -// description: "Images", -// accept: { -// "image/*": [".png", ".gif", ".jpeg", ".jpg"], -// }, -// }, -// ], -// excludeAcceptAllOption: true, -// multiple: false, -// }; - -// let fileHandle; -// export async function loadImage() { -// [fileHandle] = await window.showOpenFilePicker(imageTypes); -// return fileHandle; -// } - -// export function addImage(initiator, target) { -// loadImage().then(async (result) => { -// let img = document.createElement("img"); -// img.src = URL.createObjectURL(await result.getFile()); -// document.getElementById(target).appendChild(img); -// initiator = document.getElementById(initiator); -// if (initiator) initiator.remove(); -// //document.getElementById(target).addEventListener("click", addImage("", target)); -// }); -// } - -// export function json_filter(key,value) -// { -// if (key=="html") return undefined; -// //else if (key=="id") return undefined; -// else return value; -// } \ No newline at end of file diff --git a/frontend/src/lib/index.js b/frontend/src/lib/index.js deleted file mode 100644 index 856f2b6..0000000 --- a/frontend/src/lib/index.js +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte deleted file mode 100644 index 023c796..0000000 --- a/frontend/src/routes/+layout.svelte +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -
- -

Обложка

-
- -
- - - - - - - -
-

Время на чтение

- -
- - - - - -

Скриншоты

- - - -

Дата публикации

- - - -

Файлы

- - - -

Очередь публикации

- - -
- - - - - -{@render children?.()} diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte deleted file mode 100644 index 1662510..0000000 --- a/frontend/src/routes/+page.svelte +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/frontend/static/robots.txt b/frontend/static/robots.txt deleted file mode 100644 index 1f53798..0000000 --- a/frontend/static/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js deleted file mode 100644 index 10c4eeb..0000000 --- a/frontend/svelte.config.js +++ /dev/null @@ -1,13 +0,0 @@ -import adapter from '@sveltejs/adapter-auto'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter() - } -}; - -export default config; diff --git a/frontend/vite.config.js b/frontend/vite.config.js deleted file mode 100644 index bbf8c7d..0000000 --- a/frontend/vite.config.js +++ /dev/null @@ -1,6 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; - -export default defineConfig({ - plugins: [sveltekit()] -}); diff --git a/hmm.txt b/hmm.txt deleted file mode 100644 index 59d8ceb..0000000 --- a/hmm.txt +++ /dev/null @@ -1,66 +0,0 @@ --- Эта таблица нужна, чтобы когда человек набирает в поле ввода тег или жанр или бадж, --- ему подсказывало уже существующие теги/жанры/баджи -CREATE TABLE IF NOT EXISTS mark ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - -- "genre" or "tag" or "badge" - tag TEXT NOT NULL, - -- value, "romance", "Хохлы", as an example - value TEXT NOT NULL -); - --- Таблица с авторами, для того же - чтобы подсказывало существующего автора. -CREATE TABLE IF NOT EXISTS authors ( - -- ID автора, для кросс-референсов. - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - -- Имя автора. - title TEXT NOT NULL, - -- Описание автора. - description TEXT NOT NULL, - -- Путь к файлу обложки автора. - thumbnail TEXT NOT NULL -); - --- Сами новеллы. Нужно, поскольку несколько постов могут отсылаться к одной игре. -CREATE TABLE IF NOT EXISTS novels ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - -- Название. Используется исключительно для поиска. - title TEXT NOT NULL, - author INTEGER NOT NULL -); - --- Таблица с **постами**. -CREATE TABLE IF NOT EXISTS posts_log ( - -- Кросс-референс на id в novels. - novel INTEGER NOT NULL, - - -- ID канала, в который пост будет запощен. - channel INTEGER NOT NULL, - - -- массив idшников на записи в marks. - marks JSON NOT NULL, - - -- Название внки. - title TEXT NOT NULL, - - -- Описание ВНки. - description TEXT NOT NULL, - - -- id автора на момент планирования поста. - author INTEGER NOT NULL, - - -- Мапа, ключ - путь к файлу в фс, значение - - -- `{"post": , "description": "описание файла"}` - -- - ссылка на пост в соответствующем канале с файлами, может - -- быть null. Не должно быть null, если post_info != NULL (то есть если уже запостили). - files_on_disk JSON NOT NULL, - - -- не NULL, если пост успешно запостили. - -- {"link": <ссылка на пост>} - post_info JSON, - - -- Когда ВН должна быть запощена, second-precise unix timestamp. - post_at INTEGER NOT NULL, - - -- Когда запись в бд была создана, second-precise unix timestamp. - created_at INTEGER NOT NULL -); diff --git a/test_data.json b/test_data.json deleted file mode 100644 index 3ab5592..0000000 --- a/test_data.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Higurashi no Naku Koro ni. Console-exclusive Arcs (Когда плачут цикады. Эксклюзивные главы)", - "description": "Эксклюзивные главы для консольных версий \"Higurashi no Naku Koro ni\". Главы рекомендуется читать после ознакомления с оригинальными главами.\n\nUPD: На данный момент переведены: Taraimawashi, Tsukiotoshi, Hajisarashi, Miotsukushi и Материалы полиции\n\nОписание глав:\n\nTaraimawashi - Альтернативная первая глава, на первый взгляд — это дополнение к арке \"Вопросов\", пересказ Onikakushi-hen. Тем не менее, эта глава на самом деле содержит события Watanagashi-hen.\nУзнав секреты Хинамидзавы, Кейти решает игнорировать всё и наслаждаться мирной школьной жизнью.\nTsukiotoshi - Оригинальная консольная глава, которая является развилкой для третьей главы \"Tatarigoroshi\".\nДядя Сатоко приезжает в Хинамидзаву, и Кейти решает найти союзников, чтобы помочь Сатоко. Возможно, \"худший\" из миров, где на кубиках выпали одни \"единицы.\"\nHajisarashi - одним жарким днём Рика и её друзья идут в бассейн.\nMiotsukushi - альтернативная концовка всей оригинальной серии.\nМатериалы полиции - краткие истории по длине равных TIPS, которые немного раскрывают Оиши и Акасаку..[/i]", - "hours_to_read": 50, - "genres": [ "Драма", "Хоррор", "Детектив", "Мистика", "Повседневность" ], - "tags": [ "Иностранный разработчик", "Несколько главных героев" ], - "badges": [ "Лучшее" ], - "post_at": "2024-04-13T08:30:00Z" -} \ No newline at end of file diff --git a/vnshed/types.py b/vnshed/types.py new file mode 100644 index 0000000..a878c78 --- /dev/null +++ b/vnshed/types.py @@ -0,0 +1,21 @@ +from datetime import datetime + +class Novel: + title: str + description: str + + vndb: int + hours_to_read: int + + tags: list[str] + genres: list[str] + + tg_post: str #url::Url + post_at: datetime + +class FullNovel: + data: Novel + + upload_queue: list[str] + files: list[str] + screenshots: list[str] \ No newline at end of file diff --git a/www/css/calendar.css b/www/css/calendar.css new file mode 100644 index 0000000..9545bf0 --- /dev/null +++ b/www/css/calendar.css @@ -0,0 +1,75 @@ +ul {list-style-type: none;} + +.calendar * { + margin: 0; +} + +.month { + width: 100%; + text-align: center; + align-content: center; +} + +.month ul { + margin: 0; + padding: 0.5rem; +} + +.month ul li { + display: inline; + text-transform: uppercase; + letter-spacing: 3px; +} + +.month .prev { + float: inline-start; + cursor: pointer; +} + +.month .next { + float: inline-end; + cursor: pointer; +} + +.weekdays { + padding: 10px 0 0 0; +} + +.weekdays li { + display: inline-block; + width: 13.6%; + text-align: center; +} + +.days { + padding: 10px 0; + margin: 0; +} + +.days li { + list-style-type: none; + display: inline-block; + width: 13.6%; + text-align: center; + margin-bottom: 5px; + font-size: smaller; + cursor: pointer; +} + +.days li .active { + padding: 5px; + border-radius: 30%; +} + +@media screen and (max-width: 720px) { + .weekdays li, .days li {width: 13.1%;} +} + +@media screen and (max-width: 420px) { + .weekdays li, .days li {width: 12.5%;} + .days li .active {padding: 2px;} +} + +@media screen and (max-width: 290px) { + .weekdays li, .days li {width: 12.2%;} +} \ No newline at end of file diff --git a/www/css/global.css b/www/css/global.css new file mode 100644 index 0000000..1da034c --- /dev/null +++ b/www/css/global.css @@ -0,0 +1,195 @@ +@font-face { + font-family: 'Inter'; + src: url('../font/Inter-Light.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Lobster'; + src: url('../font/Lobster-Regular.ttf') format('ttf'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +/* Шрифт для всей страницы */ +* { + font-family: Inter; + font-size: large; +} + +body { + margin: 0; +} + +button { + border: 0; +} + +/* Все элементы для ввода данных (input, textarea, собственные) */ +.input { + border: 0; + resize: none; + padding: 0.5rem; +} + +/* Круглый элемент */ +.round { + border-radius: 100%; + overflow: hidden; +} + +/* Закруглённый элемент */ +.rounded { + border-radius: 0.75rem; + overflow: hidden; +} + +/* Вертикальное изображение */ +.vertical { + aspect-ratio: 11 / 16; +} + +/* Горизонтальное изображение */ +.horisontal { + aspect-ratio: 16 / 11; +} + +.image { + margin-left: auto; + margin-right: auto; + align-content: center; + text-align: center; + width: 11rem; +} + +/* Кнопка "плюс" */ +.plus { + font-family: Arial, Helvetica, sans-serif; + aspect-ratio: 1 / 1; + height: 32px; + font-size: x-large; + cursor: pointer; +} + +/* Кнопка "плюс" на изображении должна быть больше */ +.image .plus { + height: 48px; +} + +/* Поле с обложкой */ +.cover { + padding: 2rem; + text-align: center; + align-content: center; +} + +/* Поле с кнопкой "Создать" */ +.create { + width: 100%; + position: fixed; + bottom: 0; + text-align: center; + display: flex; + flex-direction: column; +} + +.create button { + margin: 0.5rem; + padding: 1rem; + cursor: pointer; +} + +/* Поле с заполняемыми полями */ +.fields { + width: 100%; + height: fit-content; + display: flex; + flex-direction: column; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + padding-bottom: 5rem; +} + +/* Отступ между полями */ +.fields * { + margin: 1rem; + margin-bottom: 0; +} + +/* Вертикальный список */ +.horisontal-bar { + display: flex; + overflow-x: scroll; + align-content: center; + padding: 0.5rem; +} + +.horisontal-bar * { + margin: 0; + margin-right: 0.5rem; + align-content: center; +} + +/* Элемент вертикального списка (тег, бадж, жанр) */ +.horisontal-item { + padding: 0.25rem; + cursor: pointer; +} + +/* Элемент в очереди */ +.queue-item { + margin: 0; + padding: 0; +} + +.queue-item + .queue-item { + margin-top: 0.5rem; +} + +.queue-item p { + margin: 0.5rem; +} + +/* Текст с троеточием в конце */ +.ellipsis { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Кнопка с изображением */ +.imgbutton { + height: 100%; + display: flex; + flex-direction: column; + margin: 0; + align-content: center; + text-align: center; + font-size: small; + padding: 0.5rem; +} + +.imgbutton * { + margin: 0; +} + +.imgbutton img { + margin-left: auto; + margin-right: auto; + width: 2rem; +} + +/* Кнопка "Удалить" */ +.remove { + cursor: pointer; +} + +/* Кнопка "Изменить" */ +.edit { + cursor: pointer; + margin-left: auto; +} \ No newline at end of file diff --git a/www/css/themes.css b/www/css/themes.css new file mode 100644 index 0000000..f63c4a6 --- /dev/null +++ b/www/css/themes.css @@ -0,0 +1,233 @@ +@media (prefers-color-scheme: light) { + body { + background-color: #EFEFF3; + } + + p { + color: black; + } + + .input { + background-color: #F4F4F4; + color: black; + } + + .input::placeholder { + color: black; + } + + .plus { + background-color: #5C8DC0; + color: white; + } + + .plus:hover { + background-color: #567aa1; + } + + .horisontal-item { + background-color: #5C8DC0; + color: white; + } + + .horisontal-item:hover { + background-color: #567aa1; + } + + .cover .image { + background-color: white; + } + + .create { + background-color: #D9D9D9; + } + + .create button { + background-color: #3CAA36; + color: white; + } + + .create button:hover { + background-color: #3b8d37; + color: white; + } + + .fields { + background-color: white; + } + + .queue-item { + background-color: #5C8DC0; + color: white; + } + + .queue-item p { + color: white; + } + + .imgbutton { + color: white; + } + + .month { + background: #5C8DC0; + } + + .month ul li { + color: white; + } + + .weekdays { + background-color: #F4F4F4; + } + + .weekdays li { + color: black; + } + + .days { + background: #F4F4F4; + } + + .days li { + color: black; + } + + .days li .active { + color: white !important; + background: #5C8DC0; + } + + .remove { + background-color: #FC1F1C; + } + + .remove:hover { + background-color: #d32522; + } + + .edit { + background-color: #1BC304; + } + + .edit:hover { + background-color: #1c9d0b; + } +} + +@media (prefers-color-scheme: dark) { + body { + background-color: #0F1011; + } + + p { + color: white; + } + + .input { + background-color: #192431; + color: white; + } + + .input::placeholder { + color: white; + } + + .plus { + background-color: #2791FF; + color: white; + } + + .plus:hover { + background-color: #2c7dd4; + } + + .horisontal-item { + background-color: #2791FF; + color: white; + } + + .horisontal-item:hover { + background-color: #2c7dd4; + } + + .cover .image { + background-color: #131A22; + } + + .create { + background-color: #192431; + } + + .create button { + background-color: #3CAA36; + color: white; + } + + .create button:hover { + background-color: #3b8d37; + color: white; + } + + .fields { + background-color: #131A22; + } + + .queue-item { + background-color: #2791FF; + color: white; + } + + .queue-item p { + color: white; + } + + .imgbutton { + color: white; + } + + .month { + background: #2791FF; + } + + .month ul li { + color: white; + } + + .weekdays { + background-color: #192431; + } + + .weekdays li { + color: white; + } + + .days { + background: #192431; + } + + .days li { + color: white; + } + + .days li .active { + color: white !important; + background: #2791FF; + } + + .remove { + background-color: #FC1F1C; + } + + .remove:hover { + background-color: #d32522; + } + + .edit { + background-color: #1BC304; + } + + .edit:hover { + background-color: #1c9d0b; + } +} \ No newline at end of file diff --git a/frontend/static/font/Inter-Light.woff2 b/www/font/Inter-Light.woff2 similarity index 100% rename from frontend/static/font/Inter-Light.woff2 rename to www/font/Inter-Light.woff2 diff --git a/frontend/src/lib/assets/delete.svg b/www/img/delete.svg similarity index 100% rename from frontend/src/lib/assets/delete.svg rename to www/img/delete.svg diff --git a/frontend/src/lib/assets/edit.svg b/www/img/edit.svg similarity index 100% rename from frontend/src/lib/assets/edit.svg rename to www/img/edit.svg diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..4643eb9 --- /dev/null +++ b/www/index.html @@ -0,0 +1,95 @@ + + + Отложка + + + + + + + + + + + + +
+
+ +
+

Обложка

+
+ +
+ + + + + + + +
+

Время на чтение

+ +
+ + + + + + + + + + + +

Скриншоты

+ + + +

Дата публикации

+ + + +

Очередь публикации

+
+ + +
+
+ + +
+ +
+ + + + + \ No newline at end of file diff --git a/www/js/calendar.js b/www/js/calendar.js new file mode 100644 index 0000000..d1f6189 --- /dev/null +++ b/www/js/calendar.js @@ -0,0 +1,8 @@ + +document.getElementById("cal-prev").addEventListener("click", (event) => { + console.log("cal-prev"); +}) + +document.getElementById("cal-next").addEventListener("click", (event) => { + console.log("cal-next"); +}) \ No newline at end of file diff --git a/www/js/functions.js b/www/js/functions.js new file mode 100644 index 0000000..5ca1bd3 --- /dev/null +++ b/www/js/functions.js @@ -0,0 +1,46 @@ +function makeid(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for ( var i = 0; i < length; i++ ) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +const imageTypes = { + types: [ + { + description: "Images", + accept: { + "image/*": [".png", ".gif", ".jpeg", ".jpg"], + }, + }, + ], + excludeAcceptAllOption: true, + multiple: false, +}; + +let fileHandle; +async function loadImage() { + [fileHandle] = await window.showOpenFilePicker(imageTypes); + return fileHandle; +} + +function addImage(initiator, target) { + loadImage().then(async (result) => { + let img = document.createElement("img"); + img.src = URL.createObjectURL(await result.getFile()); + document.getElementById(target).appendChild(img); + initiator = document.getElementById(initiator); + if (initiator) initiator.remove(); + //document.getElementById(target).addEventListener("click", addImage("", target)); + }); +} + +function json_filter(key,value) +{ + if (key=="html") return undefined; + //else if (key=="id") return undefined; + else return value; +} \ No newline at end of file diff --git a/www/js/index.js b/www/js/index.js new file mode 100644 index 0000000..c4df95a --- /dev/null +++ b/www/js/index.js @@ -0,0 +1,12 @@ + +document.getElementById("cover-plus").addEventListener("click", (event) => { + addImage("cover-plus", "cover-div"); +}) + +// document.getElementById("screen-plus").addEventListener("click", (event) => { +// addImage("screen-plus", "scr-1"); +// }) + +document.getElementById("create").addEventListener("click", (event) => { + console.log("create"); +}) \ No newline at end of file diff --git a/www/js/types.js b/www/js/types.js new file mode 100644 index 0000000..41a898e --- /dev/null +++ b/www/js/types.js @@ -0,0 +1,249 @@ +class AddButton { + + id = ""; + html = undefined; + + constructor() { + this.html = document.createElement('button'); + this.html.classList.add("plus"); + this.html.classList.add("round"); + this.html.appendChild(document.createTextNode("+")); + this.id = makeid(8); + this.html.id = this.id; + } + + addHadler(func) { + this.html.addEventListener("click", func); + return this; + } + +} + +class HorisontalItem { + + id = undefined; + html = undefined; + text = undefined; + + constructor(text) { + this.text = text; + this.html = document.createElement('div'); + this.html.classList.add("horisontal-item"); + this.html.classList.add("rounded"); + this.html.appendChild(document.createTextNode(text)); + this.id = makeid(8); + this.html.id = this.id; + this.html.addEventListener("click", this.remove); + } + + remove() { + document.getElementById(this.id).remove(); + } +} + +class HorisontalBar { + + html = undefined; + plus_id = undefined; + elements = []; + + constructor(text, id) { + this.html = document.createElement('div'); + this.html.classList.add("horisontal-bar"); + this.html.classList.add("input"); + this.html.classList.add("rounded"); + let label = document.createElement('p'); + label.appendChild(document.createTextNode(text)) + this.html.appendChild(label); + const plus = new AddButton().addHadler( + () => this.append(new HorisontalItem('test')) + ); + this.html.appendChild(plus.html); + this.plus_id = plus.id; + } + + append(elem) { + this.elements.push(elem); + this.html.insertBefore(elem.html, document.getElementById(this.plus_id)); + return this; + } + + json() { + return JSON.stringify(this.elements, json_filter); + } +} + +class HorisontalImage { + + id = undefined; + html = undefined; + + constructor() { + this.html = document.createElement('div'); + this.html.classList.add("horisontal"); + this.html.classList.add("image"); + this.html.classList.add("input"); + this.html.classList.add("rounded"); + this.id = makeid(8); + this.html.id = this.id; + + let plus = new AddButton(); + plus.addHadler(() => { + addImage(plus.id, this.id); + document.getElementById("screenshots").appendChild(new HorisontalImage().html); + }); + this.html.appendChild(plus.html); + } + + remove() { + document.getElementById(this.id).remove(); + } +} + +class HorisontalImageBar { + + html = undefined; + first_id = undefined; + elements = []; + + constructor(id) { + this.html = document.createElement('div'); + this.html.classList.add("horisontal-bar"); + const first = new HorisontalImage(); + this.html.appendChild(first.html); + this.first_id = first.id; + } + + append(elem) { + this.elements.push(elem); + this.html.insertBefore(elem.html, document.getElementById(this.first_id)); + return this; + } + + json() { + return JSON.stringify(this.elements, json_filter); + } +} + +class ImgButton { + + html = undefined; + id = undefined; + + constructor(name, img) { + this.html = document.createElement('div'); + this.html.classList.add("imgbutton"); + this.id = makeid(8); + this.html.id = this.id; + + let btn_img = document.createElement('img'); + btn_img.src = img; + btn_img.innerHTML = name; + this.html.appendChild(btn_img); + } + + addHadler(func) { + this.html.addEventListener("click", func); + return this; + } + + setCssClass(name) { + this.html.classList.add(name); + } + +} + +class QueueItem { + + html = undefined; + id = undefined; + + constructor(date, name) { + this.html = document.createElement('div'); + this.html.classList.add("queue-item"); + this.html.classList.add("horisontal-bar"); + this.html.classList.add("rounded"); + this.id = makeid(8); + this.html.id = this.id; + + var date_p = document.createElement('p'); + date_p.innerHTML = date; + this.html.appendChild(date_p); + + var text = document.createElement('p'); + text.classList.add("ellipsis"); + text.innerHTML = name; + this.html.appendChild(text); + + let edit_btn = new ImgButton("Изменить", "./img/edit.svg"); + edit_btn.setCssClass("edit"); + this.html.appendChild(edit_btn.html); + let rem_btn = new ImgButton("Удалить", "./img/delete.svg"); + rem_btn.setCssClass("remove"); + this.html.appendChild(rem_btn.html); + } + +} + +class Calendar { + + html = undefined; + id = undefined; + + constructor() { + this.html = document.createElement('div'); + this.html.classList.add("calendar"); + this.html.classList.add("rounded"); + this.id = makeid(8); + this.html.id = this.id; + + // Calendar Header + let month = document.createElement('div'); + month.classList.add("month"); + let m_header = document.createElement('ul'); + let prev_btn = document.createElement('li'); + prev_btn.classList.add("prev"); + prev_btn.id = this.id + "-prev"; + prev_btn.innerHTML = "❮"; + m_header.appendChild(prev_btn); + let next_btn = document.createElement('li'); + next_btn.classList.add("next"); + next_btn.id = this.id + "-next"; + next_btn.innerHTML = "❯"; + m_header.appendChild(next_btn); + let month_text = document.createElement('li'); + month_text.innerHTML = "Август 2025"; + m_header.appendChild(month_text); + month.appendChild(m_header); + this.html.appendChild(month); + + // Week header + let weekdays = document.createElement('ul'); + weekdays.classList.add("weekdays"); + const days = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]; + for (const day of days) { + let day_li = document.createElement('li'); + day_li.innerHTML = day; + weekdays.appendChild(day_li); + } + this.html.appendChild(weekdays); + + let day_table = document.createElement('ul'); + day_table.classList.add("days"); + const current = 10; + for (const day of [...Array(31).keys()]) { + let day_li = document.createElement('li'); + if (day+1 == current) { + let day_sp = document.createElement('span'); + day_sp.classList.add("active"); + day_sp.innerHTML = day+1; + day_li.appendChild(day_sp); + } else { + day_li.innerHTML = day+1; + } + day_table.appendChild(day_li); + } + this.html.appendChild(day_table); + } + +} \ No newline at end of file