diff --git a/.gitignore b/.gitignore index 68729d6..fe7243c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ +.venv/ +venv/ +__pycache__/ .idea/ -.DS_Store \ No newline at end of file +.DS_Store +*.db +store/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..64513c6 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Ситуация + +На свелте мне нравится что получается что-то, но пока не нравится что получается. +Как будто бы надо будет сделать больбшой рефакторинг, но пока пускай будет хоть что-то. \ No newline at end of file diff --git a/backend/api.py b/backend/api.py new file mode 100644 index 0000000..70282e4 --- /dev/null +++ b/backend/api.py @@ -0,0 +1,70 @@ +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 new file mode 100644 index 0000000..b0b5f0f --- /dev/null +++ b/backend/db.py @@ -0,0 +1,111 @@ +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 new file mode 100644 index 0000000..7b1405b --- /dev/null +++ b/backend/utils.py @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..fd36c15 --- /dev/null +++ b/backend/vntypes.py @@ -0,0 +1,33 @@ + +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 new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..75842c4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,38 @@ +# 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 new file mode 100644 index 0000000..0b2d886 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,19 @@ +{ + "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 new file mode 100644 index 0000000..0d46b78 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1554 @@ +{ + "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 new file mode 100644 index 0000000..39beed7 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,23 @@ +{ + "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 new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/frontend/src/app.d.ts @@ -0,0 +1,13 @@ +// 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 new file mode 100644 index 0000000..f273cc5 --- /dev/null +++ b/frontend/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/www/img/delete.svg b/frontend/src/lib/assets/delete.svg similarity index 100% rename from www/img/delete.svg rename to frontend/src/lib/assets/delete.svg diff --git a/www/img/edit.svg b/frontend/src/lib/assets/edit.svg similarity index 100% rename from www/img/edit.svg rename to frontend/src/lib/assets/edit.svg diff --git a/frontend/src/lib/assets/favicon.svg b/frontend/src/lib/assets/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/frontend/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000..550f0f3 --- /dev/null +++ b/frontend/src/lib/components/add_button.svelte @@ -0,0 +1,79 @@ + + +{#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 new file mode 100644 index 0000000..9169b99 --- /dev/null +++ b/frontend/src/lib/components/calendar.svelte @@ -0,0 +1,188 @@ + + +
+
+ +
+ + +
+ + \ No newline at end of file diff --git a/frontend/src/lib/components/containers/files.svelte b/frontend/src/lib/components/containers/files.svelte new file mode 100644 index 0000000..98a8c03 --- /dev/null +++ b/frontend/src/lib/components/containers/files.svelte @@ -0,0 +1,23 @@ + + +
+ {#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 new file mode 100644 index 0000000..17b1ed1 --- /dev/null +++ b/frontend/src/lib/components/containers/images.svelte @@ -0,0 +1,24 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/frontend/src/lib/components/containers/marks.svelte b/frontend/src/lib/components/containers/marks.svelte new file mode 100644 index 0000000..16c27bb --- /dev/null +++ b/frontend/src/lib/components/containers/marks.svelte @@ -0,0 +1,39 @@ + + +
+

{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 new file mode 100644 index 0000000..f5b7461 --- /dev/null +++ b/frontend/src/lib/components/containers/queue.svelte @@ -0,0 +1,8 @@ + + +
+ + +
\ No newline at end of file diff --git a/frontend/src/lib/components/create_button.svelte b/frontend/src/lib/components/create_button.svelte new file mode 100644 index 0000000..44f051f --- /dev/null +++ b/frontend/src/lib/components/create_button.svelte @@ -0,0 +1,69 @@ + + + +
+ +
+ + \ No newline at end of file diff --git a/frontend/src/lib/components/file.svelte b/frontend/src/lib/components/file.svelte new file mode 100644 index 0000000..ec0c931 --- /dev/null +++ b/frontend/src/lib/components/file.svelte @@ -0,0 +1,67 @@ + + +
+

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

{date}

+

{name}

+ + +
+ + \ No newline at end of file diff --git a/frontend/src/lib/css/global.css b/frontend/src/lib/css/global.css new file mode 100644 index 0000000..f5d1aec --- /dev/null +++ b/frontend/src/lib/css/global.css @@ -0,0 +1,92 @@ +@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 new file mode 100644 index 0000000..ddc0a8d --- /dev/null +++ b/frontend/src/lib/css/themes.css @@ -0,0 +1,53 @@ +@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 new file mode 100644 index 0000000..8276ad9 --- /dev/null +++ b/frontend/src/lib/functions.js @@ -0,0 +1,46 @@ +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 new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/frontend/src/lib/index.js @@ -0,0 +1 @@ +// 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 new file mode 100644 index 0000000..023c796 --- /dev/null +++ b/frontend/src/routes/+layout.svelte @@ -0,0 +1,80 @@ + + + + + + + +
+ +

Обложка

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

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

+ +
+ + + + + +

Скриншоты

+ + + +

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

+ + + +

Файлы

+ + + +

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

+ + +
+ + + + + +{@render children?.()} diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte new file mode 100644 index 0000000..1662510 --- /dev/null +++ b/frontend/src/routes/+page.svelte @@ -0,0 +1,2 @@ + diff --git a/www/font/Inter-Light.woff2 b/frontend/static/font/Inter-Light.woff2 similarity index 100% rename from www/font/Inter-Light.woff2 rename to frontend/static/font/Inter-Light.woff2 diff --git a/frontend/static/robots.txt b/frontend/static/robots.txt new file mode 100644 index 0000000..1f53798 --- /dev/null +++ b/frontend/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js new file mode 100644 index 0000000..10c4eeb --- /dev/null +++ b/frontend/svelte.config.js @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/hmm.txt b/hmm.txt new file mode 100644 index 0000000..59d8ceb --- /dev/null +++ b/hmm.txt @@ -0,0 +1,66 @@ +-- Эта таблица нужна, чтобы когда человек набирает в поле ввода тег или жанр или бадж, +-- ему подсказывало уже существующие теги/жанры/баджи +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 new file mode 100644 index 0000000..3ab5592 --- /dev/null +++ b/test_data.json @@ -0,0 +1,9 @@ +{ + "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 deleted file mode 100644 index a878c78..0000000 --- a/vnshed/types.py +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 9545bf0..0000000 --- a/www/css/calendar.css +++ /dev/null @@ -1,75 +0,0 @@ -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 deleted file mode 100644 index 1da034c..0000000 --- a/www/css/global.css +++ /dev/null @@ -1,195 +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-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 deleted file mode 100644 index f63c4a6..0000000 --- a/www/css/themes.css +++ /dev/null @@ -1,233 +0,0 @@ -@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/www/index.html b/www/index.html deleted file mode 100644 index 4643eb9..0000000 --- a/www/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - Отложка - - - - - - - - - - - - -
-
- -
-

Обложка

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

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

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

Скриншоты

- - - -

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

- - - -

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

-
- - -
-
- - -
- -
- - - - - \ No newline at end of file diff --git a/www/js/calendar.js b/www/js/calendar.js deleted file mode 100644 index d1f6189..0000000 --- a/www/js/calendar.js +++ /dev/null @@ -1,8 +0,0 @@ - -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 deleted file mode 100644 index 5ca1bd3..0000000 --- a/www/js/functions.js +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index c4df95a..0000000 --- a/www/js/index.js +++ /dev/null @@ -1,12 +0,0 @@ - -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 deleted file mode 100644 index 41a898e..0000000 --- a/www/js/types.js +++ /dev/null @@ -1,249 +0,0 @@ -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